--- /dev/null
+ module MDyn
+!-----------------------------------------------------------------------------
+ use io_units
+ use names
+ use math
+ use md_calc
+ use geometry_data
+ use io_base
+ use geometry
+ use energy
+ use MD_data
+ use REMD
+
+ implicit none
+!-----------------------------------------------------------------------------
+! common.MD
+! common /mdgrad/ in module.energy
+! common /back_constr/ in module.energy
+! common /qmeas/ in module.energy
+! common /mdpar/
+! common /MDcalc/
+! common /lagrange/
+ real(kind=8),dimension(:),allocatable :: d_t_work,&
+ d_t_work_new,d_af_work,d_as_work,kinetic_force !(MAXRES6)
+ real(kind=8),dimension(:,:),allocatable :: d_t_new,&
+ d_a_old,d_a_short!,d_a !(3,0:MAXRES2)
+! real(kind=8),dimension(:),allocatable :: d_a_work !(6*MAXRES)
+! real(kind=8),dimension(:,:),allocatable :: Gmat,Ginv,A,&
+! Gsqrp,Gsqrm,Gvec !(maxres2,maxres2)
+! real(kind=8),dimension(:),allocatable :: Geigen !(maxres2)
+! integer :: dimen,dimen1,dimen3
+! integer :: lang,count_reset_moment,count_reset_vel
+! logical :: reset_moment,reset_vel,rattle,RESPA
+! common /inertia/
+! common /langevin/
+! real(kind=8) :: rwat,etawat,stdfp,cPoise
+! real(kind=8),dimension(:),allocatable :: gamsc !(ntyp1)
+! real(kind=8),dimension(:),allocatable :: stdfsc !(ntyp)
+ real(kind=8),dimension(:),allocatable :: stdforcp,stdforcsc !(MAXRES)
+!-----------------------------------------------------------------------------
+! 'sizes.i'
+!
+!
+! ###################################################
+! ## COPYRIGHT (C) 1992 by Jay William Ponder ##
+! ## All Rights Reserved ##
+! ###################################################
+!
+! #############################################################
+! ## ##
+! ## sizes.i -- parameter values to set array dimensions ##
+! ## ##
+! #############################################################
+!
+!
+! "sizes.i" sets values for critical array dimensions used
+! throughout the software; these parameters will fix the size
+! of the largest systems that can be handled; values too large
+! for the computer's memory and/or swap space to accomodate
+! will result in poor performance or outright failure
+!
+! parameter: maximum allowed number of:
+!
+! maxatm atoms in the molecular system
+! maxval atoms directly bonded to an atom
+! maxgrp ! user-defined groups of atoms
+! maxtyp force field atom type definitions
+! maxclass force field atom class definitions
+! maxkey lines in the keyword file
+! maxrot bonds for torsional rotation
+! maxvar optimization variables (vector storage)
+! maxopt optimization variables (matrix storage)
+! maxhess off-diagonal Hessian elements
+! maxlight sites for method of lights neighbors
+! maxvib vibrational frequencies
+! maxgeo distance geometry points
+! maxcell unit cells in replicated crystal
+! maxring 3-, 4-, or 5-membered rings
+! maxfix geometric restraints
+! maxbio biopolymer atom definitions
+! maxres residues in the macromolecule
+! maxamino amino acid residue types
+! maxnuc nucleic acid residue types
+! maxbnd covalent bonds in molecular system
+! maxang bond angles in molecular system
+! maxtors torsional angles in molecular system
+! maxpi atoms in conjugated pisystem
+! maxpib covalent bonds involving pisystem
+! maxpit torsional angles involving pisystem
+!
+!
+!el integer maxatm,maxval,maxgrp
+!el integer maxtyp,maxclass,maxkey
+!el integer maxrot,maxopt
+!el integer maxhess,maxlight,maxvib
+!el integer maxgeo,maxcell,maxring
+!el integer maxfix,maxbio
+!el integer maxamino,maxnuc,maxbnd
+!el integer maxang,maxtors,maxpi
+!el integer maxpib,maxpit
+ integer :: maxatm !=2*nres !maxres2 maxres2=2*maxres
+ integer,parameter :: maxval=8
+ integer,parameter :: maxgrp=1000
+ integer,parameter :: maxtyp=3000
+ integer,parameter :: maxclass=500
+ integer,parameter :: maxkey=10000
+ integer,parameter :: maxrot=1000
+ integer,parameter :: maxopt=1000
+ integer,parameter :: maxhess=1000000
+ integer :: maxlight !=8*maxatm
+ integer,parameter :: maxvib=1000
+ integer,parameter :: maxgeo=1000
+ integer,parameter :: maxcell=10000
+ integer,parameter :: maxring=10000
+ integer,parameter :: maxfix=10000
+ integer,parameter :: maxbio=10000
+ integer,parameter :: maxamino=31
+ integer,parameter :: maxnuc=12
+ integer :: maxbnd !=2*maxatm
+ integer :: maxang !=3*maxatm
+ integer :: maxtors !=4*maxatm
+ integer,parameter :: maxpi=100
+ integer,parameter :: maxpib=2*maxpi
+ integer,parameter :: maxpit=4*maxpi
+!-----------------------------------------------------------------------------
+! Maximum number of seed
+ integer,parameter :: max_seed=1
+!-----------------------------------------------------------------------------
+ real(kind=8),dimension(:),allocatable :: stochforcvec !(MAXRES6) maxres6=6*maxres
+! common /stochcalc/ stochforcvec
+!-----------------------------------------------------------------------------
+! common /przechowalnia/ subroutines: rattle1,rattle2,rattle_brown
+ real(kind=8),dimension(:,:),allocatable :: GGinv !(2*nres,2*nres) maxres2=2*maxres
+ real(kind=8),dimension(:,:,:),allocatable :: gdc !(3,2*nres,2*nres) maxres2=2*maxres
+ real(kind=8),dimension(:,:),allocatable :: Cmat !(2*nres,2*nres) maxres2=2*maxres
+!-----------------------------------------------------------------------------
+! common /syfek/ subroutines: friction_force,setup_fricmat
+!el real(kind=8),dimension(:),allocatable :: gamvec !(MAXRES6) or (MAXRES2)
+!-----------------------------------------------------------------------------
+! common /przechowalnia/ subroutines: friction_force,setup_fricmat
+ real(kind=8),dimension(:,:),allocatable :: ginvfric !(2*nres,2*nres) !maxres2=2*maxres
+!-----------------------------------------------------------------------------
+! common /przechowalnia/ subroutine: setup_fricmat
+!el real(kind=8),dimension(:,:),allocatable :: fcopy !(2*nres,2*nres)
+!-----------------------------------------------------------------------------
+!
+!
+!-----------------------------------------------------------------------------
+ contains
+!-----------------------------------------------------------------------------
+! brown_step.f
+!-----------------------------------------------------------------------------
+ subroutine brown_step(itime)
+!------------------------------------------------
+! Perform a single Euler integration step of Brownian dynamics
+!------------------------------------------------
+! implicit real*8 (a-h,o-z)
+ use comm_gucio
+ use control, only: tcpu
+ use control_data
+ use energy_data
+! use io_conf, only:cartprint
+! include 'DIMENSIONS'
+#ifdef MPI
+ include 'mpif.h'
+#endif
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+ real(kind=8),dimension(6*nres) :: zapas !(MAXRES6) maxres6=6*maxres
+ integer :: rstcount !ilen,
+!el external ilen
+!el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
+ real(kind=8),dimension(6*nres,2*nres) :: Bmat,GBmat,Tmat !(MAXRES6,MAXRES2) (maxres2=2*maxres,maxres6=6*maxres)
+ real(kind=8),dimension(2*nres,2*nres) :: Cmat_,Cinv !(maxres2,maxres2) maxres2=2*maxres
+ real(kind=8),dimension(6*nres,6*nres) :: Pmat !(maxres6,maxres6) maxres6=6*maxres
+ real(kind=8),dimension(6*nres) :: Td !(maxres6) maxres6=6*maxres
+ real(kind=8),dimension(2*nres) :: ppvec !(maxres2) maxres2=2*maxres
+!el common /stochcalc/ stochforcvec
+!el real(kind=8),dimension(3) :: cm !el
+!el common /gucio/ cm
+ integer :: itime
+ logical :: lprn = .false.,lprn1 = .false.
+ integer :: maxiter = 5
+ real(kind=8) :: difftol = 1.0d-5
+ real(kind=8) :: xx,diffmax,blen2,diffbond,tt0
+ integer :: i,j,nbond,k,ind,ind1,iter
+ integer :: nres2,nres6
+ logical :: osob
+ nres2=2*nres
+ nres6=6*nres
+
+ if (.not.allocated(stochforcvec)) allocate(stochforcvec(nres6)) !(MAXRES6) maxres6=6*maxres
+
+ nbond=nct-nnt
+ do i=nnt,nct
+ if (itype(i).ne.10) nbond=nbond+1
+ enddo
+!
+ if (lprn1) then
+ write (iout,*) "Generalized inverse of fricmat"
+ call matout(dimen,dimen,nres6,nres6,fricmat)
+ endif
+ do i=1,dimen
+ do j=1,nbond
+ Bmat(i,j)=0.0d0
+ enddo
+ enddo
+ ind=3
+ ind1=0
+ do i=nnt,nct-1
+ ind1=ind1+1
+ do j=1,3
+ Bmat(ind+j,ind1)=dC_norm(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind1=ind1+1
+ do j=1,3
+ Bmat(ind+j,ind1)=dC_norm(j,i+nres)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix Bmat"
+ call MATOUT(nbond,dimen,nres6,nres6,Bmat)
+ endif
+ do i=1,dimen
+ do j=1,nbond
+ GBmat(i,j)=0.0d0
+ do k=1,dimen
+ GBmat(i,j)=GBmat(i,j)+fricmat(i,k)*Bmat(k,j)
+ enddo
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix GBmat"
+ call MATOUT(nbond,dimen,nres6,nres2,Gbmat)
+ endif
+ do i=1,nbond
+ do j=1,nbond
+ Cmat_(i,j)=0.0d0
+ do k=1,dimen
+ Cmat_(i,j)=Cmat_(i,j)+Bmat(k,i)*GBmat(k,j)
+ enddo
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix Cmat"
+ call MATOUT(nbond,nbond,nres2,nres2,Cmat_)
+ endif
+ call matinvert(nbond,nres2,Cmat_,Cinv,osob)
+ if (lprn1) then
+ write (iout,*) "Matrix Cinv"
+ call MATOUT(nbond,nbond,nres2,nres2,Cinv)
+ endif
+ do i=1,dimen
+ do j=1,nbond
+ Tmat(i,j)=0.0d0
+ do k=1,nbond
+ Tmat(i,j)=Tmat(i,j)+GBmat(i,k)*Cinv(k,j)
+ enddo
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix Tmat"
+ call MATOUT(nbond,dimen,nres6,nres2,Tmat)
+ endif
+ do i=1,dimen
+ do j=1,dimen
+ if (i.eq.j) then
+ Pmat(i,j)=1.0d0
+ else
+ Pmat(i,j)=0.0d0
+ endif
+ do k=1,nbond
+ Pmat(i,j)=Pmat(i,j)-Tmat(i,k)*Bmat(j,k)
+ enddo
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix Pmat"
+ call MATOUT(dimen,dimen,nres6,nres6,Pmat)
+ endif
+ do i=1,dimen
+ Td(i)=0.0d0
+ ind=0
+ do k=nnt,nct-1
+ ind=ind+1
+ Td(i)=Td(i)+vbl*Tmat(i,ind)
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ ind=ind+1
+ Td(i)=Td(i)+vbldsc0(1,itype(k))*Tmat(i,ind)
+ endif
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Vector Td"
+ do i=1,dimen
+ write (iout,'(i5,f10.5)') i,Td(i)
+ enddo
+ endif
+ call stochastic_force(stochforcvec)
+ if (lprn) then
+ write (iout,*) "stochforcvec"
+ do i=1,dimen
+ write (iout,*) i,stochforcvec(i)
+ enddo
+ endif
+ do j=1,3
+ zapas(j)=-gcart(j,0)+stochforcvec(j)
+ d_t_work(j)=d_t(j,0)
+ dC_work(j)=dC_old(j,0)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ ind=ind+1
+ zapas(ind)=-gcart(j,i)+stochforcvec(ind)
+ dC_work(ind)=dC_old(j,i)
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ do j=1,3
+ ind=ind+1
+ zapas(ind)=-gxcart(j,i)+stochforcvec(ind)
+ dC_work(ind)=dC_old(j,i+nres)
+ enddo
+ endif
+ enddo
+
+ if (lprn) then
+ write (iout,*) "Initial d_t_work"
+ do i=1,dimen
+ write (iout,*) i,d_t_work(i)
+ enddo
+ endif
+
+ do i=1,dimen
+ d_t_work(i)=0.0d0
+ do j=1,dimen
+ d_t_work(i)=d_t_work(i)+fricmat(i,j)*zapas(j)
+ enddo
+ enddo
+
+ do i=1,dimen
+ zapas(i)=Td(i)
+ do j=1,dimen
+ zapas(i)=zapas(i)+Pmat(i,j)*(dC_work(j)+d_t_work(j)*d_time)
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Final d_t_work and zapas"
+ do i=1,dimen
+ write (iout,*) i,d_t_work(i),zapas(i)
+ enddo
+ endif
+
+ do j=1,3
+ d_t(j,0)=d_t_work(j)
+ dc(j,0)=zapas(j)
+ dc_work(j)=dc(j,0)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ d_t(j,i)=d_t_work(i)
+ dc(j,i)=zapas(ind+j)
+ dc_work(ind+j)=dc(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ do j=1,3
+ d_t(j,i+nres)=d_t_work(ind+j)
+ dc(j,i+nres)=zapas(ind+j)
+ dc_work(ind+j)=dc(j,i+nres)
+ enddo
+ ind=ind+3
+ enddo
+ if (lprn) then
+ call chainbuild_cart
+ write (iout,*) "Before correction for rotational lengthening"
+ write (iout,*) "New coordinates",&
+ " and differences between actual and standard bond lengths"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ xx=vbld(i+1)-vbl
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i),j=1,3),xx
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ xx=vbld(i+nres)-vbldsc0(1,itype(i))
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i+nres),j=1,3),xx
+ endif
+ enddo
+ endif
+! Second correction (rotational lengthening)
+! do iter=1,maxiter
+ diffmax=0.0d0
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ blen2 = scalar(dc(1,i),dc(1,i))
+ ppvec(ind)=2*vbl**2-blen2
+ diffbond=dabs(vbl-dsqrt(blen2))
+ if (diffbond.gt.diffmax) diffmax=diffbond
+ if (ppvec(ind).gt.0.0d0) then
+ ppvec(ind)=dsqrt(ppvec(ind))
+ else
+ ppvec(ind)=0.0d0
+ endif
+ if (lprn) then
+ write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind)
+ endif
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ blen2 = scalar(dc(1,i+nres),dc(1,i+nres))
+ ppvec(ind)=2*vbldsc0(1,itype(i))**2-blen2
+ diffbond=dabs(vbldsc0(1,itype(i))-dsqrt(blen2))
+ if (diffbond.gt.diffmax) diffmax=diffbond
+ if (ppvec(ind).gt.0.0d0) then
+ ppvec(ind)=dsqrt(ppvec(ind))
+ else
+ ppvec(ind)=0.0d0
+ endif
+ if (lprn) then
+ write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind)
+ endif
+ endif
+ enddo
+ if (lprn) write (iout,*) "iter",iter," diffmax",diffmax
+ if (diffmax.lt.difftol) goto 10
+ do i=1,dimen
+ Td(i)=0.0d0
+ do j=1,nbond
+ Td(i)=Td(i)+ppvec(j)*Tmat(i,j)
+ enddo
+ enddo
+ do i=1,dimen
+ zapas(i)=Td(i)
+ do j=1,dimen
+ zapas(i)=zapas(i)+Pmat(i,j)*dc_work(j)
+ enddo
+ enddo
+ do j=1,3
+ dc(j,0)=zapas(j)
+ dc_work(j)=zapas(j)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ dc(j,i)=zapas(ind+j)
+ dc_work(ind+j)=zapas(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ do j=1,3
+ dc(j,i+nres)=zapas(ind+j)
+ dc_work(ind+j)=zapas(ind+j)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+! Building the chain from the newly calculated coordinates
+ call chainbuild_cart
+ if(ntwe.ne.0) then
+ if (large.and. mod(itime,ntwe).eq.0) then
+ write (iout,*) "Cartesian and internal coordinates: step 1"
+ call cartprint
+ call intout
+ write (iout,'(a)') "Potential forces"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(-gcart(j,i),j=1,3),&
+ (-gxcart(j,i),j=1,3)
+ enddo
+ write (iout,'(a)') "Stochastic forces"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(stochforc(j,i),j=1,3),&
+ (stochforc(j,i+nres),j=1,3)
+ enddo
+ write (iout,'(a)') "Velocities"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+ if (lprn) then
+ write (iout,*) "After correction for rotational lengthening"
+ write (iout,*) "New coordinates",&
+ " and differences between actual and standard bond lengths"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ xx=vbld(i+1)-vbl
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i),j=1,3),xx
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ xx=vbld(i+nres)-vbldsc0(1,itype(i))
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i+nres),j=1,3),xx
+ endif
+ enddo
+ endif
+! ENDDO
+! write (iout,*) "Too many attempts at correcting the bonds"
+! stop
+ 10 continue
+#ifdef MPI
+ tt0 =MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+! Calculate energy and forces
+ call zerograd
+ call etotal(potEcomp)
+ potE=potEcomp(0)-potEcomp(20)
+ call cartgrad
+ totT=totT+d_time
+! Calculate the kinetic and total energy and the kinetic temperature
+ call kinetic(EK)
+#ifdef MPI
+ t_enegrad=t_enegrad+MPI_Wtime()-tt0
+#else
+ t_enegrad=t_enegrad+tcpu()-tt0
+#endif
+ totE=EK+potE
+ kinetic_T=2.0d0/(dimen*Rb)*EK
+ return
+ end subroutine brown_step
+!-----------------------------------------------------------------------------
+! gauss.f
+!-----------------------------------------------------------------------------
+ subroutine gauss(RO,AP,MT,M,N,*)
+!
+! CALCULATES (RO**(-1))*AP BY GAUSS ELIMINATION
+! RO IS A SQUARE MATRIX
+! THE CALCULATED PRODUCT IS STORED IN AP
+! ABNORMAL EXIT IF RO IS SINGULAR
+!
+ integer :: MT, M, N, M1,I,J,IM,&
+ I1,MI,MI1
+ real(kind=8) :: RO(MT,M),AP(MT,N),X,RM,PR,Y
+ integer :: k
+! real(kind=8) ::
+
+ if(M.ne.1)goto 10
+ X=RO(1,1)
+ if(dabs(X).le.1.0D-13) return 1
+ X=1.0/X
+ do 16 I=1,N
+16 AP(1,I)=AP(1,I)*X
+ return
+10 continue
+ M1=M-1
+ DO 1 I=1,M1
+ IM=I
+ RM=DABS(RO(I,I))
+ I1=I+1
+ do 2 J=I1,M
+ if(DABS(RO(J,I)).LE.RM) goto 2
+ RM=DABS(RO(J,I))
+ IM=J
+2 continue
+ If(IM.eq.I)goto 17
+ do 3 J=1,N
+ PR=AP(I,J)
+ AP(I,J)=AP(IM,J)
+3 AP(IM,J)=PR
+ do 4 J=I,M
+ PR=RO(I,J)
+ RO(I,J)=RO(IM,J)
+4 RO(IM,J)=PR
+17 X=RO(I,I)
+ if(dabs(X).le.1.0E-13) return 1
+ X=1.0/X
+ do 5 J=1,N
+5 AP(I,J)=X*AP(I,J)
+ do 6 J=I1,M
+6 RO(I,J)=X*RO(I,J)
+ do 7 J=I1,M
+ Y=RO(J,I)
+ do 8 K=1,N
+8 AP(J,K)=AP(J,K)-Y*AP(I,K)
+ do 9 K=I1,M
+9 RO(J,K)=RO(J,K)-Y*RO(I,K)
+7 continue
+1 continue
+ X=RO(M,M)
+ if(dabs(X).le.1.0E-13) return 1
+ X=1.0/X
+ do 11 J=1,N
+11 AP(M,J)=X*AP(M,J)
+ do 12 I=1,M1
+ MI=M-I
+ MI1=MI+1
+ do 14 J=1,N
+ X=AP(MI,J)
+ do 15 K=MI1,M
+15 X=X-AP(K,J)*RO(MI,K)
+14 AP(MI,J)=X
+12 continue
+ return
+ end subroutine gauss
+!-----------------------------------------------------------------------------
+! kinetic_lesyng.f
+!-----------------------------------------------------------------------------
+ subroutine kinetic(KE_total)
+!----------------------------------------------------------------
+! This subroutine calculates the total kinetic energy of the chain
+!-----------------------------------------------------------------
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.VAR'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.MD'
+! include 'COMMON.IOUNITS'
+ real(kind=8) :: KE_total
+
+ integer :: i,j,k,iti
+ real(kind=8) :: KEt_p,KEt_sc,KEr_p,KEr_sc,incr(3),&
+ mag1,mag2,v(3)
+
+ KEt_p=0.0d0
+ KEt_sc=0.0d0
+! write (iout,*) "ISC",(isc(itype(i)),i=1,nres)
+! The translational part for peptide virtual bonds
+ do j=1,3
+ incr(j)=d_t(j,0)
+ enddo
+ do i=nnt,nct-1
+! write (iout,*) "Kinetic trp:",i,(incr(j),j=1,3)
+ do j=1,3
+ v(j)=incr(j)+0.5d0*d_t(j,i)
+ enddo
+ vtot(i)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3)
+ KEt_p=KEt_p+(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))
+ do j=1,3
+ incr(j)=incr(j)+d_t(j,i)
+ enddo
+ enddo
+! write(iout,*) 'KEt_p', KEt_p
+! The translational part for the side chain virtual bond
+! Only now we can initialize incr with zeros. It must be equal
+! to the velocities of the first Calpha.
+ do j=1,3
+ incr(j)=d_t(j,0)
+ enddo
+ do i=nnt,nct
+ iti=iabs(itype(i))
+ if (itype(i).eq.10) then
+ do j=1,3
+ v(j)=incr(j)
+ enddo
+ else
+ do j=1,3
+ v(j)=incr(j)+d_t(j,nres+i)
+ enddo
+ endif
+! write (iout,*) "Kinetic trsc:",i,(incr(j),j=1,3)
+! write (iout,*) "i",i," msc",msc(iti)," v",(v(j),j=1,3)
+ KEt_sc=KEt_sc+msc(iti)*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))
+ vtot(i+nres)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3)
+ do j=1,3
+ incr(j)=incr(j)+d_t(j,i)
+ enddo
+ enddo
+! goto 111
+! write(iout,*) 'KEt_sc', KEt_sc
+! The part due to stretching and rotation of the peptide groups
+ KEr_p=0.0D0
+ do i=nnt,nct-1
+! write (iout,*) "i",i
+! write (iout,*) "i",i," mag1",mag1," mag2",mag2
+ do j=1,3
+ incr(j)=d_t(j,i)
+ enddo
+! write (iout,*) "Kinetic rotp:",i,(incr(j),j=1,3)
+ KEr_p=KEr_p+(incr(1)*incr(1)+incr(2)*incr(2) &
+ +incr(3)*incr(3))
+ enddo
+! goto 111
+! write(iout,*) 'KEr_p', KEr_p
+! The rotational part of the side chain virtual bond
+ KEr_sc=0.0D0
+ do i=nnt,nct
+ iti=iabs(itype(i))
+ if (itype(i).ne.10) then
+ do j=1,3
+ incr(j)=d_t(j,nres+i)
+ enddo
+! write (iout,*) "Kinetic rotsc:",i,(incr(j),j=1,3)
+ KEr_sc=KEr_sc+Isc(iti)*(incr(1)*incr(1)+incr(2)*incr(2)+ &
+ incr(3)*incr(3))
+ endif
+ enddo
+! The total kinetic energy
+ 111 continue
+! write(iout,*) 'KEr_sc', KEr_sc
+ KE_total=0.5d0*(mp*KEt_p+KEt_sc+0.25d0*Ip*KEr_p+KEr_sc)
+! write (iout,*) "KE_total",KE_total
+ return
+ end subroutine kinetic
+!-----------------------------------------------------------------------------
+! MD_A-MTS.F
+!-----------------------------------------------------------------------------
+ subroutine MD
+!------------------------------------------------
+! The driver for molecular dynamics subroutines
+!------------------------------------------------
+ use comm_gucio
+! use MPI
+ use control, only:tcpu,ovrtim
+! use io_comm, only:ilen
+ use control_data
+ use compare, only:secondary2,hairpin
+ use io, only:cartout,statout
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+#ifdef MPI
+ include "mpif.h"
+ integer :: IERROR,ERRCODE
+#endif
+! include 'COMMON.SETUP'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+! include 'COMMON.HAIRPIN'
+ real(kind=8),dimension(3) :: L,vcm
+#ifdef VOUT
+ real(kind=8),dimension(6*nres) :: v_work,v_transf !(maxres6) maxres6=6*maxres
+#endif
+ integer :: rstcount !ilen,
+!el external ilen
+ character(len=50) :: tytul
+!el common /gucio/ cm
+ integer :: itime,i,j,nharp
+ integer,dimension(4,nres/3) :: iharp !(4,nres/3)(4,maxres/3)
+! logical :: ovrtim
+ real(kind=8) :: tt0,scalfac
+ integer :: nres2
+ nres2=2*nres
+!
+#ifdef MPI
+ if (ilen(tmpdir).gt.0) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_" &
+ //liczba(:ilen(liczba))//'.rst')
+#else
+ if (ilen(tmpdir).gt.0) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_"//'.rst')
+#endif
+ t_MDsetup=0.0d0
+ t_langsetup=0.0d0
+ t_MD=0.0d0
+ t_enegrad=0.0d0
+ t_sdsetup=0.0d0
+ write (iout,'(20(1h=),a20,20(1h=))') "MD calculation started"
+#ifdef MPI
+ tt0=MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+! Determine the inverse of the inertia matrix.
+ call setup_MD_matrices
+! Initialize MD
+ call init_MD
+#ifdef MPI
+ t_MDsetup = MPI_Wtime()-tt0
+#else
+ t_MDsetup = tcpu()-tt0
+#endif
+ rstcount=0
+! Entering the MD loop
+#ifdef MPI
+ tt0 = MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+ if (lang.eq.2 .or. lang.eq.3) then
+#ifndef LANG0
+ call setup_fricmat
+ if (lang.eq.2) then
+ call sd_verlet_p_setup
+ else
+ call sd_verlet_ciccotti_setup
+ endif
+ do i=1,dimen
+ do j=1,dimen
+ pfric0_mat(i,j,0)=pfric_mat(i,j)
+ afric0_mat(i,j,0)=afric_mat(i,j)
+ vfric0_mat(i,j,0)=vfric_mat(i,j)
+ prand0_mat(i,j,0)=prand_mat(i,j)
+ vrand0_mat1(i,j,0)=vrand_mat1(i,j)
+ vrand0_mat2(i,j,0)=vrand_mat2(i,j)
+ enddo
+ enddo
+ flag_stoch(0)=.true.
+ do i=1,maxflag_stoch
+ flag_stoch(i)=.false.
+ enddo
+#else
+ write (iout,*) &
+ "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
+#ifdef MPI
+ call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
+#endif
+ stop
+#endif
+ else if (lang.eq.1 .or. lang.eq.4) then
+ call setup_fricmat
+ endif
+#ifdef MPI
+ t_langsetup=MPI_Wtime()-tt0
+ tt0=MPI_Wtime()
+#else
+ t_langsetup=tcpu()-tt0
+ tt0=tcpu()
+#endif
+ do itime=1,n_timestep
+ if (ovrtim()) exit
+ if (large.and. mod(itime,ntwe).eq.0) &
+ write (iout,*) "itime",itime
+ rstcount=rstcount+1
+ if (lang.gt.0 .and. surfarea .and. &
+ mod(itime,reset_fricmat).eq.0) then
+ if (lang.eq.2 .or. lang.eq.3) then
+#ifndef LANG0
+ call setup_fricmat
+ if (lang.eq.2) then
+ call sd_verlet_p_setup
+ else
+ call sd_verlet_ciccotti_setup
+ endif
+ do i=1,dimen
+ do j=1,dimen
+ pfric0_mat(i,j,0)=pfric_mat(i,j)
+ afric0_mat(i,j,0)=afric_mat(i,j)
+ vfric0_mat(i,j,0)=vfric_mat(i,j)
+ prand0_mat(i,j,0)=prand_mat(i,j)
+ vrand0_mat1(i,j,0)=vrand_mat1(i,j)
+ vrand0_mat2(i,j,0)=vrand_mat2(i,j)
+ enddo
+ enddo
+ flag_stoch(0)=.true.
+ do i=1,maxflag_stoch
+ flag_stoch(i)=.false.
+ enddo
+#endif
+ else if (lang.eq.1 .or. lang.eq.4) then
+ call setup_fricmat
+ endif
+ write (iout,'(a,i10)') &
+ "Friction matrix reset based on surface area, itime",itime
+ endif
+ if (reset_vel .and. tbf .and. lang.eq.0 &
+ .and. mod(itime,count_reset_vel).eq.0) then
+ call random_vel
+ write(iout,'(a,f20.2)') &
+ "Velocities reset to random values, time",totT
+ do i=0,2*nres
+ do j=1,3
+ d_t_old(j,i)=d_t(j,i)
+ enddo
+ enddo
+ endif
+ if (reset_moment .and. mod(itime,count_reset_moment).eq.0) then
+ call inertia_tensor
+ call vcm_vel(vcm)
+ do j=1,3
+ d_t(j,0)=d_t(j,0)-vcm(j)
+ enddo
+ call kinetic(EK)
+ kinetic_T=2.0d0/(dimen3*Rb)*EK
+ scalfac=dsqrt(T_bath/kinetic_T)
+ write(iout,'(a,f20.2)') "Momenta zeroed out, time",totT
+ do i=0,2*nres
+ do j=1,3
+ d_t_old(j,i)=scalfac*d_t(j,i)
+ enddo
+ enddo
+ endif
+ if (lang.ne.4) then
+ if (RESPA) then
+! Time-reversible RESPA algorithm
+! (Tuckerman et al., J. Chem. Phys., 97, 1990, 1992)
+ call RESPA_step(itime)
+ else
+! Variable time step algorithm.
+ call velverlet_step(itime)
+ endif
+ else
+#ifdef BROWN
+ call brown_step(itime)
+#else
+ print *,"Brown dynamics not here!"
+#ifdef MPI
+ call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
+#endif
+ stop
+#endif
+ endif
+ if (ntwe.ne.0) then
+ if (mod(itime,ntwe).eq.0) call statout(itime)
+#ifdef VOUT
+ do j=1,3
+ v_work(j)=d_t(j,0)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ ind=ind+1
+ v_work(ind)=d_t(j,i)
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ ind=ind+1
+ v_work(ind)=d_t(j,i+nres)
+ enddo
+ endif
+ enddo
+
+ write (66,'(80f10.5)') &
+ ((d_t(j,i),j=1,3),i=0,nres-1),((d_t(j,i+nres),j=1,3),i=1,nres)
+ do i=1,ind
+ v_transf(i)=0.0d0
+ do j=1,ind
+ v_transf(i)=v_transf(i)+gvec(j,i)*v_work(j)
+ enddo
+ v_transf(i)= v_transf(i)*dsqrt(geigen(i))
+ enddo
+ write (67,'(80f10.5)') (v_transf(i),i=1,ind)
+#endif
+ endif
+ if (mod(itime,ntwx).eq.0) then
+ write (tytul,'("time",f8.2)') totT
+ if(mdpdb) then
+ call hairpin(.true.,nharp,iharp)
+ call secondary2(.true.)
+ call pdbout(potE,tytul,ipdb)
+ else
+ call cartout(totT)
+ endif
+ endif
+ if (rstcount.eq.1000.or.itime.eq.n_timestep) then
+ open(irest2,file=rest2name,status='unknown')
+ write(irest2,*) totT,EK,potE,totE,t_bath
+ do i=1,2*nres
+ write (irest2,'(3e15.5)') (d_t(j,i),j=1,3)
+ enddo
+ do i=1,2*nres
+ write (irest2,'(3e15.5)') (dc(j,i),j=1,3)
+ enddo
+ close(irest2)
+ rstcount=0
+ endif
+ enddo
+
+#ifdef MPI
+ t_MD=MPI_Wtime()-tt0
+#else
+ t_MD=tcpu()-tt0
+#endif
+ write (iout,'(//35(1h=),a10,35(1h=)/10(/a40,1pe15.5))') &
+ ' Timing ',&
+ 'MD calculations setup:',t_MDsetup,&
+ 'Energy & gradient evaluation:',t_enegrad,&
+ 'Stochastic MD setup:',t_langsetup,&
+ 'Stochastic MD step setup:',t_sdsetup,&
+ 'MD steps:',t_MD
+ write (iout,'(/28(1h=),a25,27(1h=))') &
+ ' End of MD calculation '
+#ifdef TIMING_ENE
+ write (iout,*) "time for etotal",t_etotal," elong",t_elong,&
+ " eshort",t_eshort
+ write (iout,*) "time_fric",time_fric," time_stoch",time_stoch,&
+ " time_fricmatmult",time_fricmatmult," time_fsample ",&
+ time_fsample
+#endif
+ return
+ end subroutine MD
+!-----------------------------------------------------------------------------
+ subroutine velverlet_step(itime)
+!-------------------------------------------------------------------------------
+! Perform a single velocity Verlet step; the time step can be rescaled if
+! increments in accelerations exceed the threshold
+!-------------------------------------------------------------------------------
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+ use comm_gucio
+ use control, only:tcpu
+ use control_data
+#ifdef MPI
+ include 'mpif.h'
+ integer :: ierror,ierrcode
+ real(kind=8) :: errcode
+#endif
+! include 'COMMON.SETUP'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+! include 'COMMON.MUCA'
+ real(kind=8),dimension(3) :: vcm,incr
+ real(kind=8),dimension(3) :: L
+ integer :: count,rstcount !ilen,
+!el external ilen
+ character(len=50) :: tytul
+ integer :: maxcount_scale = 20
+!el common /gucio/ cm
+!el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
+!el common /stochcalc/ stochforcvec
+ integer :: itime,icount_scale,itime_scal,i,j,ifac_time
+ logical :: scale
+ real(kind=8) :: epdrift,tt0,fac_time
+!
+ if (.not.allocated(stochforcvec)) allocate(stochforcvec(6*nres)) !(MAXRES6) maxres6=6*maxres
+
+ scale=.true.
+ icount_scale=0
+ if (lang.eq.1) then
+ call sddir_precalc
+ else if (lang.eq.2 .or. lang.eq.3) then
+#ifndef LANG0
+ call stochastic_force(stochforcvec)
+#else
+ write (iout,*) &
+ "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
+#ifdef MPI
+ call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
+#endif
+ stop
+#endif
+ endif
+ itime_scal=0
+ do while (scale)
+ icount_scale=icount_scale+1
+ if (icount_scale.gt.maxcount_scale) then
+ write (iout,*) &
+ "ERROR: too many attempts at scaling down the time step. ",&
+ "amax=",amax,"epdrift=",epdrift,&
+ "damax=",damax,"edriftmax=",edriftmax,&
+ "d_time=",d_time
+ call flush(iout)
+#ifdef MPI
+ call MPI_Abort(MPI_COMM_WORLD,IERROR,IERRCODE)
+#endif
+ stop
+ endif
+! First step of the velocity Verlet algorithm
+ if (lang.eq.2) then
+#ifndef LANG0
+ call sd_verlet1
+#endif
+ else if (lang.eq.3) then
+#ifndef LANG0
+ call sd_verlet1_ciccotti
+#endif
+ else if (lang.eq.1) then
+ call sddir_verlet1
+ else
+ call verlet1
+ endif
+! Build the chain from the newly calculated coordinates
+ call chainbuild_cart
+ if (rattle) call rattle1
+ if (ntwe.ne.0) then
+ if (large.and. mod(itime,ntwe).eq.0) then
+ write (iout,*) "Cartesian and internal coordinates: step 1"
+ call cartprint
+ call intout
+ write (iout,*) "dC"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),&
+ (dc(j,i+nres),j=1,3)
+ enddo
+ write (iout,*) "Accelerations"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ write (iout,*) "Velocities, step 1"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+#ifdef MPI
+ tt0 = MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+! Calculate energy and forces
+ call zerograd
+ call etotal(potEcomp)
+ if (large.and. mod(itime,ntwe).eq.0) &
+ call enerprint(potEcomp)
+#ifdef TIMING_ENE
+#ifdef MPI
+ t_etotal=t_etotal+MPI_Wtime()-tt0
+#else
+ t_etotal=t_etotal+tcpu()-tt0
+#endif
+#endif
+ potE=potEcomp(0)-potEcomp(20)
+ call cartgrad
+! Get the new accelerations
+ call lagrangian
+#ifdef MPI
+ t_enegrad=t_enegrad+MPI_Wtime()-tt0
+#else
+ t_enegrad=t_enegrad+tcpu()-tt0
+#endif
+! Determine maximum acceleration and scale down the timestep if needed
+ call max_accel
+ amax=amax/(itime_scal+1)**2
+ call predict_edrift(epdrift)
+ if (amax/(itime_scal+1).gt.damax .or. epdrift.gt.edriftmax) then
+! Maximum acceleration or maximum predicted energy drift exceeded, rescale the time step
+ scale=.true.
+ ifac_time=dmax1(dlog(amax/damax),dlog(epdrift/edriftmax)) &
+ /dlog(2.0d0)+1
+ itime_scal=itime_scal+ifac_time
+! fac_time=dmin1(damax/amax,0.5d0)
+ fac_time=0.5d0**ifac_time
+ d_time=d_time*fac_time
+ if (lang.eq.2 .or. lang.eq.3) then
+#ifndef LANG0
+! write (iout,*) "Calling sd_verlet_setup: 1"
+! Rescale the stochastic forces and recalculate or restore
+! the matrices of tinker integrator
+ if (itime_scal.gt.maxflag_stoch) then
+ if (large) write (iout,'(a,i5,a)') &
+ "Calculate matrices for stochastic step;",&
+ " itime_scal ",itime_scal
+ if (lang.eq.2) then
+ call sd_verlet_p_setup
+ else
+ call sd_verlet_ciccotti_setup
+ endif
+ write (iout,'(2a,i3,a,i3,1h.)') &
+ "Warning: cannot store matrices for stochastic",&
+ " integration because the index",itime_scal,&
+ " is greater than",maxflag_stoch
+ write (iout,'(2a)')"Increase MAXFLAG_STOCH or use direct",&
+ " integration Langevin algorithm for better efficiency."
+ else if (flag_stoch(itime_scal)) then
+ if (large) write (iout,'(a,i5,a,l1)') &
+ "Restore matrices for stochastic step; itime_scal ",&
+ itime_scal," flag ",flag_stoch(itime_scal)
+ do i=1,dimen
+ do j=1,dimen
+ pfric_mat(i,j)=pfric0_mat(i,j,itime_scal)
+ afric_mat(i,j)=afric0_mat(i,j,itime_scal)
+ vfric_mat(i,j)=vfric0_mat(i,j,itime_scal)
+ prand_mat(i,j)=prand0_mat(i,j,itime_scal)
+ vrand_mat1(i,j)=vrand0_mat1(i,j,itime_scal)
+ vrand_mat2(i,j)=vrand0_mat2(i,j,itime_scal)
+ enddo
+ enddo
+ else
+ if (large) write (iout,'(2a,i5,a,l1)') &
+ "Calculate & store matrices for stochastic step;",&
+ " itime_scal ",itime_scal," flag ",flag_stoch(itime_scal)
+ if (lang.eq.2) then
+ call sd_verlet_p_setup
+ else
+ call sd_verlet_ciccotti_setup
+ endif
+ flag_stoch(ifac_time)=.true.
+ do i=1,dimen
+ do j=1,dimen
+ pfric0_mat(i,j,itime_scal)=pfric_mat(i,j)
+ afric0_mat(i,j,itime_scal)=afric_mat(i,j)
+ vfric0_mat(i,j,itime_scal)=vfric_mat(i,j)
+ prand0_mat(i,j,itime_scal)=prand_mat(i,j)
+ vrand0_mat1(i,j,itime_scal)=vrand_mat1(i,j)
+ vrand0_mat2(i,j,itime_scal)=vrand_mat2(i,j)
+ enddo
+ enddo
+ endif
+ fac_time=1.0d0/dsqrt(fac_time)
+ do i=1,dimen
+ stochforcvec(i)=fac_time*stochforcvec(i)
+ enddo
+#endif
+ else if (lang.eq.1) then
+! Rescale the accelerations due to stochastic forces
+ fac_time=1.0d0/dsqrt(fac_time)
+ do i=1,dimen
+ d_as_work(i)=d_as_work(i)*fac_time
+ enddo
+ endif
+ if (large) write (iout,'(a,i10,a,f8.6,a,i3,a,i3)') &
+ "itime",itime," Timestep scaled down to ",&
+ d_time," ifac_time",ifac_time," itime_scal",itime_scal
+ else
+! Second step of the velocity Verlet algorithm
+ if (lang.eq.2) then
+#ifndef LANG0
+ call sd_verlet2
+#endif
+ else if (lang.eq.3) then
+#ifndef LANG0
+ call sd_verlet2_ciccotti
+#endif
+ else if (lang.eq.1) then
+ call sddir_verlet2
+ else
+ call verlet2
+ endif
+ if (rattle) call rattle2
+ totT=totT+d_time
+ if (d_time.ne.d_time0) then
+ d_time=d_time0
+#ifndef LANG0
+ if (lang.eq.2 .or. lang.eq.3) then
+ if (large) write (iout,'(a)') &
+ "Restore original matrices for stochastic step"
+! write (iout,*) "Calling sd_verlet_setup: 2"
+! Restore the matrices of tinker integrator if the time step has been restored
+ do i=1,dimen
+ do j=1,dimen
+ pfric_mat(i,j)=pfric0_mat(i,j,0)
+ afric_mat(i,j)=afric0_mat(i,j,0)
+ vfric_mat(i,j)=vfric0_mat(i,j,0)
+ prand_mat(i,j)=prand0_mat(i,j,0)
+ vrand_mat1(i,j)=vrand0_mat1(i,j,0)
+ vrand_mat2(i,j)=vrand0_mat2(i,j,0)
+ enddo
+ enddo
+ endif
+#endif
+ endif
+ scale=.false.
+ endif
+ enddo
+! Calculate the kinetic and the total energy and the kinetic temperature
+ call kinetic(EK)
+ totE=EK+potE
+! diagnostics
+! call kinetic1(EK1)
+! write (iout,*) "step",itime," EK",EK," EK1",EK1
+! end diagnostics
+! Couple the system to Berendsen bath if needed
+ if (tbf .and. lang.eq.0) then
+ call verlet_bath
+ endif
+ kinetic_T=2.0d0/(dimen3*Rb)*EK
+! Backup the coordinates, velocities, and accelerations
+ do i=0,2*nres
+ do j=1,3
+ dc_old(j,i)=dc(j,i)
+ d_t_old(j,i)=d_t(j,i)
+ d_a_old(j,i)=d_a(j,i)
+ enddo
+ enddo
+ if (ntwe.ne.0) then
+ if (mod(itime,ntwe).eq.0 .and. large) then
+ write (iout,*) "Velocities, step 2"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+ return
+ end subroutine velverlet_step
+!-----------------------------------------------------------------------------
+ subroutine RESPA_step(itime)
+!-------------------------------------------------------------------------------
+! Perform a single RESPA step.
+!-------------------------------------------------------------------------------
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+ use comm_gucio
+ use comm_cipiszcze
+! use MPI
+ use control, only:tcpu
+ use control_data
+! use io_conf, only:cartprint
+#ifdef MPI
+ include 'mpif.h'
+ integer :: IERROR,ERRCODE
+#endif
+! include 'COMMON.SETUP'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+ real(kind=8),dimension(0:n_ene) :: energia_short,energia_long
+ real(kind=8),dimension(3) :: L,vcm,incr
+ real(kind=8),dimension(3,0:2*nres) :: dc_old0,d_t_old0,d_a_old0 !(3,0:maxres2) maxres2=2*maxres
+ logical :: PRINT_AMTS_MSG = .false.
+ integer :: count,rstcount !ilen,
+!el external ilen
+ character(len=50) :: tytul
+ integer :: maxcount_scale = 10
+!el common /gucio/ cm
+!el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
+!el common /stochcalc/ stochforcvec
+ integer :: itime,itt,i,j,itsplit
+ logical :: scale
+!el common /cipiszcze/ itt
+
+ real(kind=8) :: epdrift,tt0,epdriftmax
+ itt = itt_comm
+
+ if (.not.allocated(stochforcvec)) allocate(stochforcvec(6*nres)) !(MAXRES6) maxres6=6*maxres
+
+ itt=itime
+ if (ntwe.ne.0) then
+ if (large.and. mod(itime,ntwe).eq.0) then
+ write (iout,*) "***************** RESPA itime",itime
+ write (iout,*) "Cartesian and internal coordinates: step 0"
+! call cartprint
+ call pdbout(0.0d0,"cipiszcze",iout)
+ call intout
+ write (iout,*) "Accelerations from long-range forces"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ write (iout,*) "Velocities, step 0"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+!
+! Perform the initial RESPA step (increment velocities)
+! write (iout,*) "*********************** RESPA ini"
+ call RESPA_vel
+ if (ntwe.ne.0) then
+ if (mod(itime,ntwe).eq.0 .and. large) then
+ write (iout,*) "Velocities, end"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+! Compute the short-range forces
+#ifdef MPI
+ tt0 =MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+! 7/2/2009 commented out
+! call zerograd
+! call etotal_short(energia_short)
+! call cartgrad
+! call lagrangian
+! 7/2/2009 Copy accelerations due to short-lange forces from previous MD step
+ do i=0,2*nres
+ do j=1,3
+ d_a(j,i)=d_a_short(j,i)
+ enddo
+ enddo
+ if (ntwe.ne.0) then
+ if (large.and. mod(itime,ntwe).eq.0) then
+ write (iout,*) "energia_short",energia_short(0)
+ write (iout,*) "Accelerations from short-range forces"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+#ifdef MPI
+ t_enegrad=t_enegrad+MPI_Wtime()-tt0
+#else
+ t_enegrad=t_enegrad+tcpu()-tt0
+#endif
+ do i=0,2*nres
+ do j=1,3
+ dc_old(j,i)=dc(j,i)
+ d_t_old(j,i)=d_t(j,i)
+ d_a_old(j,i)=d_a(j,i)
+ enddo
+ enddo
+! 6/30/08 A-MTS: attempt at increasing the split number
+ do i=0,2*nres
+ do j=1,3
+ dc_old0(j,i)=dc_old(j,i)
+ d_t_old0(j,i)=d_t_old(j,i)
+ d_a_old0(j,i)=d_a_old(j,i)
+ enddo
+ enddo
+ if (ntime_split.gt.ntime_split0) ntime_split=ntime_split/2
+ if (ntime_split.lt.ntime_split0) ntime_split=ntime_split0
+!
+ scale=.true.
+ d_time0=d_time
+ do while (scale)
+
+ scale=.false.
+! write (iout,*) "itime",itime," ntime_split",ntime_split
+! Split the time step
+ d_time=d_time0/ntime_split
+! Perform the short-range RESPA steps (velocity Verlet increments of
+! positions and velocities using short-range forces)
+! write (iout,*) "*********************** RESPA split"
+ do itsplit=1,ntime_split
+ if (lang.eq.1) then
+ call sddir_precalc
+ else if (lang.eq.2 .or. lang.eq.3) then
+#ifndef LANG0
+ call stochastic_force(stochforcvec)
+#else
+ write (iout,*) &
+ "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
+#ifdef MPI
+ call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
+#endif
+ stop
+#endif
+ endif
+! First step of the velocity Verlet algorithm
+ if (lang.eq.2) then
+#ifndef LANG0
+ call sd_verlet1
+#endif
+ else if (lang.eq.3) then
+#ifndef LANG0
+ call sd_verlet1_ciccotti
+#endif
+ else if (lang.eq.1) then
+ call sddir_verlet1
+ else
+ call verlet1
+ endif
+! Build the chain from the newly calculated coordinates
+ call chainbuild_cart
+ if (rattle) call rattle1
+ if (ntwe.ne.0) then
+ if (large.and. mod(itime,ntwe).eq.0) then
+ write (iout,*) "***** ITSPLIT",itsplit
+ write (iout,*) "Cartesian and internal coordinates: step 1"
+ call pdbout(0.0d0,"cipiszcze",iout)
+! call cartprint
+ call intout
+ write (iout,*) "Velocities, step 1"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+#ifdef MPI
+ tt0 = MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+! Calculate energy and forces
+ call zerograd
+ call etotal_short(energia_short)
+ if (large.and. mod(itime,ntwe).eq.0) &
+ call enerprint(energia_short)
+#ifdef TIMING_ENE
+#ifdef MPI
+ t_eshort=t_eshort+MPI_Wtime()-tt0
+#else
+ t_eshort=t_eshort+tcpu()-tt0
+#endif
+#endif
+ call cartgrad
+! Get the new accelerations
+ call lagrangian
+! 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
+ do i=0,2*nres
+ do j=1,3
+ d_a_short(j,i)=d_a(j,i)
+ enddo
+ enddo
+ if (ntwe.ne.0) then
+ if (large.and. mod(itime,ntwe).eq.0) then
+ write (iout,*)"energia_short",energia_short(0)
+ write (iout,*) "Accelerations from short-range forces"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+! 6/30/08 A-MTS
+! Determine maximum acceleration and scale down the timestep if needed
+ call max_accel
+ amax=amax/ntime_split**2
+ call predict_edrift(epdrift)
+ if (ntwe.gt.0 .and. large .and. mod(itime,ntwe).eq.0) &
+ write (iout,*) "amax",amax," damax",damax,&
+ " epdrift",epdrift," epdriftmax",epdriftmax
+! Exit loop and try with increased split number if the change of
+! acceleration is too big
+ if (amax.gt.damax .or. epdrift.gt.edriftmax) then
+ if (ntime_split.lt.maxtime_split) then
+ scale=.true.
+ ntime_split=ntime_split*2
+ do i=0,2*nres
+ do j=1,3
+ dc_old(j,i)=dc_old0(j,i)
+ d_t_old(j,i)=d_t_old0(j,i)
+ d_a_old(j,i)=d_a_old0(j,i)
+ enddo
+ enddo
+ if (PRINT_AMTS_MSG) then
+ write (iout,*) "acceleration/energy drift too large",amax,&
+ epdrift," split increased to ",ntime_split," itime",itime,&
+ " itsplit",itsplit
+ endif
+ exit
+ else
+ write (iout,*) &
+ "Uh-hu. Bumpy landscape. Maximum splitting number",&
+ maxtime_split,&
+ " already reached!!! Trying to carry on!"
+ endif
+ endif
+#ifdef MPI
+ t_enegrad=t_enegrad+MPI_Wtime()-tt0
+#else
+ t_enegrad=t_enegrad+tcpu()-tt0
+#endif
+! Second step of the velocity Verlet algorithm
+ if (lang.eq.2) then
+#ifndef LANG0
+ call sd_verlet2
+#endif
+ else if (lang.eq.3) then
+#ifndef LANG0
+ call sd_verlet2_ciccotti
+#endif
+ else if (lang.eq.1) then
+ call sddir_verlet2
+ else
+ call verlet2
+ endif
+ if (rattle) call rattle2
+! Backup the coordinates, velocities, and accelerations
+ do i=0,2*nres
+ do j=1,3
+ dc_old(j,i)=dc(j,i)
+ d_t_old(j,i)=d_t(j,i)
+ d_a_old(j,i)=d_a(j,i)
+ enddo
+ enddo
+ enddo
+
+ enddo ! while scale
+
+! Restore the time step
+ d_time=d_time0
+! Compute long-range forces
+#ifdef MPI
+ tt0 =MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+ call zerograd
+ call etotal_long(energia_long)
+ if (large.and. mod(itime,ntwe).eq.0) &
+ call enerprint(energia_long)
+#ifdef TIMING_ENE
+#ifdef MPI
+ t_elong=t_elong+MPI_Wtime()-tt0
+#else
+ t_elong=t_elong+tcpu()-tt0
+#endif
+#endif
+ call cartgrad
+ call lagrangian
+#ifdef MPI
+ t_enegrad=t_enegrad+MPI_Wtime()-tt0
+#else
+ t_enegrad=t_enegrad+tcpu()-tt0
+#endif
+! Compute accelerations from long-range forces
+ if (ntwe.ne.0) then
+ if (large.and. mod(itime,ntwe).eq.0) then
+ write (iout,*) "energia_long",energia_long(0)
+ write (iout,*) "Cartesian and internal coordinates: step 2"
+! call cartprint
+ call pdbout(0.0d0,"cipiszcze",iout)
+ call intout
+ write (iout,*) "Accelerations from long-range forces"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ write (iout,*) "Velocities, step 2"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+! Compute the final RESPA step (increment velocities)
+! write (iout,*) "*********************** RESPA fin"
+ call RESPA_vel
+! Compute the complete potential energy
+ do i=0,n_ene
+ potEcomp(i)=energia_short(i)+energia_long(i)
+ enddo
+ potE=potEcomp(0)-potEcomp(20)
+! potE=energia_short(0)+energia_long(0)
+ totT=totT+d_time
+! Calculate the kinetic and the total energy and the kinetic temperature
+ call kinetic(EK)
+ totE=EK+potE
+! Couple the system to Berendsen bath if needed
+ if (tbf .and. lang.eq.0) then
+ call verlet_bath
+ endif
+ kinetic_T=2.0d0/(dimen3*Rb)*EK
+! Backup the coordinates, velocities, and accelerations
+ if (ntwe.ne.0) then
+ if (mod(itime,ntwe).eq.0 .and. large) then
+ write (iout,*) "Velocities, end"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ endif
+ return
+ end subroutine RESPA_step
+!-----------------------------------------------------------------------------
+ subroutine RESPA_vel
+! First and last RESPA step (incrementing velocities using long-range
+! forces).
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+ integer :: i,j,inres
+
+ do j=1,3
+ d_t(j,0)=d_t(j,0)+0.5d0*d_a(j,0)*d_time
+ enddo
+ do i=nnt,nct-1
+ do j=1,3
+ d_t(j,i)=d_t(j,i)+0.5d0*d_a(j,i)*d_time
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ d_t(j,inres)=d_t(j,inres)+0.5d0*d_a(j,inres)*d_time
+ enddo
+ endif
+ enddo
+ return
+ end subroutine RESPA_vel
+!-----------------------------------------------------------------------------
+ subroutine verlet1
+! Applying velocity Verlet algorithm - step 1 to coordinates
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+ real(kind=8) :: adt,adt2
+ integer :: i,j,inres
+
+#ifdef DEBUG
+ write (iout,*) "VELVERLET1 START: DC"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
+ (dc(j,i+nres),j=1,3)
+ enddo
+#endif
+ do j=1,3
+ adt=d_a_old(j,0)*d_time
+ adt2=0.5d0*adt
+ dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
+ d_t_new(j,0)=d_t_old(j,0)+adt2
+ d_t(j,0)=d_t_old(j,0)+adt
+ enddo
+ do i=nnt,nct-1
+ do j=1,3
+ adt=d_a_old(j,i)*d_time
+ adt2=0.5d0*adt
+ dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
+ d_t_new(j,i)=d_t_old(j,i)+adt2
+ d_t(j,i)=d_t_old(j,i)+adt
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ adt=d_a_old(j,inres)*d_time
+ adt2=0.5d0*adt
+ dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
+ d_t_new(j,inres)=d_t_old(j,inres)+adt2
+ d_t(j,inres)=d_t_old(j,inres)+adt
+ enddo
+ endif
+ enddo
+#ifdef DEBUG
+ write (iout,*) "VELVERLET1 END: DC"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
+ (dc(j,i+nres),j=1,3)
+ enddo
+#endif
+ return
+ end subroutine verlet1
+!-----------------------------------------------------------------------------
+ subroutine verlet2
+! Step 2 of the velocity Verlet algorithm: update velocities
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+ integer :: i,j,inres
+
+ do j=1,3
+ d_t(j,0)=d_t_new(j,0)+0.5d0*d_a(j,0)*d_time
+ enddo
+ do i=nnt,nct-1
+ do j=1,3
+ d_t(j,i)=d_t_new(j,i)+0.5d0*d_a(j,i)*d_time
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ d_t(j,inres)=d_t_new(j,inres)+0.5d0*d_a(j,inres)*d_time
+ enddo
+ endif
+ enddo
+ return
+ end subroutine verlet2
+!-----------------------------------------------------------------------------
+ subroutine sddir_precalc
+! Applying velocity Verlet algorithm - step 1 to coordinates
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+ use MPI_data
+ use control_data
+#ifdef MPI
+ include 'mpif.h'
+#endif
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+!el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
+!el common /stochcalc/ stochforcvec
+ real(kind=8) :: time00
+!
+! Compute friction and stochastic forces
+!
+#ifdef MPI
+ time00=MPI_Wtime()
+ call friction_force
+ time_fric=time_fric+MPI_Wtime()-time00
+ time00=MPI_Wtime()
+ call stochastic_force(stochforcvec)
+ time_stoch=time_stoch+MPI_Wtime()-time00
+#endif
+!
+! Compute the acceleration due to friction forces (d_af_work) and stochastic
+! forces (d_as_work)
+!
+ call ginv_mult(fric_work, d_af_work)
+ call ginv_mult(stochforcvec, d_as_work)
+ return
+ end subroutine sddir_precalc
+!-----------------------------------------------------------------------------
+ subroutine sddir_verlet1
+! Applying velocity Verlet algorithm - step 1 to velocities
+!
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! Revised 3/31/05 AL: correlation between random contributions to
+! position and velocity increments included.
+ real(kind=8) :: sqrt13 = 0.57735026918962576451d0 ! 1/sqrt(3)
+ real(kind=8) :: adt,adt2
+ integer :: i,j,ind,inres
+!
+! Add the contribution from BOTH friction and stochastic force to the
+! coordinates, but ONLY the contribution from the friction forces to velocities
+!
+ do j=1,3
+ adt=(d_a_old(j,0)+d_af_work(j))*d_time
+ adt2=0.5d0*adt+sqrt13*d_as_work(j)*d_time
+ dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
+ d_t_new(j,0)=d_t_old(j,0)+0.5d0*adt
+ d_t(j,0)=d_t_old(j,0)+adt
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ adt=(d_a_old(j,i)+d_af_work(ind+j))*d_time
+ adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
+ dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
+ d_t_new(j,i)=d_t_old(j,i)+0.5d0*adt
+ d_t(j,i)=d_t_old(j,i)+adt
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ adt=(d_a_old(j,inres)+d_af_work(ind+j))*d_time
+ adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
+ dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
+ d_t_new(j,inres)=d_t_old(j,inres)+0.5d0*adt
+ d_t(j,inres)=d_t_old(j,inres)+adt
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ return
+ end subroutine sddir_verlet1
+!-----------------------------------------------------------------------------
+ subroutine sddir_verlet2
+! Calculating the adjusted velocities for accelerations
+!
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+ real(kind=8),dimension(6*nres) :: stochforcvec,d_as_work1 !(MAXRES6) maxres6=6*maxres
+ real(kind=8) :: cos60 = 0.5d0, sin60 = 0.86602540378443864676d0
+ integer :: i,j,ind,inres
+! Revised 3/31/05 AL: correlation between random contributions to
+! position and velocity increments included.
+! The correlation coefficients are calculated at low-friction limit.
+! Also, friction forces are now not calculated with new velocities.
+
+! call friction_force
+ call stochastic_force(stochforcvec)
+!
+! Compute the acceleration due to friction forces (d_af_work) and stochastic
+! forces (d_as_work)
+!
+ call ginv_mult(stochforcvec, d_as_work1)
+
+!
+! Update velocities
+!
+ do j=1,3
+ d_t(j,0)=d_t_new(j,0)+(0.5d0*(d_a(j,0)+d_af_work(j)) &
+ +sin60*d_as_work(j)+cos60*d_as_work1(j))*d_time
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ d_t(j,i)=d_t_new(j,i)+(0.5d0*(d_a(j,i)+d_af_work(ind+j)) &
+ +sin60*d_as_work(ind+j)+cos60*d_as_work1(ind+j))*d_time
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ d_t(j,inres)=d_t_new(j,inres)+(0.5d0*(d_a(j,inres) &
+ +d_af_work(ind+j))+sin60*d_as_work(ind+j) &
+ +cos60*d_as_work1(ind+j))*d_time
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ return
+ end subroutine sddir_verlet2
+!-----------------------------------------------------------------------------
+ subroutine max_accel
+!
+! Find the maximum difference in the accelerations of the the sites
+! at the beginning and the end of the time step.
+!
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+ real(kind=8),dimension(3) :: aux,accel,accel_old
+ real(kind=8) :: dacc
+ integer :: i,j
+
+ do j=1,3
+! aux(j)=d_a(j,0)-d_a_old(j,0)
+ accel_old(j)=d_a_old(j,0)
+ accel(j)=d_a(j,0)
+ enddo
+ amax=0.0d0
+ do i=nnt,nct
+! Backbone
+ if (i.lt.nct) then
+! 7/3/08 changed to asymmetric difference
+ do j=1,3
+! accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i))
+ accel_old(j)=accel_old(j)+0.5d0*d_a_old(j,i)
+ accel(j)=accel(j)+0.5d0*d_a(j,i)
+! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
+ if (dabs(accel(j)).gt.dabs(accel_old(j))) then
+ dacc=dabs(accel(j)-accel_old(j))
+! write (iout,*) i,dacc
+ if (dacc.gt.amax) amax=dacc
+ endif
+ enddo
+ endif
+ enddo
+! Side chains
+ do j=1,3
+! accel(j)=aux(j)
+ accel_old(j)=d_a_old(j,0)
+ accel(j)=d_a(j,0)
+ enddo
+ if (nnt.eq.2) then
+ do j=1,3
+ accel_old(j)=accel_old(j)+d_a_old(j,1)
+ accel(j)=accel(j)+d_a(j,1)
+ enddo
+ endif
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+! accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres)
+ accel_old(j)=accel_old(j)+d_a_old(j,i+nres)
+ accel(j)=accel(j)+d_a(j,i+nres)
+ enddo
+ endif
+ do j=1,3
+! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
+ if (dabs(accel(j)).gt.dabs(accel_old(j))) then
+ dacc=dabs(accel(j)-accel_old(j))
+! write (iout,*) "side-chain",i,dacc
+ if (dacc.gt.amax) amax=dacc
+ endif
+ enddo
+ do j=1,3
+ accel_old(j)=accel_old(j)+d_a_old(j,i)
+ accel(j)=accel(j)+d_a(j,i)
+! aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i)
+ enddo
+ enddo
+ return
+ end subroutine max_accel
+!-----------------------------------------------------------------------------
+ subroutine predict_edrift(epdrift)
+!
+! Predict the drift of the potential energy
+!
+ use energy_data
+ use control_data, only: lmuca
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.MUCA'
+ real(kind=8) :: epdrift,epdriftij
+ integer :: i,j
+! Drift of the potential energy
+ epdrift=0.0d0
+ do i=nnt,nct
+! Backbone
+ if (i.lt.nct) then
+ do j=1,3
+ epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i))
+ if (lmuca) epdriftij=epdriftij*factor
+! write (iout,*) "back",i,j,epdriftij
+ if (epdriftij.gt.epdrift) epdrift=epdriftij
+ enddo
+ endif
+! Side chains
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ epdriftij= &
+ dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
+ if (lmuca) epdriftij=epdriftij*factor
+! write (iout,*) "side",i,j,epdriftij
+ if (epdriftij.gt.epdrift) epdrift=epdriftij
+ enddo
+ endif
+ enddo
+ epdrift=0.5d0*epdrift*d_time*d_time
+! write (iout,*) "epdrift",epdrift
+ return
+ end subroutine predict_edrift
+!-----------------------------------------------------------------------------
+ subroutine verlet_bath
+!
+! Coupling to the thermostat by using the Berendsen algorithm
+!
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+ real(kind=8) :: T_half,fact
+ integer :: i,j,inres
+!
+ T_half=2.0d0/(dimen3*Rb)*EK
+ fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0))
+! write(iout,*) "T_half", T_half
+! write(iout,*) "EK", EK
+! write(iout,*) "fact", fact
+ do j=1,3
+ d_t(j,0)=fact*d_t(j,0)
+ enddo
+ do i=nnt,nct-1
+ do j=1,3
+ d_t(j,i)=fact*d_t(j,i)
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ d_t(j,inres)=fact*d_t(j,inres)
+ enddo
+ endif
+ enddo
+ return
+ end subroutine verlet_bath
+!-----------------------------------------------------------------------------
+ subroutine init_MD
+! Set up the initial conditions of a MD simulation
+ use comm_gucio
+ use energy_data
+ use control, only:tcpu
+!el use io_basic, only:ilen
+ use control_data
+ use MPI_data
+ use minimm, only:minim_dc,minimize,sc_move
+ use io_config, only:readrst
+ use io, only:statout
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+#ifdef MP
+ include 'mpif.h'
+ character(len=16) :: form
+ integer :: IERROR,ERRCODE
+#endif
+! include 'COMMON.SETUP'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.REMD'
+ real(kind=8),dimension(0:n_ene) :: energia_long,energia_short
+ real(kind=8),dimension(3) :: vcm,incr,L
+ real(kind=8) :: xv,sigv,lowb,highb
+ real(kind=8),dimension(6*nres) :: varia !(maxvar) (maxvar=6*maxres)
+ character(len=256) :: qstr
+!el integer ilen
+!el external ilen
+ character(len=50) :: tytul
+ logical :: file_exist
+!el common /gucio/ cm
+ integer :: i,j,ipos,iq,iw,nft_sc,iretcode,nfun,itime,ierr
+ real(kind=8) :: etot,tt0
+ logical :: fail
+
+ d_time0=d_time
+! write(iout,*) "d_time", d_time
+! Compute the standard deviations of stochastic forces for Langevin dynamics
+! if the friction coefficients do not depend on surface area
+ if (lang.gt.0 .and. .not.surfarea) then
+ do i=nnt,nct-1
+ stdforcp(i)=stdfp*dsqrt(gamp)
+ enddo
+ do i=nnt,nct
+ stdforcsc(i)=stdfsc(iabs(itype(i))) &
+ *dsqrt(gamsc(iabs(itype(i))))
+ enddo
+ endif
+! Open the pdb file for snapshotshots
+#ifdef MPI
+ if(mdpdb) then
+ if (ilen(tmpdir).gt.0) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
+ liczba(:ilen(liczba))//".pdb")
+ open(ipdb,&
+ file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
+ //".pdb")
+ else
+#ifdef NOXDR
+ if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
+ liczba(:ilen(liczba))//".x")
+ cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
+ //".x"
+#else
+ if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
+ liczba(:ilen(liczba))//".cx")
+ cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
+ //".cx"
+#endif
+ endif
+#else
+ if(mdpdb) then
+ if (ilen(tmpdir).gt.0) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb")
+ open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb")
+ else
+ if (ilen(tmpdir).gt.0) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx")
+ cartname=prefix(:ilen(prefix))//"_MD.cx"
+ endif
+#endif
+ if (usampl) then
+ write (qstr,'(256(1h ))')
+ ipos=1
+ do i=1,nfrag
+ iq = qinfrag(i,iset)*10
+ iw = wfrag(i,iset)/100
+ if (iw.gt.0) then
+ if(me.eq.king.or..not.out1file) &
+ write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw
+ write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw
+ ipos=ipos+7
+ endif
+ enddo
+ do i=1,npair
+ iq = qinpair(i,iset)*10
+ iw = wpair(i,iset)/100
+ if (iw.gt.0) then
+ if(me.eq.king.or..not.out1file) &
+ write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw
+ write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw
+ ipos=ipos+7
+ endif
+ enddo
+! pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb'
+#ifdef NOXDR
+! cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x'
+#else
+! cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx'
+#endif
+! statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat'
+ endif
+ icg=1
+ if (rest) then
+ if (restart1file) then
+ if (me.eq.king) &
+ inquire(file=mremd_rst_name,exist=file_exist)
+ write (*,*) me," Before broadcast: file_exist",file_exist
+#ifdef MPI !el
+ call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM,&
+ IERR)
+#endif !el
+ write (*,*) me," After broadcast: file_exist",file_exist
+! inquire(file=mremd_rst_name,exist=file_exist)
+ if(me.eq.king.or..not.out1file) &
+ write(iout,*) "Initial state read by master and distributed"
+ else
+ if (ilen(tmpdir).gt.0) &
+ call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_' &
+ //liczba(:ilen(liczba))//'.rst')
+ inquire(file=rest2name,exist=file_exist)
+ endif
+ if(file_exist) then
+ if(.not.restart1file) then
+ if(me.eq.king.or..not.out1file) &
+ write(iout,*) "Initial state will be read from file ",&
+ rest2name(:ilen(rest2name))
+ call readrst
+ endif
+ call rescale_weights(t_bath)
+ else
+ if(me.eq.king.or..not.out1file)then
+ if (restart1file) then
+ write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)),&
+ " does not exist"
+ else
+ write(iout,*) "File ",rest2name(:ilen(rest2name)),&
+ " does not exist"
+ endif
+ write(iout,*) "Initial velocities randomly generated"
+ endif
+ call random_vel
+ totT=0.0d0
+ endif
+ else
+! Generate initial velocities
+ if(me.eq.king.or..not.out1file) &
+ write(iout,*) "Initial velocities randomly generated"
+ call random_vel
+ totT=0.0d0
+ endif
+! rest2name = prefix(:ilen(prefix))//'.rst'
+ if(me.eq.king.or..not.out1file)then
+ write (iout,*) "Initial velocities"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+! Zeroing the total angular momentum of the system
+ write(iout,*) "Calling the zero-angular momentum subroutine"
+ endif
+ call inertia_tensor
+! Getting the potential energy and forces and velocities and accelerations
+ call vcm_vel(vcm)
+! write (iout,*) "velocity of the center of the mass:"
+! write (iout,*) (vcm(j),j=1,3)
+ do j=1,3
+ d_t(j,0)=d_t(j,0)-vcm(j)
+ enddo
+! Removing the velocity of the center of mass
+ call vcm_vel(vcm)
+ if(me.eq.king.or..not.out1file)then
+ write (iout,*) "vcm right after adjustment:"
+ write (iout,*) (vcm(j),j=1,3)
+ endif
+ if (.not.rest) then
+ call chainbuild
+ if(iranconf.ne.0) then
+ if (overlapsc) then
+ print *, 'Calling OVERLAP_SC'
+ call overlap_sc(fail)
+ endif
+ if (searchsc) then
+ call sc_move(2,nres-1,10,1d10,nft_sc,etot)
+ print *,'SC_move',nft_sc,etot
+ if(me.eq.king.or..not.out1file) &
+ write(iout,*) 'SC_move',nft_sc,etot
+ endif
+
+ if(dccart)then
+ print *, 'Calling MINIM_DC'
+ call minim_dc(etot,iretcode,nfun)
+ else
+ call geom_to_var(nvar,varia)
+ print *,'Calling MINIMIZE.'
+ call minimize(etot,varia,iretcode,nfun)
+ call var_to_geom(nvar,varia)
+ endif
+ if(me.eq.king.or..not.out1file) &
+ write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
+ endif
+ endif
+ call chainbuild_cart
+ call kinetic(EK)
+ if (tbf) then
+ call verlet_bath
+ endif
+ kinetic_T=2.0d0/(dimen3*Rb)*EK
+ if(me.eq.king.or..not.out1file)then
+ call cartprint
+ call intout
+ endif
+#ifdef MPI
+ tt0=MPI_Wtime()
+#else
+ tt0=tcpu()
+#endif
+ call zerograd
+ call etotal(potEcomp)
+ if (large) call enerprint(potEcomp)
+#ifdef TIMING_ENE
+#ifdef MPI
+ t_etotal=t_etotal+MPI_Wtime()-tt0
+#else
+ t_etotal=t_etotal+tcpu()-tt0
+#endif
+#endif
+ potE=potEcomp(0)
+ call cartgrad
+ call lagrangian
+ call max_accel
+ if (amax*d_time .gt. dvmax) then
+ d_time=d_time*dvmax/amax
+ if(me.eq.king.or..not.out1file) write (iout,*) &
+ "Time step reduced to",d_time,&
+ " because of too large initial acceleration."
+ endif
+ if(me.eq.king.or..not.out1file)then
+ write(iout,*) "Potential energy and its components"
+ call enerprint(potEcomp)
+! write(iout,*) (potEcomp(i),i=0,n_ene)
+ endif
+ potE=potEcomp(0)-potEcomp(20)
+ totE=EK+potE
+ itime=0
+ if (ntwe.ne.0) call statout(itime)
+ if(me.eq.king.or..not.out1file) &
+ write (iout,'(/a/3(a25,1pe14.5/))') "Initial:", &
+ " Kinetic energy",EK," Potential energy",potE, &
+ " Total energy",totE," Maximum acceleration ", &
+ amax
+ if (large) then
+ write (iout,*) "Initial coordinates"
+ do i=1,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3),&
+ (c(j,i+nres),j=1,3)
+ enddo
+ write (iout,*) "Initial dC"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),&
+ (dc(j,i+nres),j=1,3)
+ enddo
+ write (iout,*) "Initial velocities"
+ write (iout,"(13x,' backbone ',23x,' side chain')")
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
+ (d_t(j,i+nres),j=1,3)
+ enddo
+ write (iout,*) "Initial accelerations"
+ do i=0,nres
+! write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
+ write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ endif
+ do i=0,2*nres
+ do j=1,3
+ dc_old(j,i)=dc(j,i)
+ d_t_old(j,i)=d_t(j,i)
+ d_a_old(j,i)=d_a(j,i)
+ enddo
+! write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3)
+ enddo
+ if (RESPA) then
+#ifdef MPI
+ tt0 =MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+ call zerograd
+ call etotal_short(energia_short)
+ if (large) call enerprint(potEcomp)
+#ifdef TIMING_ENE
+#ifdef MPI
+ t_eshort=t_eshort+MPI_Wtime()-tt0
+#else
+ t_eshort=t_eshort+tcpu()-tt0
+#endif
+#endif
+ call cartgrad
+ call lagrangian
+ if(.not.out1file .and. large) then
+ write (iout,*) "energia_long",energia_long(0),&
+ " energia_short",energia_short(0),&
+ " total",energia_long(0)+energia_short(0)
+ write (iout,*) "Initial fast-force accelerations"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ endif
+! 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
+ do i=0,2*nres
+ do j=1,3
+ d_a_short(j,i)=d_a(j,i)
+ enddo
+ enddo
+#ifdef MPI
+ tt0=MPI_Wtime()
+#else
+ tt0=tcpu()
+#endif
+ call zerograd
+ call etotal_long(energia_long)
+ if (large) call enerprint(potEcomp)
+#ifdef TIMING_ENE
+#ifdef MPI
+ t_elong=t_elong+MPI_Wtime()-tt0
+#else
+ t_elong=t_elong+tcpu()-tt0
+#endif
+#endif
+ call cartgrad
+ call lagrangian
+ if(.not.out1file .and. large) then
+ write (iout,*) "energia_long",energia_long(0)
+ write (iout,*) "Initial slow-force accelerations"
+ do i=0,nres
+ write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
+ (d_a(j,i+nres),j=1,3)
+ enddo
+ endif
+#ifdef MPI
+ t_enegrad=t_enegrad+MPI_Wtime()-tt0
+#else
+ t_enegrad=t_enegrad+tcpu()-tt0
+#endif
+ endif
+ return
+ end subroutine init_MD
+!-----------------------------------------------------------------------------
+ subroutine random_vel
+
+! implicit real*8 (a-h,o-z)
+ use energy_data
+ use random, only:anorm_distr
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+ real(kind=8) :: xv,sigv,lowb,highb ,Ek1
+ integer :: i,j,ii,k,ind
+! Generate random velocities from Gaussian distribution of mean 0 and std of KT/m
+! First generate velocities in the eigenspace of the G matrix
+! write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3
+! call flush(iout)
+ xv=0.0d0
+ ii=0
+ do i=1,dimen
+ do k=1,3
+ ii=ii+1
+ sigv=dsqrt((Rb*t_bath)/geigen(i))
+ lowb=-5*sigv
+ highb=5*sigv
+ d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb)
+! write (iout,*) "i",i," ii",ii," geigen",geigen(i),&
+! " d_t_work_new",d_t_work_new(ii)
+ enddo
+ enddo
+! diagnostics
+! Ek1=0.0d0
+! ii=0
+! do i=1,dimen
+! do k=1,3
+! ii=ii+1
+! Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2
+! enddo
+! enddo
+! write (iout,*) "Ek from eigenvectors",Ek1
+! end diagnostics
+! Transform velocities to UNRES coordinate space
+ do k=0,2
+ do i=1,dimen
+ ind=(i-1)*3+k+1
+ d_t_work(ind)=0.0d0
+ do j=1,dimen
+ d_t_work(ind)=d_t_work(ind) &
+ +Gvec(i,j)*d_t_work_new((j-1)*3+k+1)
+ enddo
+! write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind)
+! call flush(iout)
+ enddo
+ enddo
+! Transfer to the d_t vector
+ do j=1,3
+ d_t(j,0)=d_t_work(j)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ ind=ind+1
+ d_t(j,i)=d_t_work(ind)
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ ind=ind+1
+ d_t(j,i+nres)=d_t_work(ind)
+ enddo
+ endif
+ enddo
+! call kinetic(EK)
+! write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",&
+! 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
+! call flush(iout)
+ return
+ end subroutine random_vel
+!-----------------------------------------------------------------------------
+#ifndef LANG0
+ subroutine sd_verlet_p_setup
+! Sets up the parameters of stochastic Verlet algorithm
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+ use control, only: tcpu
+ use control_data
+#ifdef MPI
+ include 'mpif.h'
+#endif
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+ real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
+ real(kind=8) :: pterm,vterm,rho,rhoc,vsig
+ real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
+ prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
+ logical :: lprn = .false.
+ real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
+ real(kind=8) :: ktm,gdt,egdt,gdt2,gdt3,gdt4,gdt5,gdt6,gdt7,gdt8,&
+ gdt9,psig,tt0
+ integer :: i,maxres2
+#ifdef MPI
+ tt0 = MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+!
+! AL 8/17/04 Code adapted from tinker
+!
+! Get the frictional and random terms for stochastic dynamics in the
+! eigenspace of mass-scaled UNRES friction matrix
+!
+ maxres2=2*nres
+ do i = 1, dimen
+ gdt = fricgam(i) * d_time
+!
+! Stochastic dynamics reduces to simple MD for zero friction
+!
+ if (gdt .le. zero) then
+ pfric_vec(i) = 1.0d0
+ vfric_vec(i) = d_time
+ afric_vec(i) = 0.5d0 * d_time * d_time
+ prand_vec(i) = 0.0d0
+ vrand_vec1(i) = 0.0d0
+ vrand_vec2(i) = 0.0d0
+!
+! Analytical expressions when friction coefficient is large
+!
+ else
+ if (gdt .ge. gdt_radius) then
+ egdt = dexp(-gdt)
+ pfric_vec(i) = egdt
+ vfric_vec(i) = (1.0d0-egdt) / fricgam(i)
+ afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i)
+ pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt
+ vterm = 1.0d0 - egdt**2
+ rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm)
+!
+! Use series expansions when friction coefficient is small
+!
+ else
+ gdt2 = gdt * gdt
+ gdt3 = gdt * gdt2
+ gdt4 = gdt2 * gdt2
+ gdt5 = gdt2 * gdt3
+ gdt6 = gdt3 * gdt3
+ gdt7 = gdt3 * gdt4
+ gdt8 = gdt4 * gdt4
+ gdt9 = gdt4 * gdt5
+ afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0 &
+ - gdt5/120.0d0 + gdt6/720.0d0 &
+ - gdt7/5040.0d0 + gdt8/40320.0d0 &
+ - gdt9/362880.0d0) / fricgam(i)**2
+ vfric_vec(i) = d_time - fricgam(i)*afric_vec(i)
+ pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i)
+ pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0 &
+ + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0 &
+ + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0 &
+ + 127.0d0*gdt9/90720.0d0
+ vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0 &
+ - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0 &
+ - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0 &
+ - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0
+ rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0 &
+ - 17.0d0*gdt2/1280.0d0 &
+ + 17.0d0*gdt3/6144.0d0 &
+ + 40967.0d0*gdt4/34406400.0d0 &
+ - 57203.0d0*gdt5/275251200.0d0 &
+ - 1429487.0d0*gdt6/13212057600.0d0)
+ end if
+!
+! Compute the scaling factors of random terms for the nonzero friction case
+!
+ ktm = 0.5d0*d_time/fricgam(i)
+ psig = dsqrt(ktm*pterm) / fricgam(i)
+ vsig = dsqrt(ktm*vterm)
+ rhoc = dsqrt(1.0d0 - rho*rho)
+ prand_vec(i) = psig
+ vrand_vec1(i) = vsig * rho
+ vrand_vec2(i) = vsig * rhoc
+ end if
+ end do
+ if (lprn) then
+ write (iout,*) &
+ "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
+ " vrand_vec2"
+ do i=1,dimen
+ write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
+ afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
+ enddo
+ endif
+!
+! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
+!
+#ifndef LANG0
+ call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
+ call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
+ call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
+ call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
+ call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1)
+ call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
+#endif
+#ifdef MPI
+ t_sdsetup=t_sdsetup+MPI_Wtime()
+#else
+ t_sdsetup=t_sdsetup+tcpu()-tt0
+#endif
+ return
+ end subroutine sd_verlet_p_setup
+!-----------------------------------------------------------------------------
+ subroutine eigtransf1(n,ndim,ab,d,c)
+
+!el implicit none
+ integer :: n,ndim
+ real(kind=8) :: ab(ndim,ndim,n),c(ndim,n),d(ndim)
+ integer :: i,j,k
+ do i=1,n
+ do j=1,n
+ c(i,j)=0.0d0
+ do k=1,n
+ c(i,j)=c(i,j)+ab(k,j,i)*d(k)
+ enddo
+ enddo
+ enddo
+ return
+ end subroutine eigtransf1
+!-----------------------------------------------------------------------------
+ subroutine eigtransf(n,ndim,a,b,d,c)
+
+!el implicit none
+ integer :: n,ndim
+ real(kind=8) :: a(ndim,n),b(ndim,n),c(ndim,n),d(ndim)
+ integer :: i,j,k
+ do i=1,n
+ do j=1,n
+ c(i,j)=0.0d0
+ do k=1,n
+ c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k)
+ enddo
+ enddo
+ enddo
+ return
+ end subroutine eigtransf
+!-----------------------------------------------------------------------------
+ subroutine sd_verlet1
+
+! Applying stochastic velocity Verlet algorithm - step 1 to velocities
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+!el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
+!el common /stochcalc/ stochforcvec
+ logical :: lprn = .false.
+ real(kind=8) :: ddt1,ddt2
+ integer :: i,j,ind,inres
+
+! write (iout,*) "dc_old"
+! do i=0,nres
+! write (iout,'(i5,3f10.5,5x,3f10.5)')
+! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
+! enddo
+ do j=1,3
+ dc_work(j)=dc_old(j,0)
+ d_t_work(j)=d_t_old(j,0)
+ d_a_work(j)=d_a_old(j,0)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ dc_work(ind+j)=dc_old(j,i)
+ d_t_work(ind+j)=d_t_old(j,i)
+ d_a_work(ind+j)=d_a_old(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ dc_work(ind+j)=dc_old(j,i+nres)
+ d_t_work(ind+j)=d_t_old(j,i+nres)
+ d_a_work(ind+j)=d_a_old(j,i+nres)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+#ifndef LANG0
+ if (lprn) then
+ write (iout,*) &
+ "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
+ " vrand_mat2"
+ do i=1,dimen
+ do j=1,dimen
+ write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
+ vfric_mat(i,j),afric_mat(i,j),&
+ prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
+ enddo
+ enddo
+ endif
+ do i=1,dimen
+ ddt1=0.0d0
+ ddt2=0.0d0
+ do j=1,dimen
+ dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
+ +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
+ ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
+ ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
+ enddo
+ d_t_work_new(i)=ddt1+0.5d0*ddt2
+ d_t_work(i)=ddt1+ddt2
+ enddo
+#endif
+ do j=1,3
+ dc(j,0)=dc_work(j)
+ d_t(j,0)=d_t_work(j)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ dc(j,i)=dc_work(ind+j)
+ d_t(j,i)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ inres=i+nres
+ do j=1,3
+ dc(j,inres)=dc_work(ind+j)
+ d_t(j,inres)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ return
+ end subroutine sd_verlet1
+!-----------------------------------------------------------------------------
+ subroutine sd_verlet2
+
+! Calculating the adjusted velocities for accelerations
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+!el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
+ real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
+!el common /stochcalc/ stochforcvec
+!
+ real(kind=8) :: ddt1,ddt2
+ integer :: i,j,ind,inres
+! Compute the stochastic forces which contribute to velocity change
+!
+ call stochastic_force(stochforcvecV)
+
+#ifndef LANG0
+ do i=1,dimen
+ ddt1=0.0d0
+ ddt2=0.0d0
+ do j=1,dimen
+ ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
+ ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+ &
+ vrand_mat2(i,j)*stochforcvecV(j)
+ enddo
+ d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
+ enddo
+#endif
+ do j=1,3
+ d_t(j,0)=d_t_work(j)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ d_t(j,i)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ d_t(j,inres)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ return
+ end subroutine sd_verlet2
+!-----------------------------------------------------------------------------
+ subroutine sd_verlet_ciccotti_setup
+
+! Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's
+! version
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+ use control, only: tcpu
+ use control_data
+#ifdef MPI
+ include 'mpif.h'
+#endif
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+ real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
+ real(kind=8) :: pterm,vterm,rho,rhoc,vsig
+ real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
+ prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
+ logical :: lprn = .false.
+ real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
+ real(kind=8) :: ktm,gdt,egdt,tt0
+ integer :: i,maxres2
+#ifdef MPI
+ tt0 = MPI_Wtime()
+#else
+ tt0 = tcpu()
+#endif
+!
+! AL 8/17/04 Code adapted from tinker
+!
+! Get the frictional and random terms for stochastic dynamics in the
+! eigenspace of mass-scaled UNRES friction matrix
+!
+ maxres2=2*nres
+ do i = 1, dimen
+ write (iout,*) "i",i," fricgam",fricgam(i)
+ gdt = fricgam(i) * d_time
+!
+! Stochastic dynamics reduces to simple MD for zero friction
+!
+ if (gdt .le. zero) then
+ pfric_vec(i) = 1.0d0
+ vfric_vec(i) = d_time
+ afric_vec(i) = 0.5d0*d_time*d_time
+ prand_vec(i) = afric_vec(i)
+ vrand_vec2(i) = vfric_vec(i)
+!
+! Analytical expressions when friction coefficient is large
+!
+ else
+ egdt = dexp(-gdt)
+ pfric_vec(i) = egdt
+ vfric_vec(i) = dexp(-0.5d0*gdt)*d_time
+ afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time
+ prand_vec(i) = afric_vec(i)
+ vrand_vec2(i) = vfric_vec(i)
+!
+! Compute the scaling factors of random terms for the nonzero friction case
+!
+! ktm = 0.5d0*d_time/fricgam(i)
+! psig = dsqrt(ktm*pterm) / fricgam(i)
+! vsig = dsqrt(ktm*vterm)
+! prand_vec(i) = psig*afric_vec(i)
+! vrand_vec2(i) = vsig*vfric_vec(i)
+ end if
+ end do
+ if (lprn) then
+ write (iout,*) &
+ "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
+ " vrand_vec2"
+ do i=1,dimen
+ write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
+ afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
+ enddo
+ endif
+!
+! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
+!
+ call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
+ call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
+ call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
+ call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
+ call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
+#ifdef MPI
+ t_sdsetup=t_sdsetup+MPI_Wtime()
+#else
+ t_sdsetup=t_sdsetup+tcpu()-tt0
+#endif
+ return
+ end subroutine sd_verlet_ciccotti_setup
+!-----------------------------------------------------------------------------
+ subroutine sd_verlet1_ciccotti
+
+! Applying stochastic velocity Verlet algorithm - step 1 to velocities
+! implicit real*8 (a-h,o-z)
+ use energy_data
+! include 'DIMENSIONS'
+#ifdef MPI
+ include 'mpif.h'
+#endif
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+!el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
+!el common /stochcalc/ stochforcvec
+ logical :: lprn = .false.
+ real(kind=8) :: ddt1,ddt2
+ integer :: i,j,ind,inres
+! write (iout,*) "dc_old"
+! do i=0,nres
+! write (iout,'(i5,3f10.5,5x,3f10.5)')
+! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
+! enddo
+ do j=1,3
+ dc_work(j)=dc_old(j,0)
+ d_t_work(j)=d_t_old(j,0)
+ d_a_work(j)=d_a_old(j,0)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ dc_work(ind+j)=dc_old(j,i)
+ d_t_work(ind+j)=d_t_old(j,i)
+ d_a_work(ind+j)=d_a_old(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ dc_work(ind+j)=dc_old(j,i+nres)
+ d_t_work(ind+j)=d_t_old(j,i+nres)
+ d_a_work(ind+j)=d_a_old(j,i+nres)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+
+#ifndef LANG0
+ if (lprn) then
+ write (iout,*) &
+ "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
+ " vrand_mat2"
+ do i=1,dimen
+ do j=1,dimen
+ write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
+ vfric_mat(i,j),afric_mat(i,j),&
+ prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
+ enddo
+ enddo
+ endif
+ do i=1,dimen
+ ddt1=0.0d0
+ ddt2=0.0d0
+ do j=1,dimen
+ dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
+ +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
+ ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
+ ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
+ enddo
+ d_t_work_new(i)=ddt1+0.5d0*ddt2
+ d_t_work(i)=ddt1+ddt2
+ enddo
+#endif
+ do j=1,3
+ dc(j,0)=dc_work(j)
+ d_t(j,0)=d_t_work(j)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ dc(j,i)=dc_work(ind+j)
+ d_t(j,i)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ dc(j,inres)=dc_work(ind+j)
+ d_t(j,inres)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ return
+ end subroutine sd_verlet1_ciccotti
+!-----------------------------------------------------------------------------
+ subroutine sd_verlet2_ciccotti
+
+! Calculating the adjusted velocities for accelerations
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+!el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
+ real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
+!el common /stochcalc/ stochforcvec
+ real(kind=8) :: ddt1,ddt2
+ integer :: i,j,ind,inres
+!
+! Compute the stochastic forces which contribute to velocity change
+!
+ call stochastic_force(stochforcvecV)
+#ifndef LANG0
+ do i=1,dimen
+ ddt1=0.0d0
+ ddt2=0.0d0
+ do j=1,dimen
+
+ ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
+! ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j)
+ ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j)
+ enddo
+ d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
+ enddo
+#endif
+ do j=1,3
+ d_t(j,0)=d_t_work(j)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ d_t(j,i)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ do j=1,3
+ d_t(j,inres)=d_t_work(ind+j)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ return
+ end subroutine sd_verlet2_ciccotti
+#endif
+!-----------------------------------------------------------------------------
+! moments.f
+!-----------------------------------------------------------------------------
+ subroutine inertia_tensor
+
+! Calculating the intertia tensor for the entire protein in order to
+! remove the perpendicular components of velocity matrix which cause
+! the molecule to rotate.
+ use comm_gucio
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+
+ real(kind=8),dimension(3,3) :: Im,Imcp,eigvec,Id
+ real(kind=8),dimension(3) :: pr,eigval,L,vp,vrot
+ real(kind=8) :: M_SC,mag,mag2
+ real(kind=8),dimension(3,0:nres) :: vpp !(3,0:MAXRES)
+ real(kind=8),dimension(3) :: vs_p,pp,incr,v
+ real(kind=8),dimension(3,3) :: pr1,pr2
+
+!el common /gucio/ cm
+ integer :: iti,inres,i,j,k
+ do i=1,3
+ do j=1,3
+ Im(i,j)=0.0d0
+ pr1(i,j)=0.0d0
+ pr2(i,j)=0.0d0
+ enddo
+ L(i)=0.0d0
+ cm(i)=0.0d0
+ vrot(i)=0.0d0
+ enddo
+! calculating the center of the mass of the protein
+ do i=nnt,nct-1
+ do j=1,3
+ cm(j)=cm(j)+c(j,i)+0.5d0*dc(j,i)
+ enddo
+ enddo
+ do j=1,3
+ cm(j)=mp*cm(j)
+ enddo
+ M_SC=0.0d0
+ do i=nnt,nct
+ iti=iabs(itype(i))
+ M_SC=M_SC+msc(iabs(iti))
+ inres=i+nres
+ do j=1,3
+ cm(j)=cm(j)+msc(iabs(iti))*c(j,inres)
+ enddo
+ enddo
+ do j=1,3
+ cm(j)=cm(j)/(M_SC+(nct-nnt)*mp)
+ enddo
+
+ do i=nnt,nct-1
+ do j=1,3
+ pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
+ enddo
+ Im(1,1)=Im(1,1)+mp*(pr(2)*pr(2)+pr(3)*pr(3))
+ Im(1,2)=Im(1,2)-mp*pr(1)*pr(2)
+ Im(1,3)=Im(1,3)-mp*pr(1)*pr(3)
+ Im(2,3)=Im(2,3)-mp*pr(2)*pr(3)
+ Im(2,2)=Im(2,2)+mp*(pr(3)*pr(3)+pr(1)*pr(1))
+ Im(3,3)=Im(3,3)+mp*(pr(1)*pr(1)+pr(2)*pr(2))
+ enddo
+
+ do i=nnt,nct
+ iti=iabs(itype(i))
+ inres=i+nres
+ do j=1,3
+ pr(j)=c(j,inres)-cm(j)
+ enddo
+ Im(1,1)=Im(1,1)+msc(iabs(iti))*(pr(2)*pr(2)+pr(3)*pr(3))
+ Im(1,2)=Im(1,2)-msc(iabs(iti))*pr(1)*pr(2)
+ Im(1,3)=Im(1,3)-msc(iabs(iti))*pr(1)*pr(3)
+ Im(2,3)=Im(2,3)-msc(iabs(iti))*pr(2)*pr(3)
+ Im(2,2)=Im(2,2)+msc(iabs(iti))*(pr(3)*pr(3)+pr(1)*pr(1))
+ Im(3,3)=Im(3,3)+msc(iabs(iti))*(pr(1)*pr(1)+pr(2)*pr(2))
+ enddo
+
+ do i=nnt,nct-1
+ Im(1,1)=Im(1,1)+Ip*(1-dc_norm(1,i)*dc_norm(1,i))* &
+ vbld(i+1)*vbld(i+1)*0.25d0
+ Im(1,2)=Im(1,2)+Ip*(-dc_norm(1,i)*dc_norm(2,i))* &
+ vbld(i+1)*vbld(i+1)*0.25d0
+ Im(1,3)=Im(1,3)+Ip*(-dc_norm(1,i)*dc_norm(3,i))* &
+ vbld(i+1)*vbld(i+1)*0.25d0
+ Im(2,3)=Im(2,3)+Ip*(-dc_norm(2,i)*dc_norm(3,i))* &
+ vbld(i+1)*vbld(i+1)*0.25d0
+ Im(2,2)=Im(2,2)+Ip*(1-dc_norm(2,i)*dc_norm(2,i))* &
+ vbld(i+1)*vbld(i+1)*0.25d0
+ Im(3,3)=Im(3,3)+Ip*(1-dc_norm(3,i)*dc_norm(3,i))* &
+ vbld(i+1)*vbld(i+1)*0.25d0
+ enddo
+
+
+ do i=nnt,nct
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ iti=iabs(itype(i))
+ inres=i+nres
+ Im(1,1)=Im(1,1)+Isc(iti)*(1-dc_norm(1,inres)* &
+ dc_norm(1,inres))*vbld(inres)*vbld(inres)
+ Im(1,2)=Im(1,2)-Isc(iti)*(dc_norm(1,inres)* &
+ dc_norm(2,inres))*vbld(inres)*vbld(inres)
+ Im(1,3)=Im(1,3)-Isc(iti)*(dc_norm(1,inres)* &
+ dc_norm(3,inres))*vbld(inres)*vbld(inres)
+ Im(2,3)=Im(2,3)-Isc(iti)*(dc_norm(2,inres)* &
+ dc_norm(3,inres))*vbld(inres)*vbld(inres)
+ Im(2,2)=Im(2,2)+Isc(iti)*(1-dc_norm(2,inres)* &
+ dc_norm(2,inres))*vbld(inres)*vbld(inres)
+ Im(3,3)=Im(3,3)+Isc(iti)*(1-dc_norm(3,inres)* &
+ dc_norm(3,inres))*vbld(inres)*vbld(inres)
+ endif
+ enddo
+
+ call angmom(cm,L)
+! write(iout,*) "The angular momentum before adjustment:"
+! write(iout,*) (L(j),j=1,3)
+
+ Im(2,1)=Im(1,2)
+ Im(3,1)=Im(1,3)
+ Im(3,2)=Im(2,3)
+
+! Copying the Im matrix for the djacob subroutine
+ do i=1,3
+ do j=1,3
+ Imcp(i,j)=Im(i,j)
+ Id(i,j)=0.0d0
+ enddo
+ enddo
+
+! Finding the eigenvectors and eignvalues of the inertia tensor
+ call djacob(3,3,10000,1.0d-10,Imcp,eigvec,eigval)
+! write (iout,*) "Eigenvalues & Eigenvectors"
+! write (iout,'(5x,3f10.5)') (eigval(i),i=1,3)
+! write (iout,*)
+! do i=1,3
+! write (iout,'(i5,3f10.5)') i,(eigvec(i,j),j=1,3)
+! enddo
+! Constructing the diagonalized matrix
+ do i=1,3
+ if (dabs(eigval(i)).gt.1.0d-15) then
+ Id(i,i)=1.0d0/eigval(i)
+ else
+ Id(i,i)=0.0d0
+ endif
+ enddo
+ do i=1,3
+ do j=1,3
+ Imcp(i,j)=eigvec(j,i)
+ enddo
+ enddo
+ do i=1,3
+ do j=1,3
+ do k=1,3
+ pr1(i,j)=pr1(i,j)+Id(i,k)*Imcp(k,j)
+ enddo
+ enddo
+ enddo
+ do i=1,3
+ do j=1,3
+ do k=1,3
+ pr2(i,j)=pr2(i,j)+eigvec(i,k)*pr1(k,j)
+ enddo
+ enddo
+ enddo
+! Calculating the total rotational velocity of the molecule
+ do i=1,3
+ do j=1,3
+ vrot(i)=vrot(i)+pr2(i,j)*L(j)
+ enddo
+ enddo
+! Resetting the velocities
+ do i=nnt,nct-1
+ call vecpr(vrot(1),dc(1,i),vp)
+ do j=1,3
+ d_t(j,i)=d_t(j,i)-vp(j)
+ enddo
+ enddo
+ do i=nnt,nct
+ if(itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ inres=i+nres
+ call vecpr(vrot(1),dc(1,inres),vp)
+ do j=1,3
+ d_t(j,inres)=d_t(j,inres)-vp(j)
+ enddo
+ endif
+ enddo
+ call angmom(cm,L)
+! write(iout,*) "The angular momentum after adjustment:"
+! write(iout,*) (L(j),j=1,3)
+
+ return
+ end subroutine inertia_tensor
+!-----------------------------------------------------------------------------
+ subroutine angmom(cm,L)
+
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+
+ real(kind=8),dimension(3) :: L,cm,pr,vp,vrot,incr,v,pp
+ integer :: iti,inres,i,j
+! Calculate the angular momentum
+ do j=1,3
+ L(j)=0.0d0
+ enddo
+ do j=1,3
+ incr(j)=d_t(j,0)
+ enddo
+ do i=nnt,nct-1
+ do j=1,3
+ pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
+ enddo
+ do j=1,3
+ v(j)=incr(j)+0.5d0*d_t(j,i)
+ enddo
+ do j=1,3
+ incr(j)=incr(j)+d_t(j,i)
+ enddo
+ call vecpr(pr(1),v(1),vp)
+ do j=1,3
+ L(j)=L(j)+mp*vp(j)
+ enddo
+ do j=1,3
+ pr(j)=0.5d0*dc(j,i)
+ pp(j)=0.5d0*d_t(j,i)
+ enddo
+ call vecpr(pr(1),pp(1),vp)
+ do j=1,3
+ L(j)=L(j)+Ip*vp(j)
+ enddo
+ enddo
+ do j=1,3
+ incr(j)=d_t(j,0)
+ enddo
+ do i=nnt,nct
+ iti=iabs(itype(i))
+ inres=i+nres
+ do j=1,3
+ pr(j)=c(j,inres)-cm(j)
+ enddo
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ v(j)=incr(j)+d_t(j,inres)
+ enddo
+ else
+ do j=1,3
+ v(j)=incr(j)
+ enddo
+ endif
+ call vecpr(pr(1),v(1),vp)
+! write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3),
+! & " v",(v(j),j=1,3)," vp",(vp(j),j=1,3)
+ do j=1,3
+ L(j)=L(j)+msc(iabs(iti))*vp(j)
+ enddo
+! write (iout,*) "L",(l(j),j=1,3)
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ v(j)=incr(j)+d_t(j,inres)
+ enddo
+ call vecpr(dc(1,inres),d_t(1,inres),vp)
+ do j=1,3
+ L(j)=L(j)+Isc(iti)*vp(j)
+ enddo
+ endif
+ do j=1,3
+ incr(j)=incr(j)+d_t(j,i)
+ enddo
+ enddo
+ return
+ end subroutine angmom
+!-----------------------------------------------------------------------------
+ subroutine vcm_vel(vcm)
+
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+ real(kind=8),dimension(3) :: vcm,vv
+ real(kind=8) :: summas,amas
+ integer :: i,j
+
+ do j=1,3
+ vcm(j)=0.0d0
+ vv(j)=d_t(j,0)
+ enddo
+ summas=0.0d0
+ do i=nnt,nct
+ if (i.lt.nct) then
+ summas=summas+mp
+ do j=1,3
+ vcm(j)=vcm(j)+mp*(vv(j)+0.5d0*d_t(j,i))
+ enddo
+ endif
+ amas=msc(iabs(itype(i)))
+ summas=summas+amas
+ if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
+ do j=1,3
+ vcm(j)=vcm(j)+amas*(vv(j)+d_t(j,i+nres))
+ enddo
+ else
+ do j=1,3
+ vcm(j)=vcm(j)+amas*vv(j)
+ enddo
+ endif
+ do j=1,3
+ vv(j)=vv(j)+d_t(j,i)
+ enddo
+ enddo
+! write (iout,*) "vcm",(vcm(j),j=1,3)," summas",summas
+ do j=1,3
+ vcm(j)=vcm(j)/summas
+ enddo
+ return
+ end subroutine vcm_vel
+!-----------------------------------------------------------------------------
+! rattle.F
+!-----------------------------------------------------------------------------
+ subroutine rattle1
+! RATTLE algorithm for velocity Verlet - step 1, UNRES
+! AL 9/24/04
+ use comm_przech
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+#ifdef RATTLE
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+!el real(kind=8) :: gginv(2*nres,2*nres),&
+!el gdc(3,2*nres,2*nres)
+ real(kind=8) :: dC_uncor(3,2*nres) !,&
+!el real(kind=8) :: Cmat(2*nres,2*nres)
+ real(kind=8) :: x(2*nres),xcorr(3,2*nres) !maxres2=2*maxres
+!el common /przechowalnia/ GGinv,gdc,Cmat,nbond
+!el common /przechowalnia/ nbond
+ integer :: max_rattle = 5
+ logical :: lprn = .false., lprn1 = .false., not_done
+ real(kind=8) :: tol_rattle = 1.0d-5
+
+ integer :: ii,i,j,jj,l,ind,ind1,nres2
+ nres2=2*nres
+
+!el /common/ przechowalnia
+
+ if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
+ if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
+ if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
+!el--------
+ if (lprn) write (iout,*) "RATTLE1"
+ nbond=nct-nnt
+ do i=nnt,nct
+ if (itype(i).ne.10) nbond=nbond+1
+ enddo
+! Make a folded form of the Ginv-matrix
+ ind=0
+ ii=0
+ do i=nnt,nct-1
+ ii=ii+1
+ do j=1,3
+ ind=ind+1
+ ind1=0
+ jj=0
+ do k=nnt,nct-1
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
+ enddo
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
+ enddo
+ endif
+ enddo
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ii=ii+1
+ do j=1,3
+ ind=ind+1
+ ind1=0
+ jj=0
+ do k=nnt,nct-1
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
+ enddo
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
+ enddo
+ endif
+ enddo
+ enddo
+ endif
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix GGinv"
+ call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
+ endif
+ not_done=.true.
+ iter=0
+ do while (not_done)
+ iter=iter+1
+ if (iter.gt.max_rattle) then
+ write (iout,*) "Error - too many iterations in RATTLE."
+ stop
+ endif
+! Calculate the matrix C = GG**(-1) dC_old o dC
+ ind1=0
+ do i=nnt,nct-1
+ ind1=ind1+1
+ do j=1,3
+ dC_uncor(j,ind1)=dC(j,i)
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind1=ind1+1
+ do j=1,3
+ dC_uncor(j,ind1)=dC(j,i+nres)
+ enddo
+ endif
+ enddo
+ do i=1,nbond
+ ind=0
+ do k=nnt,nct-1
+ ind=ind+1
+ do j=1,3
+ gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
+ enddo
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ ind=ind+1
+ do j=1,3
+ gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
+ enddo
+ endif
+ enddo
+ enddo
+! Calculate deviations from standard virtual-bond lengths
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ x(ind)=vbld(i+1)**2-vbl**2
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i))**2
+ endif
+ enddo
+ if (lprn) then
+ write (iout,*) "Coordinates and violations"
+ do i=1,nbond
+ write(iout,'(i5,3f10.5,5x,e15.5)') &
+ i,(dC_uncor(j,i),j=1,3),x(i)
+ enddo
+ write (iout,*) "Velocities and violations"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
+ scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
+ endif
+ enddo
+! write (iout,*) "gdc"
+! do i=1,nbond
+! write (iout,*) "i",i
+! do j=1,nbond
+! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
+! enddo
+! enddo
+ endif
+ xmax=dabs(x(1))
+ do i=2,nbond
+ if (dabs(x(i)).gt.xmax) then
+ xmax=dabs(x(i))
+ endif
+ enddo
+ if (xmax.lt.tol_rattle) then
+ not_done=.false.
+ goto 100
+ endif
+! Calculate the matrix of the system of equations
+ do i=1,nbond
+ do j=1,nbond
+ Cmat(i,j)=0.0d0
+ do k=1,3
+ Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
+ enddo
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix Cmat"
+ call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
+ endif
+ call gauss(Cmat,X,MAXRES2,nbond,1,*10)
+! Add constraint term to positions
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ do j=1,3
+ xx=0.0d0
+ do ii=1,nbond
+ xx = xx+x(ii)*gdc(j,ind,ii)
+ enddo
+ xx=0.5d0*xx
+ dC(j,i)=dC(j,i)-xx
+ d_t_new(j,i)=d_t_new(j,i)-xx/d_time
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ do j=1,3
+ xx=0.0d0
+ do ii=1,nbond
+ xx = xx+x(ii)*gdc(j,ind,ii)
+ enddo
+ xx=0.5d0*xx
+ dC(j,i+nres)=dC(j,i+nres)-xx
+ d_t_new(j,i+nres)=d_t_new(j,i+nres)-xx/d_time
+ enddo
+ endif
+ enddo
+! Rebuild the chain using the new coordinates
+ call chainbuild_cart
+ if (lprn) then
+ write (iout,*) "New coordinates, Lagrange multipliers,",&
+ " and differences between actual and standard bond lengths"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ xx=vbld(i+1)**2-vbl**2
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i),j=1,3),x(ind),xx
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ xx=vbld(i+nres)**2-vbldsc0(1,itype(i))**2
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i+nres),j=1,3),x(ind),xx
+ endif
+ enddo
+ write (iout,*) "Velocities and violations"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
+ scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
+ endif
+ enddo
+ endif
+ enddo
+ 100 continue
+ return
+ 10 write (iout,*) "Error - singularity in solving the system",&
+ " of equations for Lagrange multipliers."
+ stop
+#else
+ write (iout,*) &
+ "RATTLE inactive; use -DRATTLE switch at compile time."
+ stop
+#endif
+ end subroutine rattle1
+!-----------------------------------------------------------------------------
+ subroutine rattle2
+! RATTLE algorithm for velocity Verlet - step 2, UNRES
+! AL 9/24/04
+ use comm_przech
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+#ifdef RATTLE
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+!el real(kind=8) :: gginv(2*nres,2*nres),&
+!el gdc(3,2*nres,2*nres)
+ real(kind=8) :: dC_uncor(3,2*nres) !,&
+!el Cmat(2*nres,2*nres)
+ real(kind=8) :: x(2*nres) !maxres2=2*maxres
+!el common /przechowalnia/ GGinv,gdc,Cmat,nbond
+!el common /przechowalnia/ nbond
+ integer :: max_rattle = 5
+ logical :: lprn = .false., lprn1 = .false., not_done
+ real(kind=8) :: tol_rattle = 1.0d-5
+ integer :: nres2
+ nres2=2*nres
+
+!el /common/ przechowalnia
+ if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
+ if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
+ if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
+!el--------
+ if (lprn) write (iout,*) "RATTLE2"
+ if (lprn) write (iout,*) "Velocity correction"
+! Calculate the matrix G dC
+ do i=1,nbond
+ ind=0
+ do k=nnt,nct-1
+ ind=ind+1
+ do j=1,3
+ gdc(j,i,ind)=GGinv(i,ind)*dC(j,k)
+ enddo
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ ind=ind+1
+ do j=1,3
+ gdc(j,i,ind)=GGinv(i,ind)*dC(j,k+nres)
+ enddo
+ endif
+ enddo
+ enddo
+! if (lprn) then
+! write (iout,*) "gdc"
+! do i=1,nbond
+! write (iout,*) "i",i
+! do j=1,nbond
+! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
+! enddo
+! enddo
+! endif
+! Calculate the matrix of the system of equations
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ do j=1,nbond
+ Cmat(ind,j)=0.0d0
+ do k=1,3
+ Cmat(ind,j)=Cmat(ind,j)+dC(k,i)*gdc(k,ind,j)
+ enddo
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ do j=1,nbond
+ Cmat(ind,j)=0.0d0
+ do k=1,3
+ Cmat(ind,j)=Cmat(ind,j)+dC(k,i+nres)*gdc(k,ind,j)
+ enddo
+ enddo
+ endif
+ enddo
+! Calculate the scalar product dC o d_t_new
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ x(ind)=scalar(d_t(1,i),dC(1,i))
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ x(ind)=scalar(d_t(1,i+nres),dC(1,i+nres))
+ endif
+ enddo
+ if (lprn) then
+ write (iout,*) "Velocities and violations"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i,ind,(d_t(j,i),j=1,3),x(ind)
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind)
+ endif
+ enddo
+ endif
+ xmax=dabs(x(1))
+ do i=2,nbond
+ if (dabs(x(i)).gt.xmax) then
+ xmax=dabs(x(i))
+ endif
+ enddo
+ if (xmax.lt.tol_rattle) then
+ not_done=.false.
+ goto 100
+ endif
+ if (lprn1) then
+ write (iout,*) "Matrix Cmat"
+ call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
+ endif
+ call gauss(Cmat,X,MAXRES2,nbond,1,*10)
+! Add constraint term to velocities
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ do j=1,3
+ xx=0.0d0
+ do ii=1,nbond
+ xx = xx+x(ii)*gdc(j,ind,ii)
+ enddo
+ d_t(j,i)=d_t(j,i)-xx
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ do j=1,3
+ xx=0.0d0
+ do ii=1,nbond
+ xx = xx+x(ii)*gdc(j,ind,ii)
+ enddo
+ d_t(j,i+nres)=d_t(j,i+nres)-xx
+ enddo
+ endif
+ enddo
+ if (lprn) then
+ write (iout,*) &
+ "New velocities, Lagrange multipliers violations"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ if (lprn) write (iout,'(2i5,3f10.5,5x,2e15.5)') &
+ i,ind,(d_t(j,i),j=1,3),x(ind),scalar(d_t(1,i),dC(1,i))
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,2e15.5)') &
+ i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind),&
+ scalar(d_t(1,i+nres),dC(1,i+nres))
+ endif
+ enddo
+ endif
+ 100 continue
+ return
+ 10 write (iout,*) "Error - singularity in solving the system",&
+ " of equations for Lagrange multipliers."
+ stop
+#else
+ write (iout,*) &
+ "RATTLE inactive; use -DRATTLE option at compile time."
+ stop
+#endif
+ end subroutine rattle2
+!-----------------------------------------------------------------------------
+ subroutine rattle_brown
+! RATTLE/LINCS algorithm for Brownian dynamics, UNRES
+! AL 9/24/04
+ use comm_przech
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+#ifdef RATTLE
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+! include 'COMMON.TIME1'
+!el real(kind=8) :: gginv(2*nres,2*nres),&
+!el gdc(3,2*nres,2*nres)
+ real(kind=8) :: dC_uncor(3,2*nres) !,&
+!el real(kind=8) :: Cmat(2*nres,2*nres)
+ real(kind=8) :: x(2*nres) !maxres2=2*maxres
+!el common /przechowalnia/ GGinv,gdc,Cmat,nbond
+!el common /przechowalnia/ nbond
+ integer :: max_rattle = 5
+ logical :: lprn = .true., lprn1 = .true., not_done
+ real(kind=8) :: tol_rattle = 1.0d-5
+ integer :: nres2
+ nres2=2*nres
+
+!el /common/ przechowalnia
+ if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
+ if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
+ if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
+!el--------
+
+ if (lprn) write (iout,*) "RATTLE_BROWN"
+ nbond=nct-nnt
+ do i=nnt,nct
+ if (itype(i).ne.10) nbond=nbond+1
+ enddo
+! Make a folded form of the Ginv-matrix
+ ind=0
+ ii=0
+ do i=nnt,nct-1
+ ii=ii+1
+ do j=1,3
+ ind=ind+1
+ ind1=0
+ jj=0
+ do k=nnt,nct-1
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
+ enddo
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
+ enddo
+ endif
+ enddo
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ii=ii+1
+ do j=1,3
+ ind=ind+1
+ ind1=0
+ jj=0
+ do k=nnt,nct-1
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
+ enddo
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ jj=jj+1
+ do l=1,3
+ ind1=ind1+1
+ if (j.eq.1 .and. l.eq.1)GGinv(ii,jj)=fricmat(ind,ind1)
+ enddo
+ endif
+ enddo
+ enddo
+ endif
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix GGinv"
+ call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
+ endif
+ not_done=.true.
+ iter=0
+ do while (not_done)
+ iter=iter+1
+ if (iter.gt.max_rattle) then
+ write (iout,*) "Error - too many iterations in RATTLE."
+ stop
+ endif
+! Calculate the matrix C = GG**(-1) dC_old o dC
+ ind1=0
+ do i=nnt,nct-1
+ ind1=ind1+1
+ do j=1,3
+ dC_uncor(j,ind1)=dC(j,i)
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind1=ind1+1
+ do j=1,3
+ dC_uncor(j,ind1)=dC(j,i+nres)
+ enddo
+ endif
+ enddo
+ do i=1,nbond
+ ind=0
+ do k=nnt,nct-1
+ ind=ind+1
+ do j=1,3
+ gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
+ enddo
+ enddo
+ do k=nnt,nct
+ if (itype(k).ne.10) then
+ ind=ind+1
+ do j=1,3
+ gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
+ enddo
+ endif
+ enddo
+ enddo
+! Calculate deviations from standard virtual-bond lengths
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ x(ind)=vbld(i+1)**2-vbl**2
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i))**2
+ endif
+ enddo
+ if (lprn) then
+ write (iout,*) "Coordinates and violations"
+ do i=1,nbond
+ write(iout,'(i5,3f10.5,5x,e15.5)') &
+ i,(dC_uncor(j,i),j=1,3),x(i)
+ enddo
+ write (iout,*) "Velocities and violations"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i,ind,(d_t(j,i),j=1,3),scalar(d_t(1,i),dC_old(1,i))
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i+nres,ind,(d_t(j,i+nres),j=1,3),&
+ scalar(d_t(1,i+nres),dC_old(1,i+nres))
+ endif
+ enddo
+ write (iout,*) "gdc"
+ do i=1,nbond
+ write (iout,*) "i",i
+ do j=1,nbond
+ write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
+ enddo
+ enddo
+ endif
+ xmax=dabs(x(1))
+ do i=2,nbond
+ if (dabs(x(i)).gt.xmax) then
+ xmax=dabs(x(i))
+ endif
+ enddo
+ if (xmax.lt.tol_rattle) then
+ not_done=.false.
+ goto 100
+ endif
+! Calculate the matrix of the system of equations
+ do i=1,nbond
+ do j=1,nbond
+ Cmat(i,j)=0.0d0
+ do k=1,3
+ Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
+ enddo
+ enddo
+ enddo
+ if (lprn1) then
+ write (iout,*) "Matrix Cmat"
+ call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
+ endif
+ call gauss(Cmat,X,MAXRES2,nbond,1,*10)
+! Add constraint term to positions
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ do j=1,3
+ xx=0.0d0
+ do ii=1,nbond
+ xx = xx+x(ii)*gdc(j,ind,ii)
+ enddo
+ xx=-0.5d0*xx
+ d_t(j,i)=d_t(j,i)+xx/d_time
+ dC(j,i)=dC(j,i)+xx
+ enddo
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ do j=1,3
+ xx=0.0d0
+ do ii=1,nbond
+ xx = xx+x(ii)*gdc(j,ind,ii)
+ enddo
+ xx=-0.5d0*xx
+ d_t(j,i+nres)=d_t(j,i+nres)+xx/d_time
+ dC(j,i+nres)=dC(j,i+nres)+xx
+ enddo
+ endif
+ enddo
+! Rebuild the chain using the new coordinates
+ call chainbuild_cart
+ if (lprn) then
+ write (iout,*) "New coordinates, Lagrange multipliers,",&
+ " and differences between actual and standard bond lengths"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ xx=vbld(i+1)**2-vbl**2
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i),j=1,3),x(ind),xx
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ xx=vbld(i+nres)**2-vbldsc0(1,itype(i))**2
+ write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
+ i,(dC(j,i+nres),j=1,3),x(ind),xx
+ endif
+ enddo
+ write (iout,*) "Velocities and violations"
+ ind=0
+ do i=nnt,nct-1
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
+ enddo
+ do i=nnt,nct
+ if (itype(i).ne.10) then
+ ind=ind+1
+ write (iout,'(2i5,3f10.5,5x,e15.5)') &
+ i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
+ scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
+ endif
+ enddo
+ endif
+ enddo
+ 100 continue
+ return
+ 10 write (iout,*) "Error - singularity in solving the system",&
+ " of equations for Lagrange multipliers."
+ stop
+#else
+ write (iout,*) &
+ "RATTLE inactive; use -DRATTLE option at compile time"
+ stop
+#endif
+ end subroutine rattle_brown
+!-----------------------------------------------------------------------------
+! stochfric.F
+!-----------------------------------------------------------------------------
+ subroutine friction_force
+
+ use energy_data
+ use REMD_data
+ use comm_syfek
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.VAR'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.IOUNITS'
+!el real(kind=8),dimension(6*nres) :: gamvec !(MAXRES6) maxres6=6*maxres
+!el common /syfek/ gamvec
+ real(kind=8) :: vv(3),vvtot(3,nres),v_work(6*nres) !,&
+!el ginvfric(2*nres,2*nres) !maxres2=2*maxres
+!el common /przechowalnia/ ginvfric
+
+ logical :: lprn = .false., checkmode = .false.
+ integer :: i,j,ind,k,nres2,nres6
+ nres2=2*nres
+ nres6=6*nres
+
+ if(.not.allocated(gamvec)) allocate(gamvec(nres6)) !(MAXRES6)
+ if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
+ do i=0,nres2
+ do j=1,3
+ friction(j,i)=0.0d0
+ enddo
+ enddo
+
+ do j=1,3
+ d_t_work(j)=d_t(j,0)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ d_t_work(ind+j)=d_t(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if ((itype(i).ne.10).and.(itype(i).ne.ntyp1)) then
+ do j=1,3
+ d_t_work(ind+j)=d_t(j,i+nres)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+
+ call fricmat_mult(d_t_work,fric_work)
+
+ if (.not.checkmode) return
+
+ if (lprn) then
+ write (iout,*) "d_t_work and fric_work"
+ do i=1,3*dimen
+ write (iout,'(i3,2e15.5)') i,d_t_work(i),fric_work(i)
+ enddo
+ endif
+ do j=1,3
+ friction(j,0)=fric_work(j)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ friction(j,i)=fric_work(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if ((itype(i).ne.10).and.(itype(i).ne.ntyp1)) then
+ do j=1,3
+ friction(j,i+nres)=fric_work(ind+j)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ if (lprn) then
+ write(iout,*) "Friction backbone"
+ do i=0,nct-1
+ write(iout,'(i5,3e15.5,5x,3e15.5)') &
+ i,(friction(j,i),j=1,3),(d_t(j,i),j=1,3)
+ enddo
+ write(iout,*) "Friction side chain"
+ do i=nnt,nct
+ write(iout,'(i5,3e15.5,5x,3e15.5)') &
+ i,(friction(j,i+nres),j=1,3),(d_t(j,i+nres),j=1,3)
+ enddo
+ endif
+ if (lprn) then
+ do j=1,3
+ vv(j)=d_t(j,0)
+ enddo
+ do i=nnt,nct
+ do j=1,3
+ vvtot(j,i)=vv(j)+0.5d0*d_t(j,i)
+ vvtot(j,i+nres)=vv(j)+d_t(j,i+nres)
+ vv(j)=vv(j)+d_t(j,i)
+ enddo
+ enddo
+ write (iout,*) "vvtot backbone and sidechain"
+ do i=nnt,nct
+ write (iout,'(i5,3e15.5,5x,3e15.5)') i,(vvtot(j,i),j=1,3),&
+ (vvtot(j,i+nres),j=1,3)
+ enddo
+ ind=0
+ do i=nnt,nct-1
+ do j=1,3
+ v_work(ind+j)=vvtot(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ do j=1,3
+ v_work(ind+j)=vvtot(j,i+nres)
+ enddo
+ ind=ind+3
+ enddo
+ write (iout,*) "v_work gamvec and site-based friction forces"
+ do i=1,dimen1
+ write (iout,'(i5,3e15.5)') i,v_work(i),gamvec(i),&
+ gamvec(i)*v_work(i)
+ enddo
+! do i=1,dimen
+! fric_work1(i)=0.0d0
+! do j=1,dimen1
+! fric_work1(i)=fric_work1(i)-A(j,i)*gamvec(j)*v_work(j)
+! enddo
+! enddo
+! write (iout,*) "fric_work and fric_work1"
+! do i=1,dimen
+! write (iout,'(i5,2e15.5)') i,fric_work(i),fric_work1(i)
+! enddo
+ do i=1,dimen
+ do j=1,dimen
+ ginvfric(i,j)=0.0d0
+ do k=1,dimen
+ ginvfric(i,j)=ginvfric(i,j)+ginv(i,k)*fricmat(k,j)
+ enddo
+ enddo
+ enddo
+ write (iout,*) "ginvfric"
+ do i=1,dimen
+ write (iout,'(i5,100f8.3)') i,(ginvfric(i,j),j=1,dimen)
+ enddo
+ write (iout,*) "symmetry check"
+ do i=1,dimen
+ do j=1,i-1
+ write (iout,*) i,j,ginvfric(i,j)-ginvfric(j,i)
+ enddo
+ enddo
+ endif
+ return
+ end subroutine friction_force
+!-----------------------------------------------------------------------------
+ subroutine setup_fricmat
+
+! use MPI
+ use energy_data
+ use control_data, only:time_Bcast
+ use control, only:tcpu
+ use comm_syfek
+! implicit real*8 (a-h,o-z)
+#ifdef MPI
+ use MPI_data
+ include 'mpif.h'
+ real(kind=8) :: time00
+#endif
+! include 'DIMENSIONS'
+! include 'COMMON.VAR'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.MD'
+! include 'COMMON.SETUP'
+! include 'COMMON.TIME1'
+! integer licznik /0/
+! save licznik
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.IOUNITS'
+ integer :: IERROR
+ integer :: i,j,ind,ind1,m
+ logical :: lprn = .false.
+ real(kind=8) :: dtdi !el ,gamvec(2*nres)
+!el real(kind=8),dimension(2*nres,2*nres) :: ginvfric,fcopy
+ real(kind=8),dimension(2*nres,2*nres) :: fcopy
+!el real(kind=8),dimension(2*nres*(2*nres+1)/2) :: Ghalf !(mmaxres2) (mmaxres2=(maxres2*(maxres2+1)/2))
+!el common /syfek/ gamvec
+ real(kind=8) :: work(8*2*nres)
+ integer :: iwork(2*nres)
+!el common /przechowalnia/ ginvfric,Ghalf,fcopy
+ integer :: ii,iti,k,l,nzero,nres2,nres6,ierr
+#ifdef MPI
+ if (fg_rank.ne.king) goto 10
+#endif
+ nres2=2*nres
+ nres6=6*nres
+
+ if(.not.allocated(gamvec)) allocate(gamvec(nres2)) !(MAXRES2)
+ if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
+!el if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
+!el allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
+ if(.not.allocated(Ghalf)) allocate(Ghalf(nres2*(nres2+1)/2)) !maxres2=2*maxres
+
+!el if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
+! Zeroing out fricmat
+ do i=1,dimen
+ do j=1,dimen
+ fricmat(i,j)=0.0d0
+ enddo
+ enddo
+! Load the friction coefficients corresponding to peptide groups
+ ind1=0
+ do i=nnt,nct-1
+ ind1=ind1+1
+ gamvec(ind1)=gamp
+ enddo
+! Load the friction coefficients corresponding to side chains
+ m=nct-nnt
+ ind=0
+ gamsc(ntyp1)=1.0d0
+ do i=nnt,nct
+ ind=ind+1
+ ii = ind+m
+ iti=itype(i)
+ gamvec(ii)=gamsc(iabs(iti))
+ enddo
+ if (surfarea) call sdarea(gamvec)
+! if (lprn) then
+! write (iout,*) "Matrix A and vector gamma"
+! do i=1,dimen1
+! write (iout,'(i2,$)') i
+! do j=1,dimen
+! write (iout,'(f4.1,$)') A(i,j)
+! enddo
+! write (iout,'(f8.3)') gamvec(i)
+! enddo
+! endif
+ if (lprn) then
+ write (iout,*) "Vector gamvec"
+ do i=1,dimen1
+ write (iout,'(i5,f10.5)') i, gamvec(i)
+ enddo
+ endif
+
+! The friction matrix
+ do k=1,dimen
+ do i=1,dimen
+ dtdi=0.0d0
+ do j=1,dimen1
+ dtdi=dtdi+A(j,k)*A(j,i)*gamvec(j)
+ enddo
+ fricmat(k,i)=dtdi
+ enddo
+ enddo
+
+ if (lprn) then
+ write (iout,'(//a)') "Matrix fricmat"
+ call matout2(dimen,dimen,nres2,nres2,fricmat)
+ endif
+ if (lang.eq.2 .or. lang.eq.3) then
+! Mass-scale the friction matrix if non-direct integration will be performed
+ do i=1,dimen
+ do j=1,dimen
+ Ginvfric(i,j)=0.0d0
+ do k=1,dimen
+ do l=1,dimen
+ Ginvfric(i,j)=Ginvfric(i,j)+ &
+ Gsqrm(i,k)*Gsqrm(l,j)*fricmat(k,l)
+ enddo
+ enddo
+ enddo
+ enddo
+! Diagonalize the friction matrix
+ ind=0
+ do i=1,dimen
+ do j=1,i
+ ind=ind+1
+ Ghalf(ind)=Ginvfric(i,j)
+ enddo
+ enddo
+ call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
+ ierr,iwork)
+ if (lprn) then
+ write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
+ " mass-scaled friction matrix"
+ call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
+ endif
+! Precompute matrices for tinker stochastic integrator
+#ifndef LANG0
+ do i=1,dimen
+ do j=1,dimen
+ mt1(i,j)=0.0d0
+ mt2(i,j)=0.0d0
+ do k=1,dimen
+ mt1(i,j)=mt1(i,j)+fricvec(k,i)*gsqrm(k,j)
+ mt2(i,j)=mt2(i,j)+fricvec(k,i)*gsqrp(k,j)
+ enddo
+ mt3(j,i)=mt1(i,j)
+ enddo
+ enddo
+#endif
+ else if (lang.eq.4) then
+! Diagonalize the friction matrix
+ ind=0
+ do i=1,dimen
+ do j=1,i
+ ind=ind+1
+ Ghalf(ind)=fricmat(i,j)
+ enddo
+ enddo
+ call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
+ ierr,iwork)
+ if (lprn) then
+ write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
+ " friction matrix"
+ call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
+ endif
+! Determine the number of zero eigenvalues of the friction matrix
+ nzero=max0(dimen-dimen1,0)
+! do while (fricgam(nzero+1).le.1.0d-5 .and. nzero.lt.dimen)
+! nzero=nzero+1
+! enddo
+ write (iout,*) "Number of zero eigenvalues:",nzero
+ do i=1,dimen
+ do j=1,dimen
+ fricmat(i,j)=0.0d0
+ do k=nzero+1,dimen
+ fricmat(i,j)=fricmat(i,j) &
+ +fricvec(i,k)*fricvec(j,k)/fricgam(k)
+ enddo
+ enddo
+ enddo
+ if (lprn) then
+ write (iout,'(//a)') "Generalized inverse of fricmat"
+ call matout(dimen,dimen,nres6,nres6,fricmat)
+ endif
+ endif
+#ifdef MPI
+ 10 continue
+ if (nfgtasks.gt.1) then
+ if (fg_rank.eq.0) then
+! The matching BROADCAST for fg processors is called in ERGASTULUM
+#ifdef MPI
+ time00=MPI_Wtime()
+#else
+ time00=tcpu()
+#endif
+ call MPI_Bcast(10,1,MPI_INTEGER,king,FG_COMM,IERROR)
+#ifdef MPI
+ time_Bcast=time_Bcast+MPI_Wtime()-time00
+#else
+ time_Bcast=time_Bcast+tcpu()-time00
+#endif
+! print *,"Processor",myrank,
+! & " BROADCAST iorder in SETUP_FRICMAT"
+ endif
+! licznik=licznik+1
+ write (iout,*) "setup_fricmat licznik"!,licznik !sp
+#ifdef MPI
+ time00=MPI_Wtime()
+#else
+ time00=tcpu()
+#endif
+! Scatter the friction matrix
+ call MPI_Scatterv(fricmat(1,1),nginv_counts(0),&
+ nginv_start(0),MPI_DOUBLE_PRECISION,fcopy(1,1),&
+ myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR)
+#ifdef TIMING
+#ifdef MPI
+ time_scatter=time_scatter+MPI_Wtime()-time00
+ time_scatter_fmat=time_scatter_fmat+MPI_Wtime()-time00
+#else
+ time_scatter=time_scatter+tcpu()-time00
+ time_scatter_fmat=time_scatter_fmat+tcpu()-time00
+#endif
+#endif
+ do i=1,dimen
+ do j=1,2*my_ng_count
+ fricmat(j,i)=fcopy(i,j)
+ enddo
+ enddo
+! write (iout,*) "My chunk of fricmat"
+! call MATOUT2(my_ng_count,dimen,maxres2,maxres2,fcopy)
+ endif
+#endif
+ return
+ end subroutine setup_fricmat
+!-----------------------------------------------------------------------------
+ subroutine stochastic_force(stochforcvec)
+
+ use energy_data
+ use random, only:anorm_distr
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+ use control, only: tcpu
+ use control_data
+#ifdef MPI
+ include 'mpif.h'
+#endif
+! include 'COMMON.VAR'
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.MD'
+! include 'COMMON.TIME1'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.IOUNITS'
+
+ real(kind=8) :: x,sig,lowb,highb
+ real(kind=8) :: ff(3),force(3,0:2*nres),zeta2,lowb2
+ real(kind=8) :: highb2,sig2,forcvec(6*nres),stochforcvec(6*nres)
+ real(kind=8) :: time00
+ logical :: lprn = .false.
+ integer :: i,j,ind
+
+ do i=0,2*nres
+ do j=1,3
+ stochforc(j,i)=0.0d0
+ enddo
+ enddo
+ x=0.0d0
+
+#ifdef MPI
+ time00=MPI_Wtime()
+#else
+ time00=tcpu()
+#endif
+! Compute the stochastic forces acting on bodies. Store in force.
+ do i=nnt,nct-1
+ sig=stdforcp(i)
+ lowb=-5*sig
+ highb=5*sig
+ do j=1,3
+ force(j,i)=anorm_distr(x,sig,lowb,highb)
+ enddo
+ enddo
+ do i=nnt,nct
+ sig2=stdforcsc(i)
+ lowb2=-5*sig2
+ highb2=5*sig2
+ do j=1,3
+ force(j,i+nres)=anorm_distr(x,sig2,lowb2,highb2)
+ enddo
+ enddo
+#ifdef MPI
+ time_fsample=time_fsample+MPI_Wtime()-time00
+#else
+ time_fsample=time_fsample+tcpu()-time00
+#endif
+! Compute the stochastic forces acting on virtual-bond vectors.
+ do j=1,3
+ ff(j)=0.0d0
+ enddo
+ do i=nct-1,nnt,-1
+ do j=1,3
+ stochforc(j,i)=ff(j)+0.5d0*force(j,i)
+ enddo
+ do j=1,3
+ ff(j)=ff(j)+force(j,i)
+ enddo
+ if (itype(i+1).ne.ntyp1) then
+ do j=1,3
+ stochforc(j,i)=stochforc(j,i)+force(j,i+nres+1)
+ ff(j)=ff(j)+force(j,i+nres+1)
+ enddo
+ endif
+ enddo
+ do j=1,3
+ stochforc(j,0)=ff(j)+force(j,nnt+nres)
+ enddo
+ do i=nnt,nct
+ if ((itype(i).ne.10).and.(itype(i).ne.ntyp1)) then
+ do j=1,3
+ stochforc(j,i+nres)=force(j,i+nres)
+ enddo
+ endif
+ enddo
+
+ do j=1,3
+ stochforcvec(j)=stochforc(j,0)
+ enddo
+ ind=3
+ do i=nnt,nct-1
+ do j=1,3
+ stochforcvec(ind+j)=stochforc(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ if ((itype(i).ne.10).and.(itype(i).ne.ntyp1)) then
+ do j=1,3
+ stochforcvec(ind+j)=stochforc(j,i+nres)
+ enddo
+ ind=ind+3
+ endif
+ enddo
+ if (lprn) then
+ write (iout,*) "stochforcvec"
+ do i=1,3*dimen
+ write(iout,'(i5,e15.5)') i,stochforcvec(i)
+ enddo
+ write(iout,*) "Stochastic forces backbone"
+ do i=0,nct-1
+ write(iout,'(i5,3e15.5)') i,(stochforc(j,i),j=1,3)
+ enddo
+ write(iout,*) "Stochastic forces side chain"
+ do i=nnt,nct
+ write(iout,'(i5,3e15.5)') &
+ i,(stochforc(j,i+nres),j=1,3)
+ enddo
+ endif
+
+ if (lprn) then
+
+ ind=0
+ do i=nnt,nct-1
+ write (iout,*) i,ind
+ do j=1,3
+ forcvec(ind+j)=force(j,i)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ write (iout,*) i,ind
+ do j=1,3
+ forcvec(j+ind)=force(j,i+nres)
+ enddo
+ ind=ind+3
+ enddo
+
+ write (iout,*) "forcvec"
+ ind=0
+ do i=nnt,nct-1
+ do j=1,3
+ write (iout,'(2i3,2f10.5)') i,j,force(j,i),&
+ forcvec(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+ do i=nnt,nct
+ do j=1,3
+ write (iout,'(2i3,2f10.5)') i,j,force(j,i+nres),&
+ forcvec(ind+j)
+ enddo
+ ind=ind+3
+ enddo
+
+ endif
+
+ return
+ end subroutine stochastic_force
+!-----------------------------------------------------------------------------
+ subroutine sdarea(gamvec)
+!
+! Scale the friction coefficients according to solvent accessible surface areas
+! Code adapted from TINKER
+! AL 9/3/04
+!
+ use energy_data
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'COMMON.CONTROL'
+! include 'COMMON.VAR'
+! include 'COMMON.MD'
+!#ifndef LANG0
+! include 'COMMON.LANGEVIN'
+!#else
+! include 'COMMON.LANGEVIN.lang0'
+!#endif
+! include 'COMMON.CHAIN'
+! include 'COMMON.DERIV'
+! include 'COMMON.GEO'
+! include 'COMMON.LOCAL'
+! include 'COMMON.INTERACT'
+! include 'COMMON.IOUNITS'
+! include 'COMMON.NAMES'
+ real(kind=8),dimension(2*nres) :: radius,gamvec !(maxres2)
+ real(kind=8),parameter :: twosix = 1.122462048309372981d0
+ logical :: lprn = .false.
+ real(kind=8) :: probe,area,ratio
+ integer :: i,j,ind,iti
+!
+! determine new friction coefficients every few SD steps
+!
+! set the atomic radii to estimates of sigma values
+!
+! print *,"Entered sdarea"
+ probe = 0.0d0
+
+ do i=1,2*nres
+ radius(i)=0.0d0
+ enddo
+! Load peptide group radii
+ do i=nnt,nct-1
+ radius(i)=pstok
+ enddo
+! Load side chain radii
+ do i=nnt,nct
+ iti=itype(i)
+ radius(i+nres)=restok(iti)
+ enddo
+! do i=1,2*nres
+! write (iout,*) "i",i," radius",radius(i)
+! enddo
+ do i = 1, 2*nres
+ radius(i) = radius(i) / twosix
+ if (radius(i) .ne. 0.0d0) radius(i) = radius(i) + probe
+ end do
+!
+! scale atomic friction coefficients by accessible area
+!
+ if (lprn) write (iout,*) &
+ "Original gammas, surface areas, scaling factors, new gammas, ",&
+ "std's of stochastic forces"
+ ind=0
+ do i=nnt,nct-1
+ if (radius(i).gt.0.0d0) then
+ call surfatom (i,area,radius)
+ ratio = dmax1(area/(4.0d0*pi*radius(i)**2),1.0d-1)
+ if (lprn) write (iout,'(i5,3f10.5,$)') &
+ i,gamvec(ind+1),area,ratio
+ do j=1,3
+ ind=ind+1
+ gamvec(ind) = ratio * gamvec(ind)
+ enddo
+ stdforcp(i)=stdfp*dsqrt(gamvec(ind))
+ if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcp(i)
+ endif
+ enddo
+ do i=nnt,nct
+ if (radius(i+nres).gt.0.0d0) then
+ call surfatom (i+nres,area,radius)
+ ratio = dmax1(area/(4.0d0*pi*radius(i+nres)**2),1.0d-1)
+ if (lprn) write (iout,'(i5,3f10.5,$)') &
+ i,gamvec(ind+1),area,ratio
+ do j=1,3
+ ind=ind+1
+ gamvec(ind) = ratio * gamvec(ind)
+ enddo
+ stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamvec(ind))
+ if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcsc(i)
+ endif
+ enddo
+
+ return
+ end subroutine sdarea
+!-----------------------------------------------------------------------------
+! surfatom.f
+!-----------------------------------------------------------------------------
+!
+!
+! ###################################################
+! ## COPYRIGHT (C) 1996 by Jay William Ponder ##
+! ## All Rights Reserved ##
+! ###################################################
+!
+! ################################################################
+! ## ##
+! ## subroutine surfatom -- exposed surface area of an atom ##
+! ## ##
+! ################################################################
+!
+!
+! "surfatom" performs an analytical computation of the surface
+! area of a specified atom; a simplified version of "surface"
+!
+! literature references:
+!
+! T. J. Richmond, "Solvent Accessible Surface Area and
+! Excluded Volume in Proteins", Journal of Molecular Biology,
+! 178, 63-89 (1984)
+!
+! L. Wesson and D. Eisenberg, "Atomic Solvation Parameters
+! Applied to Molecular Dynamics of Proteins in Solution",
+! Protein Science, 1, 227-235 (1992)
+!
+! variables and parameters:
+!
+! ir number of atom for which area is desired
+! area accessible surface area of the atom
+! radius radii of each of the individual atoms
+!
+!
+ subroutine surfatom(ir,area,radius)
+
+! implicit real*8 (a-h,o-z)
+! include 'DIMENSIONS'
+! include 'sizes.i'
+! include 'COMMON.GEO'
+! include 'COMMON.IOUNITS'
+! integer :: nres,
+ integer :: nsup,nstart_sup
+! double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm
+! common /chain/ c(3,maxres2+2),dc(3,0:maxres2),dc_old(3,0:maxres2),
+! & xloc(3,maxres),xrot(3,maxres),dc_norm(3,0:maxres2),
+! & dc_work(MAXRES6),nres,nres0
+ integer,parameter :: maxarc=300
+ integer :: i,j,k,m
+ integer :: ii,ib,jb
+ integer :: io,ir
+ integer :: mi,ni,narc
+ integer :: key(maxarc)
+ integer :: intag(maxarc)
+ integer :: intag1(maxarc)
+ real(kind=8) :: area,arcsum
+ real(kind=8) :: arclen,exang
+ real(kind=8) :: delta,delta2
+ real(kind=8) :: eps,rmove
+ real(kind=8) :: xr,yr,zr
+ real(kind=8) :: rr,rrsq
+ real(kind=8) :: rplus,rminus
+ real(kind=8) :: axx,axy,axz
+ real(kind=8) :: ayx,ayy
+ real(kind=8) :: azx,azy,azz
+ real(kind=8) :: uxj,uyj,uzj
+ real(kind=8) :: tx,ty,tz
+ real(kind=8) :: txb,tyb,td
+ real(kind=8) :: tr2,tr,txr,tyr
+ real(kind=8) :: tk1,tk2
+ real(kind=8) :: thec,the,t,tb
+ real(kind=8) :: txk,tyk,tzk
+ real(kind=8) :: t1,ti,tf,tt
+ real(kind=8) :: txj,tyj,tzj
+ real(kind=8) :: ccsq,cc,xysq
+ real(kind=8) :: bsqk,bk,cosine
+ real(kind=8) :: dsqj,gi,pix2
+ real(kind=8) :: therk,dk,gk
+ real(kind=8) :: risqk,rik
+ real(kind=8) :: radius(2*nres) !(maxatm) (maxatm=maxres2)
+ real(kind=8) :: ri(maxarc),risq(maxarc)
+ real(kind=8) :: ux(maxarc),uy(maxarc),uz(maxarc)
+ real(kind=8) :: xc(maxarc),yc(maxarc),zc(maxarc)
+ real(kind=8) :: xc1(maxarc),yc1(maxarc),zc1(maxarc)
+ real(kind=8) :: dsq(maxarc),bsq(maxarc)
+ real(kind=8) :: dsq1(maxarc),bsq1(maxarc)
+ real(kind=8) :: arci(maxarc),arcf(maxarc)
+ real(kind=8) :: ex(maxarc),lt(maxarc),gr(maxarc)
+ real(kind=8) :: b(maxarc),b1(maxarc),bg(maxarc)
+ real(kind=8) :: kent(maxarc),kout(maxarc)
+ real(kind=8) :: ther(maxarc)
+ logical :: moved,top
+ logical :: omit(maxarc)
+!
+! include 'sizes.i'
+ maxatm = 2*nres !maxres2 maxres2=2*maxres
+ maxlight = 8*maxatm
+ maxbnd = 2*maxatm
+ maxang = 3*maxatm
+ maxtors = 4*maxatm
+!
+! zero out the surface area for the sphere of interest
+!
+ area = 0.0d0
+! write (2,*) "ir",ir," radius",radius(ir)
+ if (radius(ir) .eq. 0.0d0) return
+!
+! set the overlap significance and connectivity shift
+!
+ pix2 = 2.0d0 * pi
+ delta = 1.0d-8
+ delta2 = delta * delta
+ eps = 1.0d-8
+ moved = .false.
+ rmove = 1.0d-8
+!
+! store coordinates and radius of the sphere of interest
+!
+ xr = c(1,ir)
+ yr = c(2,ir)
+ zr = c(3,ir)
+ rr = radius(ir)
+ rrsq = rr * rr
+!
+! initialize values of some counters and summations
+!
+ 10 continue
+ io = 0
+ jb = 0
+ ib = 0
+ arclen = 0.0d0
+ exang = 0.0d0
+!
+! test each sphere to see if it overlaps the sphere of interest
+!
+ do i = 1, 2*nres
+ if (i.eq.ir .or. radius(i).eq.0.0d0) goto 30
+ rplus = rr + radius(i)
+ tx = c(1,i) - xr
+ if (abs(tx) .ge. rplus) goto 30
+ ty = c(2,i) - yr
+ if (abs(ty) .ge. rplus) goto 30
+ tz = c(3,i) - zr
+ if (abs(tz) .ge. rplus) goto 30
+!
+! check for sphere overlap by testing distance against radii
+!
+ xysq = tx*tx + ty*ty
+ if (xysq .lt. delta2) then
+ tx = delta
+ ty = 0.0d0
+ xysq = delta2
+ end if
+ ccsq = xysq + tz*tz
+ cc = sqrt(ccsq)
+ if (rplus-cc .le. delta) goto 30
+ rminus = rr - radius(i)
+!
+! check to see if sphere of interest is completely buried
+!
+ if (cc-abs(rminus) .le. delta) then
+ if (rminus .le. 0.0d0) goto 170
+ goto 30
+ end if
+!
+! check for too many overlaps with sphere of interest
+!
+ if (io .ge. maxarc) then
+ write (iout,20)
+ 20 format (/,' SURFATOM -- Increase the Value of MAXARC')
+ stop
+ end if
+!
+! get overlap between current sphere and sphere of interest
+!
+ io = io + 1
+ xc1(io) = tx
+ yc1(io) = ty
+ zc1(io) = tz
+ dsq1(io) = xysq
+ bsq1(io) = ccsq
+ b1(io) = cc
+ gr(io) = (ccsq+rplus*rminus) / (2.0d0*rr*b1(io))
+ intag1(io) = i
+ omit(io) = .false.
+ 30 continue
+ end do
+!
+! case where no other spheres overlap the sphere of interest
+!
+ if (io .eq. 0) then
+ area = 4.0d0 * pi * rrsq
+ return
+ end if
+!
+! case where only one sphere overlaps the sphere of interest
+!
+ if (io .eq. 1) then
+ area = pix2 * (1.0d0 + gr(1))
+ area = mod(area,4.0d0*pi) * rrsq
+ return
+ end if
+!
+! case where many spheres intersect the sphere of interest;
+! sort the intersecting spheres by their degree of overlap
+!
+ call sort2 (io,gr,key)
+ do i = 1, io
+ k = key(i)
+ intag(i) = intag1(k)
+ xc(i) = xc1(k)
+ yc(i) = yc1(k)
+ zc(i) = zc1(k)
+ dsq(i) = dsq1(k)
+ b(i) = b1(k)
+ bsq(i) = bsq1(k)
+ end do
+!
+! get radius of each overlap circle on surface of the sphere
+!
+ do i = 1, io
+ gi = gr(i) * rr
+ bg(i) = b(i) * gi
+ risq(i) = rrsq - gi*gi
+ ri(i) = sqrt(risq(i))
+ ther(i) = 0.5d0*pi - asin(min(1.0d0,max(-1.0d0,gr(i))))
+ end do
+!
+! find boundary of inaccessible area on sphere of interest
+!
+ do k = 1, io-1
+ if (.not. omit(k)) then
+ txk = xc(k)
+ tyk = yc(k)
+ tzk = zc(k)
+ bk = b(k)
+ therk = ther(k)
+!
+! check to see if J circle is intersecting K circle;
+! get distance between circle centers and sum of radii
+!
+ do j = k+1, io
+ if (omit(j)) goto 60
+ cc = (txk*xc(j)+tyk*yc(j)+tzk*zc(j))/(bk*b(j))
+ cc = acos(min(1.0d0,max(-1.0d0,cc)))
+ td = therk + ther(j)
+!
+! check to see if circles enclose separate regions
+!
+ if (cc .ge. td) goto 60
+!
+! check for circle J completely inside circle K
+!
+ if (cc+ther(j) .lt. therk) goto 40
+!
+! check for circles that are essentially parallel
+!
+ if (cc .gt. delta) goto 50
+ 40 continue
+ omit(j) = .true.
+ goto 60
+!
+! check to see if sphere of interest is completely buried
+!
+ 50 continue
+ if (pix2-cc .le. td) goto 170
+ 60 continue
+ end do
+ end if
+ end do
+!
+! find T value of circle intersections
+!
+ do k = 1, io
+ if (omit(k)) goto 110
+ omit(k) = .true.
+ narc = 0
+ top = .false.
+ txk = xc(k)
+ tyk = yc(k)
+ tzk = zc(k)
+ dk = sqrt(dsq(k))
+ bsqk = bsq(k)
+ bk = b(k)
+ gk = gr(k) * rr
+ risqk = risq(k)
+ rik = ri(k)
+ therk = ther(k)
+!
+! rotation matrix elements
+!
+ t1 = tzk / (bk*dk)
+ axx = txk * t1
+ axy = tyk * t1
+ axz = dk / bk
+ ayx = tyk / dk
+ ayy = txk / dk
+ azx = txk / bk
+ azy = tyk / bk
+ azz = tzk / bk
+ do j = 1, io
+ if (.not. omit(j)) then
+ txj = xc(j)
+ tyj = yc(j)
+ tzj = zc(j)
+!
+! rotate spheres so K vector colinear with z-axis
+!
+ uxj = txj*axx + tyj*axy - tzj*axz
+ uyj = tyj*ayy - txj*ayx
+ uzj = txj*azx + tyj*azy + tzj*azz
+ cosine = min(1.0d0,max(-1.0d0,uzj/b(j)))
+ if (acos(cosine) .lt. therk+ther(j)) then
+ dsqj = uxj*uxj + uyj*uyj
+ tb = uzj*gk - bg(j)
+ txb = uxj * tb
+ tyb = uyj * tb
+ td = rik * dsqj
+ tr2 = risqk*dsqj - tb*tb
+ tr2 = max(eps,tr2)
+ tr = sqrt(tr2)
+ txr = uxj * tr
+ tyr = uyj * tr
+!
+! get T values of intersection for K circle
+!
+ tb = (txb+tyr) / td
+ tb = min(1.0d0,max(-1.0d0,tb))
+ tk1 = acos(tb)
+ if (tyb-txr .lt. 0.0d0) tk1 = pix2 - tk1
+ tb = (txb-tyr) / td
+ tb = min(1.0d0,max(-1.0d0,tb))
+ tk2 = acos(tb)
+ if (tyb+txr .lt. 0.0d0) tk2 = pix2 - tk2
+ thec = (rrsq*uzj-gk*bg(j)) / (rik*ri(j)*b(j))
+ if (abs(thec) .lt. 1.0d0) then
+ the = -acos(thec)
+ else if (thec .ge. 1.0d0) then
+ the = 0.0d0
+ else if (thec .le. -1.0d0) then
+ the = -pi
+ end if
+!
+! see if "tk1" is entry or exit point; check t=0 point;
+! "ti" is exit point, "tf" is entry point
+!
+ cosine = min(1.0d0,max(-1.0d0, &
+ (uzj*gk-uxj*rik)/(b(j)*rr)))
+ if ((acos(cosine)-ther(j))*(tk2-tk1) .le. 0.0d0) then
+ ti = tk2
+ tf = tk1
+ else
+ ti = tk2
+ tf = tk1
+ end if
+ narc = narc + 1
+ if (narc .ge. maxarc) then
+ write (iout,70)
+ 70 format (/,' SURFATOM -- Increase the Value',&
+ ' of MAXARC')
+ stop
+ end if
+ if (tf .le. ti) then
+ arcf(narc) = tf
+ arci(narc) = 0.0d0
+ tf = pix2
+ lt(narc) = j
+ ex(narc) = the
+ top = .true.
+ narc = narc + 1
+ end if
+ arcf(narc) = tf
+ arci(narc) = ti
+ lt(narc) = j
+ ex(narc) = the
+ ux(j) = uxj
+ uy(j) = uyj
+ uz(j) = uzj
+ end if
+ end if
+ end do
+ omit(k) = .false.
+!
+! special case; K circle without intersections
+!
+ if (narc .le. 0) goto 90
+!
+! general case; sum up arclength and set connectivity code
+!
+ call sort2 (narc,arci,key)
+ arcsum = arci(1)
+ mi = key(1)
+ t = arcf(mi)
+ ni = mi
+ if (narc .gt. 1) then
+ do j = 2, narc
+ m = key(j)
+ if (t .lt. arci(j)) then
+ arcsum = arcsum + arci(j) - t
+ exang = exang + ex(ni)
+ jb = jb + 1
+ if (jb .ge. maxarc) then
+ write (iout,80)
+ 80 format (/,' SURFATOM -- Increase the Value',&
+ ' of MAXARC')
+ stop
+ end if
+ i = lt(ni)
+ kent(jb) = maxarc*i + k
+ i = lt(m)
+ kout(jb) = maxarc*k + i
+ end if
+ tt = arcf(m)
+ if (tt .ge. t) then
+ t = tt
+ ni = m
+ end if
+ end do
+ end if
+ arcsum = arcsum + pix2 - t
+ if (.not. top) then
+ exang = exang + ex(ni)
+ jb = jb + 1
+ i = lt(ni)
+ kent(jb) = maxarc*i + k
+ i = lt(mi)
+ kout(jb) = maxarc*k + i
+ end if
+ goto 100
+ 90 continue
+ arcsum = pix2
+ ib = ib + 1
+ 100 continue
+ arclen = arclen + gr(k)*arcsum
+ 110 continue
+ end do
+ if (arclen .eq. 0.0d0) goto 170
+ if (jb .eq. 0) goto 150
+!
+! find number of independent boundaries and check connectivity
+!
+ j = 0
+ do k = 1, jb
+ if (kout(k) .ne. 0) then
+ i = k
+ 120 continue
+ m = kout(i)
+ kout(i) = 0
+ j = j + 1
+ do ii = 1, jb
+ if (m .eq. kent(ii)) then
+ if (ii .eq. k) then
+ ib = ib + 1
+ if (j .eq. jb) goto 150
+ goto 130
+ end if
+ i = ii
+ goto 120
+ end if
+ end do
+ 130 continue
+ end if
+ end do
+ ib = ib + 1
+!
+! attempt to fix connectivity error by moving atom slightly
+!
+ if (moved) then
+ write (iout,140) ir
+ 140 format (/,' SURFATOM -- Connectivity Error at Atom',i6)
+ else
+ moved = .true.
+ xr = xr + rmove
+ yr = yr + rmove
+ zr = zr + rmove
+ goto 10
+ end if
+!
+! compute the exposed surface area for the sphere of interest
+!
+ 150 continue
+ area = ib*pix2 + exang + arclen
+ area = mod(area,4.0d0*pi) * rrsq
+!
+! attempt to fix negative area by moving atom slightly
+!
+ if (area .lt. 0.0d0) then
+ if (moved) then
+ write (iout,160) ir
+ 160 format (/,' SURFATOM -- Negative Area at Atom',i6)
+ else
+ moved = .true.
+ xr = xr + rmove
+ yr = yr + rmove
+ zr = zr + rmove
+ goto 10
+ end if
+ end if
+ 170 continue
+ return
+ end subroutine surfatom
+!----------------------------------------------------------------
+!----------------------------------------------------------------
+ subroutine alloc_MD_arrays
+!EL Allocation of arrays used by MD module
+
+ integer :: nres2,nres6
+ nres2=nres*2
+ nres6=nres*6
+!----------------------
+#ifndef LANG0
+! commom.langevin
+! common /langforc/
+ allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
+ allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
+ if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
+ allocate(fricvec(nres2,nres2))
+ allocate(pfric_mat(nres2,nres2),vfric_mat(nres2,nres2))
+ allocate(afric_mat(nres2,nres2),prand_mat(nres2,nres2))
+ allocate(vrand_mat1(nres2,nres2),vrand_mat2(nres2,nres2)) !(MAXRES2,MAXRES2)
+ allocate(pfric0_mat(nres2,nres2,0:maxflag_stoch))
+ allocate(afric0_mat(nres2,nres2,0:maxflag_stoch))
+ allocate(vfric0_mat(nres2,nres2,0:maxflag_stoch))
+ allocate(prand0_mat(nres2,nres2,0:maxflag_stoch))
+ allocate(vrand0_mat1(nres2,nres2,0:maxflag_stoch))
+ allocate(vrand0_mat2(nres2,nres2,0:maxflag_stoch)) !(MAXRES2,MAXRES2,0:maxflag_stoch)
+ allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
+! common /langmat/
+ allocate(mt1(nres2,nres2),mt2(nres2,nres2),mt3(nres2,nres2)) !(maxres2,maxres2)
+!----------------------
+#else
+! commom.langevin.lang0
+! common /langforc/
+ allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
+ if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
+ allocate(fricvec(nres2,nres2)) !(MAXRES2,MAXRES2)
+ allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
+ allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
+#endif
+
+!el if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2))
+!----------------------
+! commom.hairpin in CSA module
+!----------------------
+! common.mce in MCM_MD module
+!----------------------
+! common.MD
+! common /mdgrad/ in module.energy
+! common /back_constr/ in module.energy
+! common /qmeas/ in module.energy
+! common /mdpar/
+! common /MDcalc/
+ allocate(potEcomp(0:n_ene+4)) !(0:n_ene+4)
+! common /lagrange/
+ allocate(d_t(3,0:nres2),d_a(3,0:nres2),d_t_old(3,0:nres2)) !(3,0:MAXRES2)
+ allocate(d_a_work(nres6)) !(6*MAXRES)
+ allocate(Gmat(nres2,nres2),A(nres2,nres2))
+ if(.not.allocated(Ginv)) allocate(Ginv(nres2,nres2)) !in control: ergastulum
+ allocate(Gsqrp(nres2,nres2),Gsqrm(nres2,nres2),Gvec(nres2,nres2)) !(maxres2,maxres2)
+ allocate(Geigen(nres2)) !(maxres2)
+ if(.not.allocated(vtot)) allocate(vtot(nres2)) !(maxres2)
+! common /inertia/ in io_conf: parmread
+! real(kind=8),dimension(:),allocatable :: ISC,msc !(ntyp+1)
+! common /langevin/in io read_MDpar
+! real(kind=8),dimension(:),allocatable :: gamsc !(ntyp1)
+! real(kind=8),dimension(:),allocatable :: stdfsc !(ntyp)
+! in io_conf: parmread
+! real(kind=8),dimension(:),allocatable :: restok !(ntyp+1)
+! common /mdpmpi/ in control: ergastulum
+ if(.not.allocated(ng_start)) allocate(ng_start(0:nfgtasks-1))
+ if(.not.allocated(ng_counts)) allocate(ng_counts(0:nfgtasks-1))
+ if(.not.allocated(nginv_counts)) allocate(nginv_counts(0:nfgtasks-1)) !(0:MaxProcs-1)
+ if(.not.allocated(nginv_start)) allocate(nginv_start(0:nfgtasks)) !(0:MaxProcs)
+!----------------------
+! common.muca in read_muca
+! common /double_muca/
+! real(kind=8) :: elow,ehigh,factor,hbin,factor_min
+! real(kind=8),dimension(:),allocatable :: emuca,nemuca,&
+! nemuca2,hist !(4*maxres)
+! common /integer_muca/
+! integer :: nmuca,imtime,muca_smooth
+! common /mucarem/
+! real(kind=8),dimension(:),allocatable :: elowi,ehighi !(maxprocs)
+!----------------------
+! common.MD
+! common /mdgrad/ in module.energy
+! common /back_constr/ in module.energy
+! common /qmeas/ in module.energy
+! common /mdpar/
+! common /MDcalc/
+! common /lagrange/
+ allocate(d_t_work(nres6),d_t_work_new(nres6),d_af_work(nres6))
+ allocate(d_as_work(nres6),kinetic_force(nres6)) !(MAXRES6)
+ allocate(d_t_new(3,0:nres2),d_a_old(3,0:nres2),d_a_short(3,0:nres2)) !,d_a !(3,0:MAXRES2)
+ allocate(stdforcp(nres),stdforcsc(nres)) !(MAXRES)
+!----------------------
+! COMMON /BANII/ D
+ allocate(D_ban(nres6)) !(MAXRES6) maxres6=6*maxres
+! common /stochcalc/ stochforcvec
+ allocate(stochforcvec(nres6)) !(MAXRES6) maxres6=6*maxres
+!----------------------
+ return
+ end subroutine alloc_MD_arrays
+!-----------------------------------------------------------------------------
+!-----------------------------------------------------------------------------
+ end module MDyn