2 !-----------------------------------------------------------------------------
15 !-----------------------------------------------------------------------------
17 ! common /mdgrad/ in module.energy
18 ! common /back_constr/ in module.energy
19 ! common /qmeas/ in module.energy
23 real(kind=8),dimension(:),allocatable :: d_t_work,&
24 d_t_work_new,d_af_work,d_as_work,kinetic_force !(MAXRES6)
25 real(kind=8),dimension(:,:),allocatable :: d_t_new,&
26 d_a_old,d_a_short!,d_a !(3,0:MAXRES2)
27 ! real(kind=8),dimension(:),allocatable :: d_a_work !(6*MAXRES)
28 ! real(kind=8),dimension(:,:),allocatable :: Gmat,Ginv,A,&
29 ! Gsqrp,Gsqrm,Gvec !(maxres2,maxres2)
30 ! real(kind=8),dimension(:),allocatable :: Geigen !(maxres2)
31 ! integer :: dimen,dimen1,dimen3
32 ! integer :: lang,count_reset_moment,count_reset_vel
33 ! logical :: reset_moment,reset_vel,rattle,RESPA
36 ! real(kind=8) :: rwat,etawat,stdfp,cPoise
37 ! real(kind=8),dimension(:),allocatable :: gamsc !(ntyp1)
38 ! real(kind=8),dimension(:),allocatable :: stdfsc !(ntyp)
39 real(kind=8),dimension(:),allocatable :: stdforcp,stdforcsc !(MAXRES)
40 !-----------------------------------------------------------------------------
44 ! ###################################################
45 ! ## COPYRIGHT (C) 1992 by Jay William Ponder ##
46 ! ## All Rights Reserved ##
47 ! ###################################################
49 ! #############################################################
51 ! ## sizes.i -- parameter values to set array dimensions ##
53 ! #############################################################
56 ! "sizes.i" sets values for critical array dimensions used
57 ! throughout the software; these parameters will fix the size
58 ! of the largest systems that can be handled; values too large
59 ! for the computer's memory and/or swap space to accomodate
60 ! will result in poor performance or outright failure
62 ! parameter: maximum allowed number of:
64 ! maxatm atoms in the molecular system
65 ! maxval atoms directly bonded to an atom
66 ! maxgrp ! user-defined groups of atoms
67 ! maxtyp force field atom type definitions
68 ! maxclass force field atom class definitions
69 ! maxkey lines in the keyword file
70 ! maxrot bonds for torsional rotation
71 ! maxvar optimization variables (vector storage)
72 ! maxopt optimization variables (matrix storage)
73 ! maxhess off-diagonal Hessian elements
74 ! maxlight sites for method of lights neighbors
75 ! maxvib vibrational frequencies
76 ! maxgeo distance geometry points
77 ! maxcell unit cells in replicated crystal
78 ! maxring 3-, 4-, or 5-membered rings
79 ! maxfix geometric restraints
80 ! maxbio biopolymer atom definitions
81 ! maxres residues in the macromolecule
82 ! maxamino amino acid residue types
83 ! maxnuc nucleic acid residue types
84 ! maxbnd covalent bonds in molecular system
85 ! maxang bond angles in molecular system
86 ! maxtors torsional angles in molecular system
87 ! maxpi atoms in conjugated pisystem
88 ! maxpib covalent bonds involving pisystem
89 ! maxpit torsional angles involving pisystem
92 !el integer maxatm,maxval,maxgrp
93 !el integer maxtyp,maxclass,maxkey
94 !el integer maxrot,maxopt
95 !el integer maxhess,maxlight,maxvib
96 !el integer maxgeo,maxcell,maxring
97 !el integer maxfix,maxbio
98 !el integer maxamino,maxnuc,maxbnd
99 !el integer maxang,maxtors,maxpi
100 !el integer maxpib,maxpit
101 ! integer :: maxatm !=2*nres !maxres2 maxres2=2*maxres
102 ! integer,parameter :: maxval=8
103 ! integer,parameter :: maxgrp=1000
104 ! integer,parameter :: maxtyp=3000
105 ! integer,parameter :: maxclass=500
106 ! integer,parameter :: maxkey=10000
107 ! integer,parameter :: maxrot=1000
108 ! integer,parameter :: maxopt=1000
109 ! integer,parameter :: maxhess=1000000
110 ! integer :: maxlight !=8*maxatm
111 ! integer,parameter :: maxvib=1000
112 ! integer,parameter :: maxgeo=1000
113 ! integer,parameter :: maxcell=10000
114 ! integer,parameter :: maxring=10000
115 ! integer,parameter :: maxfix=10000
116 ! integer,parameter :: maxbio=10000
117 ! integer,parameter :: maxamino=31
118 ! integer,parameter :: maxnuc=12
119 ! integer :: maxbnd !=2*maxatm
120 ! integer :: maxang !=3*maxatm
121 ! integer :: maxtors !=4*maxatm
122 ! integer,parameter :: maxpi=100
123 ! integer,parameter :: maxpib=2*maxpi
124 ! integer,parameter :: maxpit=4*maxpi
125 !-----------------------------------------------------------------------------
126 ! Maximum number of seed
127 ! integer,parameter :: max_seed=1
128 !-----------------------------------------------------------------------------
129 real(kind=8),dimension(:),allocatable :: stochforcvec !(MAXRES6) maxres6=6*maxres
130 ! common /stochcalc/ stochforcvec
131 !-----------------------------------------------------------------------------
132 ! common /przechowalnia/ subroutines: rattle1,rattle2,rattle_brown
133 real(kind=8),dimension(:,:),allocatable :: GGinv !(2*nres,2*nres) maxres2=2*maxres
134 real(kind=8),dimension(:,:,:),allocatable :: gdc !(3,2*nres,2*nres) maxres2=2*maxres
135 real(kind=8),dimension(:,:),allocatable :: Cmat !(2*nres,2*nres) maxres2=2*maxres
136 !-----------------------------------------------------------------------------
137 ! common /syfek/ subroutines: friction_force,setup_fricmat
138 !el real(kind=8),dimension(:),allocatable :: gamvec !(MAXRES6) or (MAXRES2)
139 !-----------------------------------------------------------------------------
140 ! common /przechowalnia/ subroutines: friction_force,setup_fricmat
141 real(kind=8),dimension(:,:),allocatable :: ginvfric !(2*nres,2*nres) !maxres2=2*maxres
142 !-----------------------------------------------------------------------------
143 ! common /przechowalnia/ subroutine: setup_fricmat
144 real(kind=8),dimension(:,:),allocatable :: fcopy !(2*nres,2*nres)
145 !-----------------------------------------------------------------------------
148 !-----------------------------------------------------------------------------
150 !-----------------------------------------------------------------------------
152 !-----------------------------------------------------------------------------
153 subroutine brown_step(itime)
154 !------------------------------------------------
155 ! Perform a single Euler integration step of Brownian dynamics
156 !------------------------------------------------
157 ! implicit real*8 (a-h,o-z)
159 use control, only: tcpu
162 ! use io_conf, only:cartprint
163 ! include 'DIMENSIONS'
167 ! include 'COMMON.CONTROL'
168 ! include 'COMMON.VAR'
169 ! include 'COMMON.MD'
171 ! include 'COMMON.LANGEVIN'
173 ! include 'COMMON.LANGEVIN.lang0'
175 ! include 'COMMON.CHAIN'
176 ! include 'COMMON.DERIV'
177 ! include 'COMMON.GEO'
178 ! include 'COMMON.LOCAL'
179 ! include 'COMMON.INTERACT'
180 ! include 'COMMON.IOUNITS'
181 ! include 'COMMON.NAMES'
182 ! include 'COMMON.TIME1'
183 real(kind=8),dimension(6*nres) :: zapas !(MAXRES6) maxres6=6*maxres
184 integer :: rstcount !ilen,
186 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
187 real(kind=8),dimension(6*nres,2*nres) :: Bmat,GBmat,Tmat !(MAXRES6,MAXRES2) (maxres2=2*maxres,maxres6=6*maxres)
188 real(kind=8),dimension(2*nres,2*nres) :: Cmat_,Cinv !(maxres2,maxres2) maxres2=2*maxres
189 real(kind=8),dimension(6*nres,6*nres) :: Pmat !(maxres6,maxres6) maxres6=6*maxres
190 ! real(kind=8),dimension(:,:),allocatable :: Bmat,GBmat,Tmat !(MAXRES6,MAXRES2) (maxres2=2*maxres,maxres6=6*maxres)
191 ! real(kind=8),dimension(:,:),allocatable :: Cmat_,Cinv !(maxres2,maxres2) maxres2=2*maxres
192 ! real(kind=8),dimension(:,:),allocatable :: Pmat !(maxres6,maxres6) maxres6=6*maxres
193 real(kind=8),dimension(6*nres) :: Td !(maxres6) maxres6=6*maxres
194 real(kind=8),dimension(2*nres) :: ppvec !(maxres2) maxres2=2*maxres
195 !el common /stochcalc/ stochforcvec
196 !el real(kind=8),dimension(3) :: cm !el
197 !el common /gucio/ cm
199 logical :: lprn = .false.,lprn1 = .false.
200 integer :: maxiter = 5
201 real(kind=8) :: difftol = 1.0d-5
202 real(kind=8) :: xx,diffmax,blen2,diffbond,tt0
203 integer :: i,j,nbond,k,ind,ind1,iter
204 integer :: nres2,nres6
208 ! if (.not.allocated(Bmat)) allocate(Bmat(nres6,nres2))
209 ! if (.not.allocated(GBmat)) allocate (GBmat(nres6,nres2))
210 ! if (.not.allocated(Tmat)) allocate (Tmat(nres6,nres2))
211 ! if (.not.allocated(Cmat_)) allocate(Cmat_(nres2,nres2))
212 ! if (.not.allocated(Cinv)) allocate (Cinv(nres2,nres2))
213 ! if (.not.allocated(Pmat)) allocate(Pmat(6*nres,6*nres))
215 if (.not.allocated(stochforcvec)) allocate(stochforcvec(nres6)) !(MAXRES6) maxres6=6*maxres
219 if (itype(i,1).ne.10) nbond=nbond+1
223 write (iout,*) "Generalized inverse of fricmat"
224 call matout(dimen,dimen,nres6,nres6,fricmat)
236 Bmat(ind+j,ind1)=dC_norm(j,i)
241 if (itype(i,1).ne.10) then
244 Bmat(ind+j,ind1)=dC_norm(j,i+nres)
250 write (iout,*) "Matrix Bmat"
251 call MATOUT(nbond,dimen,nres6,nres6,Bmat)
257 GBmat(i,j)=GBmat(i,j)+fricmat(i,k)*Bmat(k,j)
262 write (iout,*) "Matrix GBmat"
263 call MATOUT(nbond,dimen,nres6,nres2,Gbmat)
269 Cmat_(i,j)=Cmat_(i,j)+Bmat(k,i)*GBmat(k,j)
274 write (iout,*) "Matrix Cmat"
275 call MATOUT(nbond,nbond,nres2,nres2,Cmat_)
277 call matinvert(nbond,nres2,Cmat_,Cinv,osob)
279 write (iout,*) "Matrix Cinv"
280 call MATOUT(nbond,nbond,nres2,nres2,Cinv)
286 Tmat(i,j)=Tmat(i,j)+GBmat(i,k)*Cinv(k,j)
291 write (iout,*) "Matrix Tmat"
292 call MATOUT(nbond,dimen,nres6,nres2,Tmat)
302 Pmat(i,j)=Pmat(i,j)-Tmat(i,k)*Bmat(j,k)
307 write (iout,*) "Matrix Pmat"
308 call MATOUT(dimen,dimen,nres6,nres6,Pmat)
315 Td(i)=Td(i)+vbl*Tmat(i,ind)
318 if (itype(k,1).ne.10) then
320 Td(i)=Td(i)+vbldsc0(1,itype(k,1))*Tmat(i,ind)
325 write (iout,*) "Vector Td"
327 write (iout,'(i5,f10.5)') i,Td(i)
330 call stochastic_force(stochforcvec)
332 write (iout,*) "stochforcvec"
334 write (iout,*) i,stochforcvec(i)
338 zapas(j)=-gcart(j,0)+stochforcvec(j)
340 dC_work(j)=dC_old(j,0)
346 zapas(ind)=-gcart(j,i)+stochforcvec(ind)
347 dC_work(ind)=dC_old(j,i)
351 if (itype(i,1).ne.10) then
354 zapas(ind)=-gxcart(j,i)+stochforcvec(ind)
355 dC_work(ind)=dC_old(j,i+nres)
361 write (iout,*) "Initial d_t_work"
363 write (iout,*) i,d_t_work(i)
370 d_t_work(i)=d_t_work(i)+fricmat(i,j)*zapas(j)
377 zapas(i)=zapas(i)+Pmat(i,j)*(dC_work(j)+d_t_work(j)*d_time)
381 write (iout,*) "Final d_t_work and zapas"
383 write (iout,*) i,d_t_work(i),zapas(i)
397 dc_work(ind+j)=dc(j,i)
403 d_t(j,i+nres)=d_t_work(ind+j)
404 dc(j,i+nres)=zapas(ind+j)
405 dc_work(ind+j)=dc(j,i+nres)
411 write (iout,*) "Before correction for rotational lengthening"
412 write (iout,*) "New coordinates",&
413 " and differences between actual and standard bond lengths"
418 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
422 if (itype(i,1).ne.10) then
424 xx=vbld(i+nres)-vbldsc0(1,itype(i,1))
425 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
426 i,(dC(j,i+nres),j=1,3),xx
430 ! Second correction (rotational lengthening)
436 blen2 = scalar(dc(1,i),dc(1,i))
437 ppvec(ind)=2*vbl**2-blen2
438 diffbond=dabs(vbl-dsqrt(blen2))
439 if (diffbond.gt.diffmax) diffmax=diffbond
440 if (ppvec(ind).gt.0.0d0) then
441 ppvec(ind)=dsqrt(ppvec(ind))
446 write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind)
450 if (itype(i,1).ne.10) then
452 blen2 = scalar(dc(1,i+nres),dc(1,i+nres))
453 ppvec(ind)=2*vbldsc0(1,itype(i,1))**2-blen2
454 diffbond=dabs(vbldsc0(1,itype(i,1))-dsqrt(blen2))
455 if (diffbond.gt.diffmax) diffmax=diffbond
456 if (ppvec(ind).gt.0.0d0) then
457 ppvec(ind)=dsqrt(ppvec(ind))
462 write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind)
466 if (lprn) write (iout,*) "iter",iter," diffmax",diffmax
467 if (diffmax.lt.difftol) goto 10
471 Td(i)=Td(i)+ppvec(j)*Tmat(i,j)
477 zapas(i)=zapas(i)+Pmat(i,j)*dc_work(j)
488 dc_work(ind+j)=zapas(ind+j)
493 if (itype(i,1).ne.10) then
495 dc(j,i+nres)=zapas(ind+j)
496 dc_work(ind+j)=zapas(ind+j)
501 ! Building the chain from the newly calculated coordinates
504 if (large.and. mod(itime,ntwe).eq.0) then
505 write (iout,*) "Cartesian and internal coordinates: step 1"
508 write (iout,'(a)') "Potential forces"
510 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(-gcart(j,i),j=1,3),&
513 write (iout,'(a)') "Stochastic forces"
515 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(stochforc(j,i),j=1,3),&
516 (stochforc(j,i+nres),j=1,3)
518 write (iout,'(a)') "Velocities"
520 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
521 (d_t(j,i+nres),j=1,3)
526 write (iout,*) "After correction for rotational lengthening"
527 write (iout,*) "New coordinates",&
528 " and differences between actual and standard bond lengths"
533 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
537 if (itype(i,1).ne.10) then
539 xx=vbld(i+nres)-vbldsc0(1,itype(i,1))
540 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
541 i,(dC(j,i+nres),j=1,3),xx
546 ! write (iout,*) "Too many attempts at correcting the bonds"
554 ! Calculate energy and forces
556 call etotal(potEcomp)
557 potE=potEcomp(0)-potEcomp(20)
561 ! Calculate the kinetic and total energy and the kinetic temperature
564 t_enegrad=t_enegrad+MPI_Wtime()-tt0
566 t_enegrad=t_enegrad+tcpu()-tt0
569 kinetic_T=2.0d0/(dimen*Rb)*EK
571 end subroutine brown_step
572 !-----------------------------------------------------------------------------
574 !-----------------------------------------------------------------------------
575 subroutine gauss(RO,AP,MT,M,N,*)
577 ! CALCULATES (RO**(-1))*AP BY GAUSS ELIMINATION
578 ! RO IS A SQUARE MATRIX
579 ! THE CALCULATED PRODUCT IS STORED IN AP
580 ! ABNORMAL EXIT IF RO IS SINGULAR
582 integer :: MT, M, N, M1,I,J,IM,&
584 real(kind=8) :: RO(MT,M),AP(MT,N),X,RM,PR,Y
590 if(dabs(X).le.1.0D-13) return 1
602 if(DABS(RO(J,I)).LE.RM) goto 2
616 if(dabs(X).le.1.0E-13) return 1
625 8 AP(J,K)=AP(J,K)-Y*AP(I,K)
627 9 RO(J,K)=RO(J,K)-Y*RO(I,K)
631 if(dabs(X).le.1.0E-13) return 1
641 15 X=X-AP(K,J)*RO(MI,K)
646 !-----------------------------------------------------------------------------
648 !-----------------------------------------------------------------------------
649 subroutine kinetic(KE_total)
650 !----------------------------------------------------------------
651 ! This subroutine calculates the total kinetic energy of the chain
652 !-----------------------------------------------------------------
654 ! implicit real*8 (a-h,o-z)
655 ! include 'DIMENSIONS'
656 ! include 'COMMON.VAR'
657 ! include 'COMMON.CHAIN'
658 ! include 'COMMON.DERIV'
659 ! include 'COMMON.GEO'
660 ! include 'COMMON.LOCAL'
661 ! include 'COMMON.INTERACT'
662 ! include 'COMMON.MD'
663 ! include 'COMMON.IOUNITS'
664 real(kind=8) :: KE_total,mscab
666 integer :: i,j,k,iti,mnum
667 real(kind=8) :: KEt_p,KEt_sc,KEr_p,KEr_sc,incr(3),&
670 write (iout,*) "Velocities, kietic"
672 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
673 (d_t(j,i+nres),j=1,3)
678 ! write (iout,*) "ISC",(isc(itype(i,1)),i=1,nres)
679 ! The translational part for peptide virtual bonds
685 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
686 ! write (iout,*) "Kinetic trp:",i,(incr(j),j=1,3)
688 v(j)=incr(j)+0.5d0*d_t(j,i)
690 vtot(i)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3)
691 KEt_p=KEt_p+mp(mnum)*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))
693 incr(j)=incr(j)+d_t(j,i)
696 ! write(iout,*) 'KEt_p', KEt_p
697 ! The translational part for the side chain virtual bond
698 ! Only now we can initialize incr with zeros. It must be equal
699 ! to the velocities of the first Calpha.
705 iti=iabs(itype(i,mnum))
711 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
712 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
713 .or.(mnum.eq.5)) then
719 v(j)=incr(j)+d_t(j,nres+i)
722 ! write (iout,*) "Kinetic trsc:",i,(incr(j),j=1,3)
723 ! write (iout,*) "i",i," msc",msc(iti)," v",(v(j),j=1,3)
724 KEt_sc=KEt_sc+mscab*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))
725 vtot(i+nres)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3)
727 incr(j)=incr(j)+d_t(j,i)
731 ! write(iout,*) 'KEt_sc', KEt_sc
732 ! The part due to stretching and rotation of the peptide groups
736 ! write (iout,*) "i",i
737 ! write (iout,*) "i",i," mag1",mag1," mag2",mag2
741 ! write (iout,*) "Kinetic rotp:",i,(incr(j),j=1,3)
742 KEr_p=KEr_p+Ip(mnum)*(incr(1)*incr(1)+incr(2)*incr(2) &
746 ! write(iout,*) 'KEr_p', KEr_p
747 ! The rotational part of the side chain virtual bond
751 iti=iabs(itype(i,mnum))
752 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
753 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
754 .and.(mnum.ne.5)) then
756 incr(j)=d_t(j,nres+i)
758 ! write (iout,*) "Kinetic rotsc:",i,(incr(j),j=1,3)
759 KEr_sc=KEr_sc+Isc(iti,mnum)*(incr(1)*incr(1)+incr(2)*incr(2)+ &
763 ! The total kinetic energy
765 ! write(iout,*) 'KEr_sc', KEr_sc
766 KE_total=0.5d0*(KEt_p+KEt_sc+0.25d0*KEr_p+KEr_sc)
767 ! write (iout,*) "KE_total",KE_total
769 end subroutine kinetic
770 !-----------------------------------------------------------------------------
772 !-----------------------------------------------------------------------------
774 !------------------------------------------------
775 ! The driver for molecular dynamics subroutines
776 !------------------------------------------------
779 use control, only:tcpu,ovrtim
780 ! use io_comm, only:ilen
782 use compare, only:secondary2,hairpin
783 use io, only:cartout,statout
784 ! implicit real*8 (a-h,o-z)
785 ! include 'DIMENSIONS'
788 integer :: IERROR,ERRCODE
790 ! include 'COMMON.SETUP'
791 ! include 'COMMON.CONTROL'
792 ! include 'COMMON.VAR'
793 ! include 'COMMON.MD'
795 ! include 'COMMON.LANGEVIN'
797 ! include 'COMMON.LANGEVIN.lang0'
799 ! include 'COMMON.CHAIN'
800 ! include 'COMMON.DERIV'
801 ! include 'COMMON.GEO'
802 ! include 'COMMON.LOCAL'
803 ! include 'COMMON.INTERACT'
804 ! include 'COMMON.IOUNITS'
805 ! include 'COMMON.NAMES'
806 ! include 'COMMON.TIME1'
807 ! include 'COMMON.HAIRPIN'
808 real(kind=8),dimension(3) :: L,vcm
810 real(kind=8),dimension(6*nres) :: v_work,v_transf !(maxres6) maxres6=6*maxres
812 integer :: rstcount !ilen,
814 character(len=50) :: tytul
815 !el common /gucio/ cm
816 integer :: itime,i,j,nharp
817 integer,dimension(4,nres/3) :: iharp !(4,nres/3)(4,maxres/3)
819 real(kind=8) :: tt0,scalfac
825 print *,"MY tmpdir",tmpdir,ilen(tmpdir)
826 if (ilen(tmpdir).gt.0) &
827 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_" &
828 //liczba(:ilen(liczba))//'.rst')
830 if (ilen(tmpdir).gt.0) &
831 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_"//'.rst')
838 write (iout,'(20(1h=),a20,20(1h=))') "MD calculation started"
844 print *,"just befor setup matix",nres
845 ! Determine the inverse of the inertia matrix.
846 call setup_MD_matrices
848 print *,"AFTER SETUP MATRICES"
850 print *,"AFTER INIT MD"
853 t_MDsetup = MPI_Wtime()-tt0
855 t_MDsetup = tcpu()-tt0
858 ! Entering the MD loop
864 if (lang.eq.2 .or. lang.eq.3) then
868 call sd_verlet_p_setup
870 call sd_verlet_ciccotti_setup
874 pfric0_mat(i,j,0)=pfric_mat(i,j)
875 afric0_mat(i,j,0)=afric_mat(i,j)
876 vfric0_mat(i,j,0)=vfric_mat(i,j)
877 prand0_mat(i,j,0)=prand_mat(i,j)
878 vrand0_mat1(i,j,0)=vrand_mat1(i,j)
879 vrand0_mat2(i,j,0)=vrand_mat2(i,j)
884 flag_stoch(i)=.false.
888 "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
890 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
894 else if (lang.eq.1 .or. lang.eq.4) then
895 print *,"before setup_fricmat"
897 print *,"after setup_fricmat"
900 t_langsetup=MPI_Wtime()-tt0
903 t_langsetup=tcpu()-tt0
906 do itime=1,n_timestep
908 if (large.and. mod(itime,ntwe).eq.0) &
909 write (iout,*) "itime",itime
911 if (lang.gt.0 .and. surfarea .and. &
912 mod(itime,reset_fricmat).eq.0) then
913 if (lang.eq.2 .or. lang.eq.3) then
917 call sd_verlet_p_setup
919 call sd_verlet_ciccotti_setup
923 pfric0_mat(i,j,0)=pfric_mat(i,j)
924 afric0_mat(i,j,0)=afric_mat(i,j)
925 vfric0_mat(i,j,0)=vfric_mat(i,j)
926 prand0_mat(i,j,0)=prand_mat(i,j)
927 vrand0_mat1(i,j,0)=vrand_mat1(i,j)
928 vrand0_mat2(i,j,0)=vrand_mat2(i,j)
933 flag_stoch(i)=.false.
936 else if (lang.eq.1 .or. lang.eq.4) then
939 write (iout,'(a,i10)') &
940 "Friction matrix reset based on surface area, itime",itime
942 if (reset_vel .and. tbf .and. lang.eq.0 &
943 .and. mod(itime,count_reset_vel).eq.0) then
945 write(iout,'(a,f20.2)') &
946 "Velocities reset to random values, time",totT
949 d_t_old(j,i)=d_t(j,i)
953 if (reset_moment .and. mod(itime,count_reset_moment).eq.0) then
957 d_t(j,0)=d_t(j,0)-vcm(j)
960 kinetic_T=2.0d0/(dimen3*Rb)*EK
961 scalfac=dsqrt(T_bath/kinetic_T)
962 write(iout,'(a,f20.2)') "Momenta zeroed out, time",totT
965 d_t_old(j,i)=scalfac*d_t(j,i)
971 ! Time-reversible RESPA algorithm
972 ! (Tuckerman et al., J. Chem. Phys., 97, 1990, 1992)
973 call RESPA_step(itime)
975 ! Variable time step algorithm.
976 call velverlet_step(itime)
980 call brown_step(itime)
982 print *,"Brown dynamics not here!"
984 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
990 if (mod(itime,ntwe).eq.0) then
993 ! call check_ecartint
1003 v_work(ind)=d_t(j,i)
1008 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1.and.mnum.ne.5) then
1011 v_work(ind)=d_t(j,i+nres)
1016 write (66,'(80f10.5)') &
1017 ((d_t(j,i),j=1,3),i=0,nres-1),((d_t(j,i+nres),j=1,3),i=1,nres)
1021 v_transf(i)=v_transf(i)+gvec(j,i)*v_work(j)
1023 v_transf(i)= v_transf(i)*dsqrt(geigen(i))
1025 write (67,'(80f10.5)') (v_transf(i),i=1,ind)
1028 if (mod(itime,ntwx).eq.0) then
1030 write (tytul,'("time",f8.2)') totT
1032 call hairpin(.true.,nharp,iharp)
1033 call secondary2(.true.)
1034 call pdbout(potE,tytul,ipdb)
1039 if (rstcount.eq.1000.or.itime.eq.n_timestep) then
1040 open(irest2,file=rest2name,status='unknown')
1041 write(irest2,*) totT,EK,potE,totE,t_bath
1043 ! AL 4/17/17: Now writing d_t(0,:) too
1045 write (irest2,'(3e15.5)') (d_t(j,i),j=1,3)
1047 ! AL 4/17/17: Now writing d_c(0,:) too
1049 write (irest2,'(3e15.5)') (dc(j,i),j=1,3)
1057 t_MD=MPI_Wtime()-tt0
1061 write (iout,'(//35(1h=),a10,35(1h=)/10(/a40,1pe15.5))') &
1063 'MD calculations setup:',t_MDsetup,&
1064 'Energy & gradient evaluation:',t_enegrad,&
1065 'Stochastic MD setup:',t_langsetup,&
1066 'Stochastic MD step setup:',t_sdsetup,&
1068 write (iout,'(/28(1h=),a25,27(1h=))') &
1069 ' End of MD calculation '
1071 write (iout,*) "time for etotal",t_etotal," elong",t_elong,&
1073 write (iout,*) "time_fric",time_fric," time_stoch",time_stoch,&
1074 " time_fricmatmult",time_fricmatmult," time_fsample ",&
1079 !-----------------------------------------------------------------------------
1080 subroutine velverlet_step(itime)
1081 !-------------------------------------------------------------------------------
1082 ! Perform a single velocity Verlet step; the time step can be rescaled if
1083 ! increments in accelerations exceed the threshold
1084 !-------------------------------------------------------------------------------
1085 ! implicit real*8 (a-h,o-z)
1086 ! include 'DIMENSIONS'
1088 use control, only:tcpu
1092 integer :: ierror,ierrcode
1093 real(kind=8) :: errcode
1095 ! include 'COMMON.SETUP'
1096 ! include 'COMMON.VAR'
1097 ! include 'COMMON.MD'
1099 ! include 'COMMON.LANGEVIN'
1101 ! include 'COMMON.LANGEVIN.lang0'
1103 ! include 'COMMON.CHAIN'
1104 ! include 'COMMON.DERIV'
1105 ! include 'COMMON.GEO'
1106 ! include 'COMMON.LOCAL'
1107 ! include 'COMMON.INTERACT'
1108 ! include 'COMMON.IOUNITS'
1109 ! include 'COMMON.NAMES'
1110 ! include 'COMMON.TIME1'
1111 ! include 'COMMON.MUCA'
1112 real(kind=8),dimension(3) :: vcm,incr
1113 real(kind=8),dimension(3) :: L
1114 integer :: count,rstcount !ilen,
1116 character(len=50) :: tytul
1117 integer :: maxcount_scale = 20
1118 !el common /gucio/ cm
1119 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
1120 !el common /stochcalc/ stochforcvec
1121 integer :: itime,icount_scale,itime_scal,i,j,ifac_time
1123 real(kind=8) :: epdrift,tt0,fac_time
1125 if (.not.allocated(stochforcvec)) allocate(stochforcvec(6*nres)) !(MAXRES6) maxres6=6*maxres
1131 else if (lang.eq.2 .or. lang.eq.3) then
1133 call stochastic_force(stochforcvec)
1136 "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
1138 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1145 icount_scale=icount_scale+1
1146 if (icount_scale.gt.maxcount_scale) then
1148 "ERROR: too many attempts at scaling down the time step. ",&
1149 "amax=",amax,"epdrift=",epdrift,&
1150 "damax=",damax,"edriftmax=",edriftmax,&
1154 call MPI_Abort(MPI_COMM_WORLD,IERROR,IERRCODE)
1158 ! First step of the velocity Verlet algorithm
1163 else if (lang.eq.3) then
1165 call sd_verlet1_ciccotti
1167 else if (lang.eq.1) then
1172 ! Build the chain from the newly calculated coordinates
1173 call chainbuild_cart
1174 if (rattle) call rattle1
1176 if (large.and. mod(itime,ntwe).eq.0) then
1177 write (iout,*) "Cartesian and internal coordinates: step 1"
1182 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),&
1183 (dc(j,i+nres),j=1,3)
1185 write (iout,*) "Accelerations"
1187 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1188 (d_a(j,i+nres),j=1,3)
1190 write (iout,*) "Velocities, step 1"
1192 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1193 (d_t(j,i+nres),j=1,3)
1202 ! Calculate energy and forces
1204 call etotal(potEcomp)
1205 ! AL 4/17/17: Reduce the steps if NaNs occurred.
1206 if (potEcomp(0).gt.0.99e18 .or. isnan(potEcomp(0)).gt.0) then
1211 if (large.and. mod(itime,ntwe).eq.0) &
1212 call enerprint(potEcomp)
1215 t_etotal=t_etotal+MPI_Wtime()-tt0
1217 t_etotal=t_etotal+tcpu()-tt0
1220 potE=potEcomp(0)-potEcomp(20)
1222 ! Get the new accelerations
1225 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1227 t_enegrad=t_enegrad+tcpu()-tt0
1229 ! Determine maximum acceleration and scale down the timestep if needed
1231 amax=amax/(itime_scal+1)**2
1232 call predict_edrift(epdrift)
1233 if (amax/(itime_scal+1).gt.damax .or. epdrift.gt.edriftmax) then
1234 ! Maximum acceleration or maximum predicted energy drift exceeded, rescale the time step
1236 ifac_time=dmax1(dlog(amax/damax),dlog(epdrift/edriftmax)) &
1238 itime_scal=itime_scal+ifac_time
1239 ! fac_time=dmin1(damax/amax,0.5d0)
1240 fac_time=0.5d0**ifac_time
1241 d_time=d_time*fac_time
1242 if (lang.eq.2 .or. lang.eq.3) then
1244 ! write (iout,*) "Calling sd_verlet_setup: 1"
1245 ! Rescale the stochastic forces and recalculate or restore
1246 ! the matrices of tinker integrator
1247 if (itime_scal.gt.maxflag_stoch) then
1248 if (large) write (iout,'(a,i5,a)') &
1249 "Calculate matrices for stochastic step;",&
1250 " itime_scal ",itime_scal
1252 call sd_verlet_p_setup
1254 call sd_verlet_ciccotti_setup
1256 write (iout,'(2a,i3,a,i3,1h.)') &
1257 "Warning: cannot store matrices for stochastic",&
1258 " integration because the index",itime_scal,&
1259 " is greater than",maxflag_stoch
1260 write (iout,'(2a)')"Increase MAXFLAG_STOCH or use direct",&
1261 " integration Langevin algorithm for better efficiency."
1262 else if (flag_stoch(itime_scal)) then
1263 if (large) write (iout,'(a,i5,a,l1)') &
1264 "Restore matrices for stochastic step; itime_scal ",&
1265 itime_scal," flag ",flag_stoch(itime_scal)
1268 pfric_mat(i,j)=pfric0_mat(i,j,itime_scal)
1269 afric_mat(i,j)=afric0_mat(i,j,itime_scal)
1270 vfric_mat(i,j)=vfric0_mat(i,j,itime_scal)
1271 prand_mat(i,j)=prand0_mat(i,j,itime_scal)
1272 vrand_mat1(i,j)=vrand0_mat1(i,j,itime_scal)
1273 vrand_mat2(i,j)=vrand0_mat2(i,j,itime_scal)
1277 if (large) write (iout,'(2a,i5,a,l1)') &
1278 "Calculate & store matrices for stochastic step;",&
1279 " itime_scal ",itime_scal," flag ",flag_stoch(itime_scal)
1281 call sd_verlet_p_setup
1283 call sd_verlet_ciccotti_setup
1285 flag_stoch(ifac_time)=.true.
1288 pfric0_mat(i,j,itime_scal)=pfric_mat(i,j)
1289 afric0_mat(i,j,itime_scal)=afric_mat(i,j)
1290 vfric0_mat(i,j,itime_scal)=vfric_mat(i,j)
1291 prand0_mat(i,j,itime_scal)=prand_mat(i,j)
1292 vrand0_mat1(i,j,itime_scal)=vrand_mat1(i,j)
1293 vrand0_mat2(i,j,itime_scal)=vrand_mat2(i,j)
1297 fac_time=1.0d0/dsqrt(fac_time)
1299 stochforcvec(i)=fac_time*stochforcvec(i)
1302 else if (lang.eq.1) then
1303 ! Rescale the accelerations due to stochastic forces
1304 fac_time=1.0d0/dsqrt(fac_time)
1306 d_as_work(i)=d_as_work(i)*fac_time
1309 if (large) write (iout,'(a,i10,a,f8.6,a,i3,a,i3)') &
1310 "itime",itime," Timestep scaled down to ",&
1311 d_time," ifac_time",ifac_time," itime_scal",itime_scal
1313 ! Second step of the velocity Verlet algorithm
1318 else if (lang.eq.3) then
1320 call sd_verlet2_ciccotti
1322 else if (lang.eq.1) then
1327 if (rattle) call rattle2
1330 if (d_time.ne.d_time0) then
1333 if (lang.eq.2 .or. lang.eq.3) then
1334 if (large) write (iout,'(a)') &
1335 "Restore original matrices for stochastic step"
1336 ! write (iout,*) "Calling sd_verlet_setup: 2"
1337 ! Restore the matrices of tinker integrator if the time step has been restored
1340 pfric_mat(i,j)=pfric0_mat(i,j,0)
1341 afric_mat(i,j)=afric0_mat(i,j,0)
1342 vfric_mat(i,j)=vfric0_mat(i,j,0)
1343 prand_mat(i,j)=prand0_mat(i,j,0)
1344 vrand_mat1(i,j)=vrand0_mat1(i,j,0)
1345 vrand_mat2(i,j)=vrand0_mat2(i,j,0)
1354 ! Calculate the kinetic and the total energy and the kinetic temperature
1358 ! call kinetic1(EK1)
1359 ! write (iout,*) "step",itime," EK",EK," EK1",EK1
1361 ! Couple the system to Berendsen bath if needed
1362 if (tbf .and. lang.eq.0) then
1365 kinetic_T=2.0d0/(dimen3*Rb)*EK
1366 ! Backup the coordinates, velocities, and accelerations
1370 d_t_old(j,i)=d_t(j,i)
1371 d_a_old(j,i)=d_a(j,i)
1375 if (mod(itime,ntwe).eq.0 .and. large) then
1376 write (iout,*) "Velocities, step 2"
1378 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1379 (d_t(j,i+nres),j=1,3)
1384 end subroutine velverlet_step
1385 !-----------------------------------------------------------------------------
1386 subroutine RESPA_step(itime)
1387 !-------------------------------------------------------------------------------
1388 ! Perform a single RESPA step.
1389 !-------------------------------------------------------------------------------
1390 ! implicit real*8 (a-h,o-z)
1391 ! include 'DIMENSIONS'
1395 use control, only:tcpu
1397 ! use io_conf, only:cartprint
1400 integer :: IERROR,ERRCODE
1402 ! include 'COMMON.SETUP'
1403 ! include 'COMMON.CONTROL'
1404 ! include 'COMMON.VAR'
1405 ! include 'COMMON.MD'
1407 ! include 'COMMON.LANGEVIN'
1409 ! include 'COMMON.LANGEVIN.lang0'
1411 ! include 'COMMON.CHAIN'
1412 ! include 'COMMON.DERIV'
1413 ! include 'COMMON.GEO'
1414 ! include 'COMMON.LOCAL'
1415 ! include 'COMMON.INTERACT'
1416 ! include 'COMMON.IOUNITS'
1417 ! include 'COMMON.NAMES'
1418 ! include 'COMMON.TIME1'
1419 real(kind=8),dimension(0:n_ene) :: energia_short,energia_long
1420 real(kind=8),dimension(3) :: L,vcm,incr
1421 real(kind=8),dimension(3,0:2*nres) :: dc_old0,d_t_old0,d_a_old0 !(3,0:maxres2) maxres2=2*maxres
1422 logical :: PRINT_AMTS_MSG = .false.
1423 integer :: count,rstcount !ilen,
1425 character(len=50) :: tytul
1426 integer :: maxcount_scale = 10
1427 !el common /gucio/ cm
1428 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
1429 !el common /stochcalc/ stochforcvec
1430 integer :: itime,itt,i,j,itsplit
1432 !el common /cipiszcze/ itt
1434 real(kind=8) :: epdrift,tt0,epdriftmax
1437 if (.not.allocated(stochforcvec)) allocate(stochforcvec(6*nres)) !(MAXRES6) maxres6=6*maxres
1441 if (large.and. mod(itime,ntwe).eq.0) then
1442 write (iout,*) "***************** RESPA itime",itime
1443 write (iout,*) "Cartesian and internal coordinates: step 0"
1445 call pdbout(0.0d0,"cipiszcze",iout)
1447 write (iout,*) "Accelerations from long-range forces"
1449 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1450 (d_a(j,i+nres),j=1,3)
1452 write (iout,*) "Velocities, step 0"
1454 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1455 (d_t(j,i+nres),j=1,3)
1460 ! Perform the initial RESPA step (increment velocities)
1461 ! write (iout,*) "*********************** RESPA ini"
1464 if (mod(itime,ntwe).eq.0 .and. large) then
1465 write (iout,*) "Velocities, end"
1467 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1468 (d_t(j,i+nres),j=1,3)
1472 ! Compute the short-range forces
1478 ! 7/2/2009 commented out
1480 ! call etotal_short(energia_short)
1483 ! 7/2/2009 Copy accelerations due to short-lange forces from previous MD step
1486 d_a(j,i)=d_a_short(j,i)
1490 if (large.and. mod(itime,ntwe).eq.0) then
1491 write (iout,*) "energia_short",energia_short(0)
1492 write (iout,*) "Accelerations from short-range forces"
1494 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1495 (d_a(j,i+nres),j=1,3)
1500 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1502 t_enegrad=t_enegrad+tcpu()-tt0
1507 d_t_old(j,i)=d_t(j,i)
1508 d_a_old(j,i)=d_a(j,i)
1511 ! 6/30/08 A-MTS: attempt at increasing the split number
1514 dc_old0(j,i)=dc_old(j,i)
1515 d_t_old0(j,i)=d_t_old(j,i)
1516 d_a_old0(j,i)=d_a_old(j,i)
1519 if (ntime_split.gt.ntime_split0) ntime_split=ntime_split/2
1520 if (ntime_split.lt.ntime_split0) ntime_split=ntime_split0
1527 ! write (iout,*) "itime",itime," ntime_split",ntime_split
1528 ! Split the time step
1529 d_time=d_time0/ntime_split
1530 ! Perform the short-range RESPA steps (velocity Verlet increments of
1531 ! positions and velocities using short-range forces)
1532 ! write (iout,*) "*********************** RESPA split"
1533 do itsplit=1,ntime_split
1536 else if (lang.eq.2 .or. lang.eq.3) then
1538 call stochastic_force(stochforcvec)
1541 "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
1543 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1548 ! First step of the velocity Verlet algorithm
1553 else if (lang.eq.3) then
1555 call sd_verlet1_ciccotti
1557 else if (lang.eq.1) then
1562 ! Build the chain from the newly calculated coordinates
1563 call chainbuild_cart
1564 if (rattle) call rattle1
1566 if (large.and. mod(itime,ntwe).eq.0) then
1567 write (iout,*) "***** ITSPLIT",itsplit
1568 write (iout,*) "Cartesian and internal coordinates: step 1"
1569 call pdbout(0.0d0,"cipiszcze",iout)
1572 write (iout,*) "Velocities, step 1"
1574 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1575 (d_t(j,i+nres),j=1,3)
1584 ! Calculate energy and forces
1586 call etotal_short(energia_short)
1587 ! AL 4/17/17: Exit itime_split loop when energy goes infinite
1588 if (energia_short(0).gt.0.99e20 .or. isnan(energia_short(0)) ) then
1589 if (PRINT_AMTS_MSG) &
1590 write (iout,*) "Infinities/NaNs in energia_short",energia_short(0),"; increasing ntime_split to",ntime_split
1591 ntime_split=ntime_split*2
1592 if (ntime_split.gt.maxtime_split) then
1595 "Cannot rescue the run; aborting job. Retry with a smaller time step"
1597 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1600 "Cannot rescue the run; terminating. Retry with a smaller time step"
1606 if (large.and. mod(itime,ntwe).eq.0) &
1607 call enerprint(energia_short)
1610 t_eshort=t_eshort+MPI_Wtime()-tt0
1612 t_eshort=t_eshort+tcpu()-tt0
1616 ! Get the new accelerations
1618 ! 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
1621 d_a_short(j,i)=d_a(j,i)
1625 if (large.and. mod(itime,ntwe).eq.0) then
1626 write (iout,*)"energia_short",energia_short(0)
1627 write (iout,*) "Accelerations from short-range forces"
1629 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1630 (d_a(j,i+nres),j=1,3)
1635 ! Determine maximum acceleration and scale down the timestep if needed
1637 amax=amax/ntime_split**2
1638 call predict_edrift(epdrift)
1639 if (ntwe.gt.0 .and. large .and. mod(itime,ntwe).eq.0) &
1640 write (iout,*) "amax",amax," damax",damax,&
1641 " epdrift",epdrift," epdriftmax",epdriftmax
1642 ! Exit loop and try with increased split number if the change of
1643 ! acceleration is too big
1644 if (amax.gt.damax .or. epdrift.gt.edriftmax) then
1645 if (ntime_split.lt.maxtime_split) then
1647 ntime_split=ntime_split*2
1648 ! AL 4/17/17: We should exit the itime_split loop when acceleration change is too big
1652 dc_old(j,i)=dc_old0(j,i)
1653 d_t_old(j,i)=d_t_old0(j,i)
1654 d_a_old(j,i)=d_a_old0(j,i)
1657 if (PRINT_AMTS_MSG) then
1658 write (iout,*) "acceleration/energy drift too large",amax,&
1659 epdrift," split increased to ",ntime_split," itime",itime,&
1665 "Uh-hu. Bumpy landscape. Maximum splitting number",&
1667 " already reached!!! Trying to carry on!"
1671 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1673 t_enegrad=t_enegrad+tcpu()-tt0
1675 ! Second step of the velocity Verlet algorithm
1680 else if (lang.eq.3) then
1682 call sd_verlet2_ciccotti
1684 else if (lang.eq.1) then
1689 if (rattle) call rattle2
1690 ! Backup the coordinates, velocities, and accelerations
1694 d_t_old(j,i)=d_t(j,i)
1695 d_a_old(j,i)=d_a(j,i)
1702 ! Restore the time step
1704 ! Compute long-range forces
1711 call etotal_long(energia_long)
1712 if (energia_long(0).gt.0.99e20 .or. isnan(energia_long(0))) then
1715 "Infinitied/NaNs in energia_long, Aborting MPI job."
1717 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1719 write (iout,*) "Infinitied/NaNs in energia_long, terminating."
1723 if (large.and. mod(itime,ntwe).eq.0) &
1724 call enerprint(energia_long)
1727 t_elong=t_elong+MPI_Wtime()-tt0
1729 t_elong=t_elong+tcpu()-tt0
1735 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1737 t_enegrad=t_enegrad+tcpu()-tt0
1739 ! Compute accelerations from long-range forces
1741 if (large.and. mod(itime,ntwe).eq.0) then
1742 write (iout,*) "energia_long",energia_long(0)
1743 write (iout,*) "Cartesian and internal coordinates: step 2"
1745 call pdbout(0.0d0,"cipiszcze",iout)
1747 write (iout,*) "Accelerations from long-range forces"
1749 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1750 (d_a(j,i+nres),j=1,3)
1752 write (iout,*) "Velocities, step 2"
1754 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1755 (d_t(j,i+nres),j=1,3)
1759 ! Compute the final RESPA step (increment velocities)
1760 ! write (iout,*) "*********************** RESPA fin"
1762 ! Compute the complete potential energy
1764 potEcomp(i)=energia_short(i)+energia_long(i)
1766 potE=potEcomp(0)-potEcomp(20)
1767 ! potE=energia_short(0)+energia_long(0)
1770 ! Calculate the kinetic and the total energy and the kinetic temperature
1773 ! Couple the system to Berendsen bath if needed
1774 if (tbf .and. lang.eq.0) then
1777 kinetic_T=2.0d0/(dimen3*Rb)*EK
1778 ! Backup the coordinates, velocities, and accelerations
1780 if (mod(itime,ntwe).eq.0 .and. large) then
1781 write (iout,*) "Velocities, end"
1783 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1784 (d_t(j,i+nres),j=1,3)
1789 end subroutine RESPA_step
1790 !-----------------------------------------------------------------------------
1791 subroutine RESPA_vel
1792 ! First and last RESPA step (incrementing velocities using long-range
1795 ! implicit real*8 (a-h,o-z)
1796 ! include 'DIMENSIONS'
1797 ! include 'COMMON.CONTROL'
1798 ! include 'COMMON.VAR'
1799 ! include 'COMMON.MD'
1800 ! include 'COMMON.CHAIN'
1801 ! include 'COMMON.DERIV'
1802 ! include 'COMMON.GEO'
1803 ! include 'COMMON.LOCAL'
1804 ! include 'COMMON.INTERACT'
1805 ! include 'COMMON.IOUNITS'
1806 ! include 'COMMON.NAMES'
1807 integer :: i,j,inres,mnum
1810 d_t(j,0)=d_t(j,0)+0.5d0*d_a(j,0)*d_time
1814 d_t(j,i)=d_t(j,i)+0.5d0*d_a(j,i)*d_time
1819 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1820 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1821 .and.(mnum.ne.5)) then
1824 d_t(j,inres)=d_t(j,inres)+0.5d0*d_a(j,inres)*d_time
1829 end subroutine RESPA_vel
1830 !-----------------------------------------------------------------------------
1832 ! Applying velocity Verlet algorithm - step 1 to coordinates
1834 ! implicit real*8 (a-h,o-z)
1835 ! include 'DIMENSIONS'
1836 ! include 'COMMON.CONTROL'
1837 ! include 'COMMON.VAR'
1838 ! include 'COMMON.MD'
1839 ! include 'COMMON.CHAIN'
1840 ! include 'COMMON.DERIV'
1841 ! include 'COMMON.GEO'
1842 ! include 'COMMON.LOCAL'
1843 ! include 'COMMON.INTERACT'
1844 ! include 'COMMON.IOUNITS'
1845 ! include 'COMMON.NAMES'
1846 real(kind=8) :: adt,adt2
1847 integer :: i,j,inres,mnum
1850 write (iout,*) "VELVERLET1 START: DC"
1852 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
1853 (dc(j,i+nres),j=1,3)
1857 adt=d_a_old(j,0)*d_time
1859 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
1860 d_t_new(j,0)=d_t_old(j,0)+adt2
1861 d_t(j,0)=d_t_old(j,0)+adt
1865 adt=d_a_old(j,i)*d_time
1867 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
1868 d_t_new(j,i)=d_t_old(j,i)+adt2
1869 d_t(j,i)=d_t_old(j,i)+adt
1874 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1875 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1876 .and.(mnum.ne.5)) then
1879 adt=d_a_old(j,inres)*d_time
1881 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
1882 d_t_new(j,inres)=d_t_old(j,inres)+adt2
1883 d_t(j,inres)=d_t_old(j,inres)+adt
1888 write (iout,*) "VELVERLET1 END: DC"
1890 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
1891 (dc(j,i+nres),j=1,3)
1895 end subroutine verlet1
1896 !-----------------------------------------------------------------------------
1898 ! Step 2 of the velocity Verlet algorithm: update velocities
1900 ! implicit real*8 (a-h,o-z)
1901 ! include 'DIMENSIONS'
1902 ! include 'COMMON.CONTROL'
1903 ! include 'COMMON.VAR'
1904 ! include 'COMMON.MD'
1905 ! include 'COMMON.CHAIN'
1906 ! include 'COMMON.DERIV'
1907 ! include 'COMMON.GEO'
1908 ! include 'COMMON.LOCAL'
1909 ! include 'COMMON.INTERACT'
1910 ! include 'COMMON.IOUNITS'
1911 ! include 'COMMON.NAMES'
1912 integer :: i,j,inres,mnum
1915 d_t(j,0)=d_t_new(j,0)+0.5d0*d_a(j,0)*d_time
1919 d_t(j,i)=d_t_new(j,i)+0.5d0*d_a(j,i)*d_time
1924 ! iti=iabs(itype(i,mnum))
1925 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1926 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1927 .and.(mnum.ne.5)) then
1930 d_t(j,inres)=d_t_new(j,inres)+0.5d0*d_a(j,inres)*d_time
1935 end subroutine verlet2
1936 !-----------------------------------------------------------------------------
1937 subroutine sddir_precalc
1938 ! Applying velocity Verlet algorithm - step 1 to coordinates
1939 ! implicit real*8 (a-h,o-z)
1940 ! include 'DIMENSIONS'
1946 ! include 'COMMON.CONTROL'
1947 ! include 'COMMON.VAR'
1948 ! include 'COMMON.MD'
1950 ! include 'COMMON.LANGEVIN'
1952 ! include 'COMMON.LANGEVIN.lang0'
1954 ! include 'COMMON.CHAIN'
1955 ! include 'COMMON.DERIV'
1956 ! include 'COMMON.GEO'
1957 ! include 'COMMON.LOCAL'
1958 ! include 'COMMON.INTERACT'
1959 ! include 'COMMON.IOUNITS'
1960 ! include 'COMMON.NAMES'
1961 ! include 'COMMON.TIME1'
1962 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
1963 !el common /stochcalc/ stochforcvec
1964 real(kind=8) :: time00
1966 ! Compute friction and stochastic forces
1971 time_fric=time_fric+MPI_Wtime()-time00
1973 call stochastic_force(stochforcvec)
1974 time_stoch=time_stoch+MPI_Wtime()-time00
1977 ! Compute the acceleration due to friction forces (d_af_work) and stochastic
1978 ! forces (d_as_work)
1980 call ginv_mult(fric_work, d_af_work)
1981 call ginv_mult(stochforcvec, d_as_work)
1983 end subroutine sddir_precalc
1984 !-----------------------------------------------------------------------------
1985 subroutine sddir_verlet1
1986 ! Applying velocity Verlet algorithm - step 1 to velocities
1989 ! implicit real*8 (a-h,o-z)
1990 ! include 'DIMENSIONS'
1991 ! include 'COMMON.CONTROL'
1992 ! include 'COMMON.VAR'
1993 ! include 'COMMON.MD'
1995 ! include 'COMMON.LANGEVIN'
1997 ! include 'COMMON.LANGEVIN.lang0'
1999 ! include 'COMMON.CHAIN'
2000 ! include 'COMMON.DERIV'
2001 ! include 'COMMON.GEO'
2002 ! include 'COMMON.LOCAL'
2003 ! include 'COMMON.INTERACT'
2004 ! include 'COMMON.IOUNITS'
2005 ! include 'COMMON.NAMES'
2006 ! Revised 3/31/05 AL: correlation between random contributions to
2007 ! position and velocity increments included.
2008 real(kind=8) :: sqrt13 = 0.57735026918962576451d0 ! 1/sqrt(3)
2009 real(kind=8) :: adt,adt2
2010 integer :: i,j,ind,inres,mnum
2012 ! Add the contribution from BOTH friction and stochastic force to the
2013 ! coordinates, but ONLY the contribution from the friction forces to velocities
2016 adt=(d_a_old(j,0)+d_af_work(j))*d_time
2017 adt2=0.5d0*adt+sqrt13*d_as_work(j)*d_time
2018 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
2019 d_t_new(j,0)=d_t_old(j,0)+0.5d0*adt
2020 d_t(j,0)=d_t_old(j,0)+adt
2025 adt=(d_a_old(j,i)+d_af_work(ind+j))*d_time
2026 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
2027 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
2028 d_t_new(j,i)=d_t_old(j,i)+0.5d0*adt
2029 d_t(j,i)=d_t_old(j,i)+adt
2035 ! iti=iabs(itype(i,mnum))
2036 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2037 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2038 .and.(mnum.ne.5)) then
2041 adt=(d_a_old(j,inres)+d_af_work(ind+j))*d_time
2042 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
2043 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
2044 d_t_new(j,inres)=d_t_old(j,inres)+0.5d0*adt
2045 d_t(j,inres)=d_t_old(j,inres)+adt
2051 end subroutine sddir_verlet1
2052 !-----------------------------------------------------------------------------
2053 subroutine sddir_verlet2
2054 ! Calculating the adjusted velocities for accelerations
2057 ! implicit real*8 (a-h,o-z)
2058 ! include 'DIMENSIONS'
2059 ! include 'COMMON.CONTROL'
2060 ! include 'COMMON.VAR'
2061 ! include 'COMMON.MD'
2063 ! include 'COMMON.LANGEVIN'
2065 ! include 'COMMON.LANGEVIN.lang0'
2067 ! include 'COMMON.CHAIN'
2068 ! include 'COMMON.DERIV'
2069 ! include 'COMMON.GEO'
2070 ! include 'COMMON.LOCAL'
2071 ! include 'COMMON.INTERACT'
2072 ! include 'COMMON.IOUNITS'
2073 ! include 'COMMON.NAMES'
2074 real(kind=8),dimension(6*nres) :: stochforcvec,d_as_work1 !(MAXRES6) maxres6=6*maxres
2075 real(kind=8) :: cos60 = 0.5d0, sin60 = 0.86602540378443864676d0
2076 integer :: i,j,ind,inres,mnum
2077 ! Revised 3/31/05 AL: correlation between random contributions to
2078 ! position and velocity increments included.
2079 ! The correlation coefficients are calculated at low-friction limit.
2080 ! Also, friction forces are now not calculated with new velocities.
2082 ! call friction_force
2083 call stochastic_force(stochforcvec)
2085 ! Compute the acceleration due to friction forces (d_af_work) and stochastic
2086 ! forces (d_as_work)
2088 call ginv_mult(stochforcvec, d_as_work1)
2094 d_t(j,0)=d_t_new(j,0)+(0.5d0*(d_a(j,0)+d_af_work(j)) &
2095 +sin60*d_as_work(j)+cos60*d_as_work1(j))*d_time
2100 d_t(j,i)=d_t_new(j,i)+(0.5d0*(d_a(j,i)+d_af_work(ind+j)) &
2101 +sin60*d_as_work(ind+j)+cos60*d_as_work1(ind+j))*d_time
2107 ! iti=iabs(itype(i,mnum))
2108 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2109 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2110 .and.(mnum.ne.5)) then
2113 d_t(j,inres)=d_t_new(j,inres)+(0.5d0*(d_a(j,inres) &
2114 +d_af_work(ind+j))+sin60*d_as_work(ind+j) &
2115 +cos60*d_as_work1(ind+j))*d_time
2121 end subroutine sddir_verlet2
2122 !-----------------------------------------------------------------------------
2123 subroutine max_accel
2125 ! Find the maximum difference in the accelerations of the the sites
2126 ! at the beginning and the end of the time step.
2129 ! implicit real*8 (a-h,o-z)
2130 ! include 'DIMENSIONS'
2131 ! include 'COMMON.CONTROL'
2132 ! include 'COMMON.VAR'
2133 ! include 'COMMON.MD'
2134 ! include 'COMMON.CHAIN'
2135 ! include 'COMMON.DERIV'
2136 ! include 'COMMON.GEO'
2137 ! include 'COMMON.LOCAL'
2138 ! include 'COMMON.INTERACT'
2139 ! include 'COMMON.IOUNITS'
2140 real(kind=8),dimension(3) :: aux,accel,accel_old
2141 real(kind=8) :: dacc
2145 ! aux(j)=d_a(j,0)-d_a_old(j,0)
2146 accel_old(j)=d_a_old(j,0)
2153 ! 7/3/08 changed to asymmetric difference
2155 ! accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i))
2156 accel_old(j)=accel_old(j)+0.5d0*d_a_old(j,i)
2157 accel(j)=accel(j)+0.5d0*d_a(j,i)
2158 ! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
2159 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
2160 dacc=dabs(accel(j)-accel_old(j))
2161 ! write (iout,*) i,dacc
2162 if (dacc.gt.amax) amax=dacc
2170 accel_old(j)=d_a_old(j,0)
2175 accel_old(j)=accel_old(j)+d_a_old(j,1)
2176 accel(j)=accel(j)+d_a(j,1)
2181 ! iti=iabs(itype(i,mnum))
2182 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2183 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2184 .and.(mnum.ne.5)) then
2186 ! accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres)
2187 accel_old(j)=accel_old(j)+d_a_old(j,i+nres)
2188 accel(j)=accel(j)+d_a(j,i+nres)
2192 ! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
2193 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
2194 dacc=dabs(accel(j)-accel_old(j))
2195 ! write (iout,*) "side-chain",i,dacc
2196 if (dacc.gt.amax) amax=dacc
2200 accel_old(j)=accel_old(j)+d_a_old(j,i)
2201 accel(j)=accel(j)+d_a(j,i)
2202 ! aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i)
2206 end subroutine max_accel
2207 !-----------------------------------------------------------------------------
2208 subroutine predict_edrift(epdrift)
2210 ! Predict the drift of the potential energy
2213 use control_data, only: lmuca
2214 ! implicit real*8 (a-h,o-z)
2215 ! include 'DIMENSIONS'
2216 ! include 'COMMON.CONTROL'
2217 ! include 'COMMON.VAR'
2218 ! include 'COMMON.MD'
2219 ! include 'COMMON.CHAIN'
2220 ! include 'COMMON.DERIV'
2221 ! include 'COMMON.GEO'
2222 ! include 'COMMON.LOCAL'
2223 ! include 'COMMON.INTERACT'
2224 ! include 'COMMON.IOUNITS'
2225 ! include 'COMMON.MUCA'
2226 real(kind=8) :: epdrift,epdriftij
2228 ! Drift of the potential energy
2234 epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i))
2235 if (lmuca) epdriftij=epdriftij*factor
2236 ! write (iout,*) "back",i,j,epdriftij
2237 if (epdriftij.gt.epdrift) epdrift=epdriftij
2241 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1.and.&
2242 molnum(i).ne.5) then
2245 dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
2246 if (lmuca) epdriftij=epdriftij*factor
2247 ! write (iout,*) "side",i,j,epdriftij
2248 if (epdriftij.gt.epdrift) epdrift=epdriftij
2252 epdrift=0.5d0*epdrift*d_time*d_time
2253 ! write (iout,*) "epdrift",epdrift
2255 end subroutine predict_edrift
2256 !-----------------------------------------------------------------------------
2257 subroutine verlet_bath
2259 ! Coupling to the thermostat by using the Berendsen algorithm
2262 ! implicit real*8 (a-h,o-z)
2263 ! include 'DIMENSIONS'
2264 ! include 'COMMON.CONTROL'
2265 ! include 'COMMON.VAR'
2266 ! include 'COMMON.MD'
2267 ! include 'COMMON.CHAIN'
2268 ! include 'COMMON.DERIV'
2269 ! include 'COMMON.GEO'
2270 ! include 'COMMON.LOCAL'
2271 ! include 'COMMON.INTERACT'
2272 ! include 'COMMON.IOUNITS'
2273 ! include 'COMMON.NAMES'
2274 real(kind=8) :: T_half,fact
2275 integer :: i,j,inres,mnum
2277 T_half=2.0d0/(dimen3*Rb)*EK
2278 fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0))
2279 ! write(iout,*) "T_half", T_half
2280 ! write(iout,*) "EK", EK
2281 ! write(iout,*) "fact", fact
2283 d_t(j,0)=fact*d_t(j,0)
2287 d_t(j,i)=fact*d_t(j,i)
2292 ! iti=iabs(itype(i,mnum))
2293 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2294 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2295 .and.(mnum.ne.5)) then
2298 d_t(j,inres)=fact*d_t(j,inres)
2303 end subroutine verlet_bath
2304 !-----------------------------------------------------------------------------
2306 ! Set up the initial conditions of a MD simulation
2309 use control, only:tcpu
2310 !el use io_basic, only:ilen
2313 use minimm, only:minim_dc,minimize,sc_move
2314 use io_config, only:readrst
2315 use io, only:statout
2316 ! implicit real*8 (a-h,o-z)
2317 ! include 'DIMENSIONS'
2320 character(len=16) :: form
2321 integer :: IERROR,ERRCODE
2323 ! include 'COMMON.SETUP'
2324 ! include 'COMMON.CONTROL'
2325 ! include 'COMMON.VAR'
2326 ! include 'COMMON.MD'
2328 ! include 'COMMON.LANGEVIN'
2330 ! include 'COMMON.LANGEVIN.lang0'
2332 ! include 'COMMON.CHAIN'
2333 ! include 'COMMON.DERIV'
2334 ! include 'COMMON.GEO'
2335 ! include 'COMMON.LOCAL'
2336 ! include 'COMMON.INTERACT'
2337 ! include 'COMMON.IOUNITS'
2338 ! include 'COMMON.NAMES'
2339 ! include 'COMMON.REMD'
2340 real(kind=8),dimension(0:n_ene) :: energia_long,energia_short
2341 real(kind=8),dimension(3) :: vcm,incr,L
2342 real(kind=8) :: xv,sigv,lowb,highb
2343 real(kind=8),dimension(6*nres) :: varia !(maxvar) (maxvar=6*maxres)
2344 character(len=256) :: qstr
2347 character(len=50) :: tytul
2348 logical :: file_exist
2349 !el common /gucio/ cm
2350 integer :: i,j,ipos,iq,iw,nft_sc,iretcode,nfun,itime,ierr,mnum
2351 real(kind=8) :: etot,tt0
2355 ! write(iout,*) "d_time", d_time
2356 ! Compute the standard deviations of stochastic forces for Langevin dynamics
2357 ! if the friction coefficients do not depend on surface area
2358 if (lang.gt.0 .and. .not.surfarea) then
2361 stdforcp(i)=stdfp(mnum)*dsqrt(gamp(mnum))
2365 stdforcsc(i)=stdfsc(iabs(itype(i,mnum)),mnum) &
2366 *dsqrt(gamsc(iabs(itype(i,mnum)),mnum))
2369 ! Open the pdb file for snapshotshots
2372 if (ilen(tmpdir).gt.0) &
2373 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2374 liczba(:ilen(liczba))//".pdb")
2376 file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2380 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
2381 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2382 liczba(:ilen(liczba))//".x")
2383 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2386 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
2387 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2388 liczba(:ilen(liczba))//".cx")
2389 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2395 if (ilen(tmpdir).gt.0) &
2396 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb")
2397 open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb")
2399 if (ilen(tmpdir).gt.0) &
2400 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx")
2401 cartname=prefix(:ilen(prefix))//"_MD.cx"
2405 write (qstr,'(256(1h ))')
2408 iq = qinfrag(i,iset)*10
2409 iw = wfrag(i,iset)/100
2411 if(me.eq.king.or..not.out1file) &
2412 write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw
2413 write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw
2418 iq = qinpair(i,iset)*10
2419 iw = wpair(i,iset)/100
2421 if(me.eq.king.or..not.out1file) &
2422 write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw
2423 write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw
2427 ! pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb'
2429 ! cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x'
2431 ! cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx'
2433 ! statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat'
2437 if (restart1file) then
2439 inquire(file=mremd_rst_name,exist=file_exist)
2440 write (*,*) me," Before broadcast: file_exist",file_exist
2442 call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM,&
2445 write (*,*) me," After broadcast: file_exist",file_exist
2446 ! inquire(file=mremd_rst_name,exist=file_exist)
2447 if(me.eq.king.or..not.out1file) &
2448 write(iout,*) "Initial state read by master and distributed"
2450 if (ilen(tmpdir).gt.0) &
2451 call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_' &
2452 //liczba(:ilen(liczba))//'.rst')
2453 inquire(file=rest2name,exist=file_exist)
2456 if(.not.restart1file) then
2457 if(me.eq.king.or..not.out1file) &
2458 write(iout,*) "Initial state will be read from file ",&
2459 rest2name(:ilen(rest2name))
2462 call rescale_weights(t_bath)
2464 if(me.eq.king.or..not.out1file)then
2465 if (restart1file) then
2466 write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)),&
2469 write(iout,*) "File ",rest2name(:ilen(rest2name)),&
2472 write(iout,*) "Initial velocities randomly generated"
2479 ! Generate initial velocities
2480 if(me.eq.king.or..not.out1file) &
2481 write(iout,*) "Initial velocities randomly generated"
2486 ! rest2name = prefix(:ilen(prefix))//'.rst'
2487 if(me.eq.king.or..not.out1file)then
2488 write (iout,*) "Initial velocities"
2490 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
2491 (d_t(j,i+nres),j=1,3)
2493 ! Zeroing the total angular momentum of the system
2494 write(iout,*) "Calling the zero-angular momentum subroutine"
2497 ! Getting the potential energy and forces and velocities and accelerations
2499 ! write (iout,*) "velocity of the center of the mass:"
2500 ! write (iout,*) (vcm(j),j=1,3)
2502 d_t(j,0)=d_t(j,0)-vcm(j)
2504 ! Removing the velocity of the center of mass
2506 if(me.eq.king.or..not.out1file)then
2507 write (iout,*) "vcm right after adjustment:"
2508 write (iout,*) (vcm(j),j=1,3)
2512 if(iranconf.ne.0 .or.indpdb.gt.0.and..not.unres_pdb .or.preminim) then
2514 print *, 'Calling OVERLAP_SC'
2515 call overlap_sc(fail)
2516 print *,'after OVERLAP'
2519 print *,'call SC_MOVE'
2520 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
2521 print *,'SC_move',nft_sc,etot
2522 if(me.eq.king.or..not.out1file) &
2523 write(iout,*) 'SC_move',nft_sc,etot
2527 print *, 'Calling MINIM_DC'
2528 call minim_dc(etot,iretcode,nfun)
2530 call geom_to_var(nvar,varia)
2531 print *,'Calling MINIMIZE.'
2532 call minimize(etot,varia,iretcode,nfun)
2533 call var_to_geom(nvar,varia)
2535 if(me.eq.king.or..not.out1file) &
2536 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2539 call chainbuild_cart
2544 kinetic_T=2.0d0/(dimen3*Rb)*EK
2545 if(me.eq.king.or..not.out1file)then
2555 write(iout,*) "before ETOTAL"
2556 call etotal(potEcomp)
2557 if (large) call enerprint(potEcomp)
2560 t_etotal=t_etotal+MPI_Wtime()-tt0
2562 t_etotal=t_etotal+tcpu()-tt0
2569 if (amax*d_time .gt. dvmax) then
2570 d_time=d_time*dvmax/amax
2571 if(me.eq.king.or..not.out1file) write (iout,*) &
2572 "Time step reduced to",d_time,&
2573 " because of too large initial acceleration."
2575 if(me.eq.king.or..not.out1file)then
2576 write(iout,*) "Potential energy and its components"
2577 call enerprint(potEcomp)
2578 ! write(iout,*) (potEcomp(i),i=0,n_ene)
2580 potE=potEcomp(0)-potEcomp(20)
2583 if (ntwe.ne.0) call statout(itime)
2584 if(me.eq.king.or..not.out1file) &
2585 write (iout,'(/a/3(a25,1pe14.5/))') "Initial:", &
2586 " Kinetic energy",EK," Potential energy",potE, &
2587 " Total energy",totE," Maximum acceleration ", &
2590 write (iout,*) "Initial coordinates"
2592 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3),&
2595 write (iout,*) "Initial dC"
2597 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),&
2598 (dc(j,i+nres),j=1,3)
2600 write (iout,*) "Initial velocities"
2601 write (iout,"(13x,' backbone ',23x,' side chain')")
2603 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
2604 (d_t(j,i+nres),j=1,3)
2606 write (iout,*) "Initial accelerations"
2608 ! write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
2609 write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3),&
2610 (d_a(j,i+nres),j=1,3)
2616 d_t_old(j,i)=d_t(j,i)
2617 d_a_old(j,i)=d_a(j,i)
2619 ! write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3)
2628 call etotal_short(energia_short)
2629 if (large) call enerprint(potEcomp)
2632 t_eshort=t_eshort+MPI_Wtime()-tt0
2634 t_eshort=t_eshort+tcpu()-tt0
2639 if(.not.out1file .and. large) then
2640 write (iout,*) "energia_long",energia_long(0),&
2641 " energia_short",energia_short(0),&
2642 " total",energia_long(0)+energia_short(0)
2643 write (iout,*) "Initial fast-force accelerations"
2645 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
2646 (d_a(j,i+nres),j=1,3)
2649 ! 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
2652 d_a_short(j,i)=d_a(j,i)
2661 call etotal_long(energia_long)
2662 if (large) call enerprint(potEcomp)
2665 t_elong=t_elong+MPI_Wtime()-tt0
2667 t_elong=t_elong+tcpu()-tt0
2672 if(.not.out1file .and. large) then
2673 write (iout,*) "energia_long",energia_long(0)
2674 write (iout,*) "Initial slow-force accelerations"
2676 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
2677 (d_a(j,i+nres),j=1,3)
2681 t_enegrad=t_enegrad+MPI_Wtime()-tt0
2683 t_enegrad=t_enegrad+tcpu()-tt0
2687 end subroutine init_MD
2688 !-----------------------------------------------------------------------------
2689 subroutine random_vel
2691 ! implicit real*8 (a-h,o-z)
2693 use random, only:anorm_distr
2695 ! include 'DIMENSIONS'
2696 ! include 'COMMON.CONTROL'
2697 ! include 'COMMON.VAR'
2698 ! include 'COMMON.MD'
2700 ! include 'COMMON.LANGEVIN'
2702 ! include 'COMMON.LANGEVIN.lang0'
2704 ! include 'COMMON.CHAIN'
2705 ! include 'COMMON.DERIV'
2706 ! include 'COMMON.GEO'
2707 ! include 'COMMON.LOCAL'
2708 ! include 'COMMON.INTERACT'
2709 ! include 'COMMON.IOUNITS'
2710 ! include 'COMMON.NAMES'
2711 ! include 'COMMON.TIME1'
2712 real(kind=8) :: xv,sigv,lowb,highb ,Ek1
2715 real(kind=8) ,allocatable, dimension(:) :: DDU1,DDU2,DL2,DL1,xsolv,DML,rs
2716 real(kind=8) :: sumx
2718 real(kind=8) ,allocatable, dimension(:) :: rsold
2719 real (kind=8),allocatable,dimension(:,:) :: matold
2723 integer :: i,j,ii,k,ind,mark,imark,mnum
2724 ! Generate random velocities from Gaussian distribution of mean 0 and std of KT/m
2725 ! First generate velocities in the eigenspace of the G matrix
2726 ! write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3
2733 sigv=dsqrt((Rb*t_bath)/geigen(i))
2736 d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb)
2738 write (iout,*) "i",i," ii",ii," geigen",geigen(i),&
2739 " d_t_work_new",d_t_work_new(ii)
2750 Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2
2753 write (iout,*) "Ek from eigenvectors",Ek1
2754 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
2758 ! Transform velocities to UNRES coordinate space
2759 allocate (DL1(2*nres))
2760 allocate (DDU1(2*nres))
2761 allocate (DL2(2*nres))
2762 allocate (DDU2(2*nres))
2763 allocate (xsolv(2*nres))
2764 allocate (DML(2*nres))
2765 allocate (rs(2*nres))
2767 allocate (rsold(2*nres))
2768 allocate (matold(2*nres,2*nres))
2770 matold(1,1)=DMorig(1)
2771 matold(1,2)=DU1orig(1)
2772 matold(1,3)=DU2orig(1)
2773 write (*,*) DMorig(1),DU1orig(1),DU2orig(1)
2778 matold(i,j)=DMorig(i)
2779 matold(i,j-1)=DU1orig(i-1)
2781 matold(i,j-2)=DU2orig(i-2)
2789 matold(i,j+1)=DU1orig(i)
2795 matold(i,j+2)=DU2orig(i)
2799 matold(dimen,dimen)=DMorig(dimen)
2800 matold(dimen,dimen-1)=DU1orig(dimen-1)
2801 matold(dimen,dimen-2)=DU2orig(dimen-2)
2802 write(iout,*) "old gmatrix"
2803 call matout(dimen,dimen,2*nres,2*nres,matold)
2807 ! Find the ith eigenvector of the pentadiagonal inertiq matrix
2811 DML(j)=DMorig(j)-geigen(i)
2814 DML(j-1)=DMorig(j)-geigen(i)
2819 DDU1(imark-1)=DU2orig(imark-1)
2820 do j=imark+1,dimen-1
2821 DDU1(j-1)=DU1orig(j)
2829 DDU2(j)=DU2orig(j+1)
2838 write (iout,*) "DL2,DL1,DML,DDU1,DDU2"
2839 write(iout,'(10f10.5)') (DL2(k),k=3,dimen-1)
2840 write(iout,'(10f10.5)') (DL1(k),k=2,dimen-1)
2841 write(iout,'(10f10.5)') (DML(k),k=1,dimen-1)
2842 write(iout,'(10f10.5)') (DDU1(k),k=1,dimen-2)
2843 write(iout,'(10f10.5)') (DDU2(k),k=1,dimen-3)
2846 if (imark.gt.2) rs(imark-2)=-DU2orig(imark-2)
2847 if (imark.gt.1) rs(imark-1)=-DU1orig(imark-1)
2848 if (imark.lt.dimen) rs(imark)=-DU1orig(imark)
2849 if (imark.lt.dimen-1) rs(imark+1)=-DU2orig(imark)
2853 ! write (iout,*) "Vector rs"
2855 ! write (iout,*) j,rs(j)
2858 call FDIAG(dimen-1,DL2,DL1,DML,DDU1,DDU2,rs,xsolv,mark)
2865 sumx=-geigen(i)*xsolv(j)
2867 sumx=sumx+matold(j,k)*xsolv(k)
2870 sumx=sumx+matold(j,k)*xsolv(k-1)
2872 write(iout,'(i5,3f10.5)') j,sumx,rsold(j),sumx-rsold(j)
2875 sumx=-geigen(i)*xsolv(j-1)
2877 sumx=sumx+matold(j,k)*xsolv(k)
2880 sumx=sumx+matold(j,k)*xsolv(k-1)
2882 write(iout,'(i5,3f10.5)') j-1,sumx,rsold(j-1),sumx-rsold(j-1)
2886 "Solution of equations system",i," for eigenvalue",geigen(i)
2888 write(iout,'(i5,f10.5)') j,xsolv(j)
2891 do j=dimen-1,imark,-1
2896 write (iout,*) "Un-normalized eigenvector",i," for eigenvalue",geigen(i)
2898 write(iout,'(i5,f10.5)') j,xsolv(j)
2901 ! Normalize ith eigenvector
2904 sumx=sumx+xsolv(j)**2
2908 xsolv(j)=xsolv(j)/sumx
2911 write (iout,*) "Eigenvector",i," for eigenvalue",geigen(i)
2913 write(iout,'(i5,3f10.5)') j,xsolv(j)
2916 ! All done at this point for eigenvector i, exit loop
2924 write (iout,*) "Unable to find eigenvector",i
2927 ! write (iout,*) "i=",i
2929 ! write (iout,*) "k=",k
2932 ! write(iout,*) "ind",ind," ind1",3*(i-1)+k
2933 d_t_work(ind)=d_t_work(ind) &
2934 +xsolv(j)*d_t_work_new(3*(i-1)+k)
2937 enddo ! i (loop over the eigenvectors)
2940 write (iout,*) "d_t_work"
2942 write (iout,"(i5,f10.5)") i,d_t_work(i)
2947 ! if (itype(i,1).eq.10) then
2949 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
2950 iti=iabs(itype(i,mnum))
2951 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2952 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
2953 .or.(mnum.eq.5)) then
2960 ! write (iout,*) "k",k," ii+k",ii+k," ii+j+k",ii+j+k,"EK1",Ek1
2961 Ek1=Ek1+0.5d0*mp(mnum)*((d_t_work(ii+j+k)+d_t_work_new(ii+k))/2)**2+&
2962 0.5d0*0.25d0*IP(mnum)*(d_t_work(ii+j+k)-d_t_work_new(ii+k))**2
2965 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2966 .and.(mnum.ne.5)) ii=ii+3
2967 write (iout,*) "i",i," itype",itype(i,mnum)," mass",msc(itype(i,mnum),mnum)
2968 write (iout,*) "ii",ii
2971 write (iout,*) "k",k," ii",ii,"EK1",EK1
2972 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2974 Ek1=Ek1+0.5d0*Isc(iabs(itype(i,mnum)),mnum)*(d_t_work(ii)-d_t_work(ii-3))**2
2975 Ek1=Ek1+0.5d0*msc(iabs(itype(i,mnum)),mnum)*d_t_work(ii)**2
2977 write (iout,*) "i",i," ii",ii
2979 write (iout,*) "Ek from d_t_work",Ek1
2980 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
2982 if(allocated(DDU1)) deallocate(DDU1)
2983 if(allocated(DDU2)) deallocate(DDU2)
2984 if(allocated(DL2)) deallocate(DL2)
2985 if(allocated(DL1)) deallocate(DL1)
2986 if(allocated(xsolv)) deallocate(xsolv)
2987 if(allocated(DML)) deallocate(DML)
2988 if(allocated(rs)) deallocate(rs)
2990 if(allocated(matold)) deallocate(matold)
2991 if(allocated(rsold)) deallocate(rsold)
2996 d_t(k,j)=d_t_work(ind)
3000 if (itype(j,1).ne.10 .and. itype(j,mnum).ne.ntyp1_molec(mnum)&
3001 .and.(mnum.ne.5)) then
3003 d_t(k,j+nres)=d_t_work(ind)
3009 write (iout,*) "Random velocities in the Calpha,SC space"
3011 write (iout,'(i3,3f10.5)') i,(d_t(j,i),j=1,3)
3014 write (iout,'(i3,3f10.5)') i,(d_t(j,i+nres),j=1,3)
3021 ! if (itype(i,1).eq.10) then
3023 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
3024 .or.(mnum.eq.5)) then
3026 d_t(j,i)=d_t(j,i+1)-d_t(j,i)
3030 d_t(j,i+nres)=d_t(j,i+nres)-d_t(j,i)
3031 d_t(j,i)=d_t(j,i+1)-d_t(j,i)
3036 write (iout,*)"Random velocities in the virtual-bond-vector space"
3038 write (iout,'(i3,3f10.5)') i,(d_t(j,i),j=1,3)
3041 write (iout,'(i3,3f10.5)') i,(d_t(j,i+nres),j=1,3)
3044 write (iout,*) "Ek from d_t_work",Ek1
3045 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
3053 d_t_work(ind)=d_t_work(ind) &
3054 +Gvec(i,j)*d_t_work_new((j-1)*3+k+1)
3056 ! write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind)
3060 ! Transfer to the d_t vector
3062 d_t(j,0)=d_t_work(j)
3068 d_t(j,i)=d_t_work(ind)
3073 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3074 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3075 .and.(mnum.ne.5)) then
3078 d_t(j,i+nres)=d_t_work(ind)
3084 ! write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",&
3085 ! 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
3087 ! write(iout,*) "end init MD"
3089 end subroutine random_vel
3090 !-----------------------------------------------------------------------------
3092 subroutine sd_verlet_p_setup
3093 ! Sets up the parameters of stochastic Verlet algorithm
3094 ! implicit real*8 (a-h,o-z)
3095 ! include 'DIMENSIONS'
3096 use control, only: tcpu
3101 ! include 'COMMON.CONTROL'
3102 ! include 'COMMON.VAR'
3103 ! include 'COMMON.MD'
3105 ! include 'COMMON.LANGEVIN'
3107 ! include 'COMMON.LANGEVIN.lang0'
3109 ! include 'COMMON.CHAIN'
3110 ! include 'COMMON.DERIV'
3111 ! include 'COMMON.GEO'
3112 ! include 'COMMON.LOCAL'
3113 ! include 'COMMON.INTERACT'
3114 ! include 'COMMON.IOUNITS'
3115 ! include 'COMMON.NAMES'
3116 ! include 'COMMON.TIME1'
3117 real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
3118 real(kind=8) :: pterm,vterm,rho,rhoc,vsig
3119 real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
3120 prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
3121 logical :: lprn = .false.
3122 real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
3123 real(kind=8) :: ktm,gdt,egdt,gdt2,gdt3,gdt4,gdt5,gdt6,gdt7,gdt8,&
3125 integer :: i,maxres2
3132 ! AL 8/17/04 Code adapted from tinker
3134 ! Get the frictional and random terms for stochastic dynamics in the
3135 ! eigenspace of mass-scaled UNRES friction matrix
3139 gdt = fricgam(i) * d_time
3141 ! Stochastic dynamics reduces to simple MD for zero friction
3143 if (gdt .le. zero) then
3144 pfric_vec(i) = 1.0d0
3145 vfric_vec(i) = d_time
3146 afric_vec(i) = 0.5d0 * d_time * d_time
3147 prand_vec(i) = 0.0d0
3148 vrand_vec1(i) = 0.0d0
3149 vrand_vec2(i) = 0.0d0
3151 ! Analytical expressions when friction coefficient is large
3154 if (gdt .ge. gdt_radius) then
3157 vfric_vec(i) = (1.0d0-egdt) / fricgam(i)
3158 afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i)
3159 pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt
3160 vterm = 1.0d0 - egdt**2
3161 rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm)
3163 ! Use series expansions when friction coefficient is small
3174 afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0 &
3175 - gdt5/120.0d0 + gdt6/720.0d0 &
3176 - gdt7/5040.0d0 + gdt8/40320.0d0 &
3177 - gdt9/362880.0d0) / fricgam(i)**2
3178 vfric_vec(i) = d_time - fricgam(i)*afric_vec(i)
3179 pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i)
3180 pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0 &
3181 + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0 &
3182 + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0 &
3183 + 127.0d0*gdt9/90720.0d0
3184 vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0 &
3185 - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0 &
3186 - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0 &
3187 - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0
3188 rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0 &
3189 - 17.0d0*gdt2/1280.0d0 &
3190 + 17.0d0*gdt3/6144.0d0 &
3191 + 40967.0d0*gdt4/34406400.0d0 &
3192 - 57203.0d0*gdt5/275251200.0d0 &
3193 - 1429487.0d0*gdt6/13212057600.0d0)
3196 ! Compute the scaling factors of random terms for the nonzero friction case
3198 ktm = 0.5d0*d_time/fricgam(i)
3199 psig = dsqrt(ktm*pterm) / fricgam(i)
3200 vsig = dsqrt(ktm*vterm)
3201 rhoc = dsqrt(1.0d0 - rho*rho)
3203 vrand_vec1(i) = vsig * rho
3204 vrand_vec2(i) = vsig * rhoc
3209 "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
3212 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
3213 afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
3217 ! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
3220 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
3221 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
3222 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
3223 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
3224 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1)
3225 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
3228 t_sdsetup=t_sdsetup+MPI_Wtime()
3230 t_sdsetup=t_sdsetup+tcpu()-tt0
3233 end subroutine sd_verlet_p_setup
3234 !-----------------------------------------------------------------------------
3235 subroutine eigtransf1(n,ndim,ab,d,c)
3239 real(kind=8) :: ab(ndim,ndim,n),c(ndim,n),d(ndim)
3245 c(i,j)=c(i,j)+ab(k,j,i)*d(k)
3250 end subroutine eigtransf1
3251 !-----------------------------------------------------------------------------
3252 subroutine eigtransf(n,ndim,a,b,d,c)
3256 real(kind=8) :: a(ndim,n),b(ndim,n),c(ndim,n),d(ndim)
3262 c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k)
3267 end subroutine eigtransf
3268 !-----------------------------------------------------------------------------
3269 subroutine sd_verlet1
3271 ! Applying stochastic velocity Verlet algorithm - step 1 to velocities
3273 ! implicit real*8 (a-h,o-z)
3274 ! include 'DIMENSIONS'
3275 ! include 'COMMON.CONTROL'
3276 ! include 'COMMON.VAR'
3277 ! include 'COMMON.MD'
3279 ! include 'COMMON.LANGEVIN'
3281 ! include 'COMMON.LANGEVIN.lang0'
3283 ! include 'COMMON.CHAIN'
3284 ! include 'COMMON.DERIV'
3285 ! include 'COMMON.GEO'
3286 ! include 'COMMON.LOCAL'
3287 ! include 'COMMON.INTERACT'
3288 ! include 'COMMON.IOUNITS'
3289 ! include 'COMMON.NAMES'
3290 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
3291 !el common /stochcalc/ stochforcvec
3292 logical :: lprn = .false.
3293 real(kind=8) :: ddt1,ddt2
3294 integer :: i,j,ind,inres
3296 ! write (iout,*) "dc_old"
3298 ! write (iout,'(i5,3f10.5,5x,3f10.5)')
3299 ! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
3302 dc_work(j)=dc_old(j,0)
3303 d_t_work(j)=d_t_old(j,0)
3304 d_a_work(j)=d_a_old(j,0)
3309 dc_work(ind+j)=dc_old(j,i)
3310 d_t_work(ind+j)=d_t_old(j,i)
3311 d_a_work(ind+j)=d_a_old(j,i)
3317 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3318 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3319 .and.(mnum.ne.5)) then
3321 dc_work(ind+j)=dc_old(j,i+nres)
3322 d_t_work(ind+j)=d_t_old(j,i+nres)
3323 d_a_work(ind+j)=d_a_old(j,i+nres)
3331 "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
3335 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
3336 vfric_mat(i,j),afric_mat(i,j),&
3337 prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
3345 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
3346 +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
3347 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
3348 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
3350 d_t_work_new(i)=ddt1+0.5d0*ddt2
3351 d_t_work(i)=ddt1+ddt2
3356 d_t(j,0)=d_t_work(j)
3361 dc(j,i)=dc_work(ind+j)
3362 d_t(j,i)=d_t_work(ind+j)
3368 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3369 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3370 .and.(mnum.ne.5)) then
3373 dc(j,inres)=dc_work(ind+j)
3374 d_t(j,inres)=d_t_work(ind+j)
3380 end subroutine sd_verlet1
3381 !-----------------------------------------------------------------------------
3382 subroutine sd_verlet2
3384 ! Calculating the adjusted velocities for accelerations
3386 ! implicit real*8 (a-h,o-z)
3387 ! include 'DIMENSIONS'
3388 ! include 'COMMON.CONTROL'
3389 ! include 'COMMON.VAR'
3390 ! include 'COMMON.MD'
3392 ! include 'COMMON.LANGEVIN'
3394 ! include 'COMMON.LANGEVIN.lang0'
3396 ! include 'COMMON.CHAIN'
3397 ! include 'COMMON.DERIV'
3398 ! include 'COMMON.GEO'
3399 ! include 'COMMON.LOCAL'
3400 ! include 'COMMON.INTERACT'
3401 ! include 'COMMON.IOUNITS'
3402 ! include 'COMMON.NAMES'
3403 !el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
3404 real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
3405 !el common /stochcalc/ stochforcvec
3407 real(kind=8) :: ddt1,ddt2
3408 integer :: i,j,ind,inres
3409 ! Compute the stochastic forces which contribute to velocity change
3411 call stochastic_force(stochforcvecV)
3418 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
3419 ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+ &
3420 vrand_mat2(i,j)*stochforcvecV(j)
3422 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
3426 d_t(j,0)=d_t_work(j)
3431 d_t(j,i)=d_t_work(ind+j)
3437 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3438 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3439 .and.(mnum.ne.5)) then
3442 d_t(j,inres)=d_t_work(ind+j)
3448 end subroutine sd_verlet2
3449 !-----------------------------------------------------------------------------
3450 subroutine sd_verlet_ciccotti_setup
3452 ! Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's
3454 ! implicit real*8 (a-h,o-z)
3455 ! include 'DIMENSIONS'
3456 use control, only: tcpu
3461 ! include 'COMMON.CONTROL'
3462 ! include 'COMMON.VAR'
3463 ! include 'COMMON.MD'
3465 ! include 'COMMON.LANGEVIN'
3467 ! include 'COMMON.LANGEVIN.lang0'
3469 ! include 'COMMON.CHAIN'
3470 ! include 'COMMON.DERIV'
3471 ! include 'COMMON.GEO'
3472 ! include 'COMMON.LOCAL'
3473 ! include 'COMMON.INTERACT'
3474 ! include 'COMMON.IOUNITS'
3475 ! include 'COMMON.NAMES'
3476 ! include 'COMMON.TIME1'
3477 real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
3478 real(kind=8) :: pterm,vterm,rho,rhoc,vsig
3479 real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
3480 prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
3481 logical :: lprn = .false.
3482 real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
3483 real(kind=8) :: ktm,gdt,egdt,tt0
3484 integer :: i,maxres2
3491 ! AL 8/17/04 Code adapted from tinker
3493 ! Get the frictional and random terms for stochastic dynamics in the
3494 ! eigenspace of mass-scaled UNRES friction matrix
3498 write (iout,*) "i",i," fricgam",fricgam(i)
3499 gdt = fricgam(i) * d_time
3501 ! Stochastic dynamics reduces to simple MD for zero friction
3503 if (gdt .le. zero) then
3504 pfric_vec(i) = 1.0d0
3505 vfric_vec(i) = d_time
3506 afric_vec(i) = 0.5d0*d_time*d_time
3507 prand_vec(i) = afric_vec(i)
3508 vrand_vec2(i) = vfric_vec(i)
3510 ! Analytical expressions when friction coefficient is large
3515 vfric_vec(i) = dexp(-0.5d0*gdt)*d_time
3516 afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time
3517 prand_vec(i) = afric_vec(i)
3518 vrand_vec2(i) = vfric_vec(i)
3520 ! Compute the scaling factors of random terms for the nonzero friction case
3522 ! ktm = 0.5d0*d_time/fricgam(i)
3523 ! psig = dsqrt(ktm*pterm) / fricgam(i)
3524 ! vsig = dsqrt(ktm*vterm)
3525 ! prand_vec(i) = psig*afric_vec(i)
3526 ! vrand_vec2(i) = vsig*vfric_vec(i)
3531 "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
3534 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
3535 afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
3539 ! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
3541 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
3542 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
3543 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
3544 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
3545 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
3547 t_sdsetup=t_sdsetup+MPI_Wtime()
3549 t_sdsetup=t_sdsetup+tcpu()-tt0
3552 end subroutine sd_verlet_ciccotti_setup
3553 !-----------------------------------------------------------------------------
3554 subroutine sd_verlet1_ciccotti
3556 ! Applying stochastic velocity Verlet algorithm - step 1 to velocities
3557 ! implicit real*8 (a-h,o-z)
3559 ! include 'DIMENSIONS'
3563 ! include 'COMMON.CONTROL'
3564 ! include 'COMMON.VAR'
3565 ! include 'COMMON.MD'
3567 ! include 'COMMON.LANGEVIN'
3569 ! include 'COMMON.LANGEVIN.lang0'
3571 ! include 'COMMON.CHAIN'
3572 ! include 'COMMON.DERIV'
3573 ! include 'COMMON.GEO'
3574 ! include 'COMMON.LOCAL'
3575 ! include 'COMMON.INTERACT'
3576 ! include 'COMMON.IOUNITS'
3577 ! include 'COMMON.NAMES'
3578 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
3579 !el common /stochcalc/ stochforcvec
3580 logical :: lprn = .false.
3581 real(kind=8) :: ddt1,ddt2
3582 integer :: i,j,ind,inres
3583 ! write (iout,*) "dc_old"
3585 ! write (iout,'(i5,3f10.5,5x,3f10.5)')
3586 ! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
3589 dc_work(j)=dc_old(j,0)
3590 d_t_work(j)=d_t_old(j,0)
3591 d_a_work(j)=d_a_old(j,0)
3596 dc_work(ind+j)=dc_old(j,i)
3597 d_t_work(ind+j)=d_t_old(j,i)
3598 d_a_work(ind+j)=d_a_old(j,i)
3603 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3605 dc_work(ind+j)=dc_old(j,i+nres)
3606 d_t_work(ind+j)=d_t_old(j,i+nres)
3607 d_a_work(ind+j)=d_a_old(j,i+nres)
3616 "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
3620 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
3621 vfric_mat(i,j),afric_mat(i,j),&
3622 prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
3630 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
3631 +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
3632 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
3633 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
3635 d_t_work_new(i)=ddt1+0.5d0*ddt2
3636 d_t_work(i)=ddt1+ddt2
3641 d_t(j,0)=d_t_work(j)
3646 dc(j,i)=dc_work(ind+j)
3647 d_t(j,i)=d_t_work(ind+j)
3653 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3654 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3655 .and.(mnum.ne.5)) then
3658 dc(j,inres)=dc_work(ind+j)
3659 d_t(j,inres)=d_t_work(ind+j)
3665 end subroutine sd_verlet1_ciccotti
3666 !-----------------------------------------------------------------------------
3667 subroutine sd_verlet2_ciccotti
3669 ! Calculating the adjusted velocities for accelerations
3671 ! implicit real*8 (a-h,o-z)
3672 ! include 'DIMENSIONS'
3673 ! include 'COMMON.CONTROL'
3674 ! include 'COMMON.VAR'
3675 ! include 'COMMON.MD'
3677 ! include 'COMMON.LANGEVIN'
3679 ! include 'COMMON.LANGEVIN.lang0'
3681 ! include 'COMMON.CHAIN'
3682 ! include 'COMMON.DERIV'
3683 ! include 'COMMON.GEO'
3684 ! include 'COMMON.LOCAL'
3685 ! include 'COMMON.INTERACT'
3686 ! include 'COMMON.IOUNITS'
3687 ! include 'COMMON.NAMES'
3688 !el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
3689 real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
3690 !el common /stochcalc/ stochforcvec
3691 real(kind=8) :: ddt1,ddt2
3692 integer :: i,j,ind,inres
3694 ! Compute the stochastic forces which contribute to velocity change
3696 call stochastic_force(stochforcvecV)
3703 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
3704 ! ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j)
3705 ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j)
3707 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
3711 d_t(j,0)=d_t_work(j)
3716 d_t(j,i)=d_t_work(ind+j)
3722 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3724 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3727 d_t(j,inres)=d_t_work(ind+j)
3733 end subroutine sd_verlet2_ciccotti
3735 !-----------------------------------------------------------------------------
3737 !-----------------------------------------------------------------------------
3738 subroutine inertia_tensor
3740 ! Calculating the intertia tensor for the entire protein in order to
3741 ! remove the perpendicular components of velocity matrix which cause
3742 ! the molecule to rotate.
3745 ! implicit real*8 (a-h,o-z)
3746 ! include 'DIMENSIONS'
3747 ! include 'COMMON.CONTROL'
3748 ! include 'COMMON.VAR'
3749 ! include 'COMMON.MD'
3750 ! include 'COMMON.CHAIN'
3751 ! include 'COMMON.DERIV'
3752 ! include 'COMMON.GEO'
3753 ! include 'COMMON.LOCAL'
3754 ! include 'COMMON.INTERACT'
3755 ! include 'COMMON.IOUNITS'
3756 ! include 'COMMON.NAMES'
3758 real(kind=8),dimension(3,3) :: Im,Imcp,eigvec,Id
3759 real(kind=8),dimension(3) :: pr,eigval,L,vp,vrot
3760 real(kind=8) :: M_SC,mag,mag2,M_PEP
3761 real(kind=8),dimension(3,0:nres) :: vpp !(3,0:MAXRES)
3762 real(kind=8),dimension(3) :: vs_p,pp,incr,v
3763 real(kind=8),dimension(3,3) :: pr1,pr2
3765 !el common /gucio/ cm
3766 integer :: iti,inres,i,j,k,mnum
3777 ! calculating the center of the mass of the protein
3781 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
3782 if (itype(i,mnum).eq.ntyp1_molec(mnum)) cycle
3783 M_PEP=M_PEP+mp(mnum)
3785 cm(j)=cm(j)+(c(j,i)+0.5d0*dc(j,i))*mp(mnum)
3794 if (mnum.eq.5) cycle
3795 iti=iabs(itype(i,mnum))
3796 M_SC=M_SC+msc(iabs(iti),mnum)
3799 cm(j)=cm(j)+msc(iabs(iti),mnum)*c(j,inres)
3803 cm(j)=cm(j)/(M_SC+M_PEP)
3808 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
3810 pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
3812 Im(1,1)=Im(1,1)+mp(mnum)*(pr(2)*pr(2)+pr(3)*pr(3))
3813 Im(1,2)=Im(1,2)-mp(mnum)*pr(1)*pr(2)
3814 Im(1,3)=Im(1,3)-mp(mnum)*pr(1)*pr(3)
3815 Im(2,3)=Im(2,3)-mp(mnum)*pr(2)*pr(3)
3816 Im(2,2)=Im(2,2)+mp(mnum)*(pr(3)*pr(3)+pr(1)*pr(1))
3817 Im(3,3)=Im(3,3)+mp(mnum)*(pr(1)*pr(1)+pr(2)*pr(2))
3822 iti=iabs(itype(i,mnum))
3823 if (mnum.eq.5) cycle
3826 pr(j)=c(j,inres)-cm(j)
3828 Im(1,1)=Im(1,1)+msc(iabs(iti),mnum)*(pr(2)*pr(2)+pr(3)*pr(3))
3829 Im(1,2)=Im(1,2)-msc(iabs(iti),mnum)*pr(1)*pr(2)
3830 Im(1,3)=Im(1,3)-msc(iabs(iti),mnum)*pr(1)*pr(3)
3831 Im(2,3)=Im(2,3)-msc(iabs(iti),mnum)*pr(2)*pr(3)
3832 Im(2,2)=Im(2,2)+msc(iabs(iti),mnum)*(pr(3)*pr(3)+pr(1)*pr(1))
3833 Im(3,3)=Im(3,3)+msc(iabs(iti),mnum)*(pr(1)*pr(1)+pr(2)*pr(2))
3838 Im(1,1)=Im(1,1)+Ip(mnum)*(1-dc_norm(1,i)*dc_norm(1,i))* &
3839 vbld(i+1)*vbld(i+1)*0.25d0
3840 Im(1,2)=Im(1,2)+Ip(mnum)*(-dc_norm(1,i)*dc_norm(2,i))* &
3841 vbld(i+1)*vbld(i+1)*0.25d0
3842 Im(1,3)=Im(1,3)+Ip(mnum)*(-dc_norm(1,i)*dc_norm(3,i))* &
3843 vbld(i+1)*vbld(i+1)*0.25d0
3844 Im(2,3)=Im(2,3)+Ip(mnum)*(-dc_norm(2,i)*dc_norm(3,i))* &
3845 vbld(i+1)*vbld(i+1)*0.25d0
3846 Im(2,2)=Im(2,2)+Ip(mnum)*(1-dc_norm(2,i)*dc_norm(2,i))* &
3847 vbld(i+1)*vbld(i+1)*0.25d0
3848 Im(3,3)=Im(3,3)+Ip(mnum)*(1-dc_norm(3,i)*dc_norm(3,i))* &
3849 vbld(i+1)*vbld(i+1)*0.25d0
3855 ! if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)) then
3856 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3857 .and.(mnum.ne.5)) then
3858 iti=iabs(itype(i,mnum))
3860 Im(1,1)=Im(1,1)+Isc(iti,mnum)*(1-dc_norm(1,inres)* &
3861 dc_norm(1,inres))*vbld(inres)*vbld(inres)
3862 Im(1,2)=Im(1,2)-Isc(iti,mnum)*(dc_norm(1,inres)* &
3863 dc_norm(2,inres))*vbld(inres)*vbld(inres)
3864 Im(1,3)=Im(1,3)-Isc(iti,mnum)*(dc_norm(1,inres)* &
3865 dc_norm(3,inres))*vbld(inres)*vbld(inres)
3866 Im(2,3)=Im(2,3)-Isc(iti,mnum)*(dc_norm(2,inres)* &
3867 dc_norm(3,inres))*vbld(inres)*vbld(inres)
3868 Im(2,2)=Im(2,2)+Isc(iti,mnum)*(1-dc_norm(2,inres)* &
3869 dc_norm(2,inres))*vbld(inres)*vbld(inres)
3870 Im(3,3)=Im(3,3)+Isc(iti,mnum)*(1-dc_norm(3,inres)* &
3871 dc_norm(3,inres))*vbld(inres)*vbld(inres)
3876 ! write(iout,*) "The angular momentum before adjustment:"
3877 ! write(iout,*) (L(j),j=1,3)
3883 ! Copying the Im matrix for the djacob subroutine
3891 ! Finding the eigenvectors and eignvalues of the inertia tensor
3892 call djacob(3,3,10000,1.0d-10,Imcp,eigvec,eigval)
3893 ! write (iout,*) "Eigenvalues & Eigenvectors"
3894 ! write (iout,'(5x,3f10.5)') (eigval(i),i=1,3)
3897 ! write (iout,'(i5,3f10.5)') i,(eigvec(i,j),j=1,3)
3899 ! Constructing the diagonalized matrix
3901 if (dabs(eigval(i)).gt.1.0d-15) then
3902 Id(i,i)=1.0d0/eigval(i)
3909 Imcp(i,j)=eigvec(j,i)
3915 pr1(i,j)=pr1(i,j)+Id(i,k)*Imcp(k,j)
3922 pr2(i,j)=pr2(i,j)+eigvec(i,k)*pr1(k,j)
3926 ! Calculating the total rotational velocity of the molecule
3929 vrot(i)=vrot(i)+pr2(i,j)*L(j)
3932 ! Resetting the velocities
3934 call vecpr(vrot(1),dc(1,i),vp)
3936 d_t(j,i)=d_t(j,i)-vp(j)
3941 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3942 .and.(mnum.ne.5)) then
3943 ! if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)) then
3944 ! if(itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3946 call vecpr(vrot(1),dc(1,inres),vp)
3948 d_t(j,inres)=d_t(j,inres)-vp(j)
3953 ! write(iout,*) "The angular momentum after adjustment:"
3954 ! write(iout,*) (L(j),j=1,3)
3957 end subroutine inertia_tensor
3958 !-----------------------------------------------------------------------------
3959 subroutine angmom(cm,L)
3962 ! implicit real*8 (a-h,o-z)
3963 ! include 'DIMENSIONS'
3964 ! include 'COMMON.CONTROL'
3965 ! include 'COMMON.VAR'
3966 ! include 'COMMON.MD'
3967 ! include 'COMMON.CHAIN'
3968 ! include 'COMMON.DERIV'
3969 ! include 'COMMON.GEO'
3970 ! include 'COMMON.LOCAL'
3971 ! include 'COMMON.INTERACT'
3972 ! include 'COMMON.IOUNITS'
3973 ! include 'COMMON.NAMES'
3974 real(kind=8) :: mscab
3975 real(kind=8),dimension(3) :: L,cm,pr,vp,vrot,incr,v,pp
3976 integer :: iti,inres,i,j,mnum
3977 ! Calculate the angular momentum
3986 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
3988 pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
3991 v(j)=incr(j)+0.5d0*d_t(j,i)
3994 incr(j)=incr(j)+d_t(j,i)
3996 call vecpr(pr(1),v(1),vp)
3998 L(j)=L(j)+mp(mnum)*vp(j)
4002 pp(j)=0.5d0*d_t(j,i)
4004 call vecpr(pr(1),pp(1),vp)
4006 L(j)=L(j)+Ip(mnum)*vp(j)
4014 iti=iabs(itype(i,mnum))
4022 pr(j)=c(j,inres)-cm(j)
4024 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4025 .and.(mnum.ne.5)) then
4027 v(j)=incr(j)+d_t(j,inres)
4034 call vecpr(pr(1),v(1),vp)
4035 ! write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3),&
4036 ! " v",(v(j),j=1,3)," vp",(vp(j),j=1,3)
4038 L(j)=L(j)+mscab*vp(j)
4040 ! write (iout,*) "L",(l(j),j=1,3)
4041 if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4042 .and.(mnum.ne.5)) then
4044 v(j)=incr(j)+d_t(j,inres)
4046 call vecpr(dc(1,inres),d_t(1,inres),vp)
4048 L(j)=L(j)+Isc(iti,mnum)*vp(j)
4052 incr(j)=incr(j)+d_t(j,i)
4056 end subroutine angmom
4057 !-----------------------------------------------------------------------------
4058 subroutine vcm_vel(vcm)
4061 ! implicit real*8 (a-h,o-z)
4062 ! include 'DIMENSIONS'
4063 ! include 'COMMON.VAR'
4064 ! include 'COMMON.MD'
4065 ! include 'COMMON.CHAIN'
4066 ! include 'COMMON.DERIV'
4067 ! include 'COMMON.GEO'
4068 ! include 'COMMON.LOCAL'
4069 ! include 'COMMON.INTERACT'
4070 ! include 'COMMON.IOUNITS'
4071 real(kind=8),dimension(3) :: vcm,vv
4072 real(kind=8) :: summas,amas
4082 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4084 summas=summas+mp(mnum)
4086 vcm(j)=vcm(j)+mp(mnum)*(vv(j)+0.5d0*d_t(j,i))
4090 amas=msc(iabs(itype(i,mnum)),mnum)
4095 if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4096 .and.(mnum.ne.5)) then
4098 vcm(j)=vcm(j)+amas*(vv(j)+d_t(j,i+nres))
4102 vcm(j)=vcm(j)+amas*vv(j)
4106 vv(j)=vv(j)+d_t(j,i)
4109 ! write (iout,*) "vcm",(vcm(j),j=1,3)," summas",summas
4111 vcm(j)=vcm(j)/summas
4114 end subroutine vcm_vel
4115 !-----------------------------------------------------------------------------
4117 !-----------------------------------------------------------------------------
4119 ! RATTLE algorithm for velocity Verlet - step 1, UNRES
4123 ! implicit real*8 (a-h,o-z)
4124 ! include 'DIMENSIONS'
4126 ! include 'COMMON.CONTROL'
4127 ! include 'COMMON.VAR'
4128 ! include 'COMMON.MD'
4130 ! include 'COMMON.LANGEVIN'
4132 ! include 'COMMON.LANGEVIN.lang0'
4134 ! include 'COMMON.CHAIN'
4135 ! include 'COMMON.DERIV'
4136 ! include 'COMMON.GEO'
4137 ! include 'COMMON.LOCAL'
4138 ! include 'COMMON.INTERACT'
4139 ! include 'COMMON.IOUNITS'
4140 ! include 'COMMON.NAMES'
4141 ! include 'COMMON.TIME1'
4142 !el real(kind=8) :: gginv(2*nres,2*nres),&
4143 !el gdc(3,2*nres,2*nres)
4144 real(kind=8) :: dC_uncor(3,2*nres) !,&
4145 !el real(kind=8) :: Cmat(2*nres,2*nres)
4146 real(kind=8) :: x(2*nres),xcorr(3,2*nres) !maxres2=2*maxres
4147 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4148 !el common /przechowalnia/ nbond
4149 integer :: max_rattle = 5
4150 logical :: lprn = .false., lprn1 = .false., not_done
4151 real(kind=8) :: tol_rattle = 1.0d-5
4153 integer :: ii,i,j,jj,l,ind,ind1,nres2
4156 !el /common/ przechowalnia
4158 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4159 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4160 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4162 if (lprn) write (iout,*) "RATTLE1"
4166 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4167 .and.(mnum.ne.5)) nbond=nbond+1
4169 ! Make a folded form of the Ginv-matrix
4182 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4187 if (itype(k,1).ne.10 .and. itype(k,mnum).ne.ntyp1_molec(mnum)&
4188 .and.(mnum.ne.5)) then
4192 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4200 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4211 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4215 if (itype(k,1).ne.10) then
4219 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4227 write (iout,*) "Matrix GGinv"
4228 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
4234 if (iter.gt.max_rattle) then
4235 write (iout,*) "Error - too many iterations in RATTLE."
4238 ! Calculate the matrix C = GG**(-1) dC_old o dC
4243 dC_uncor(j,ind1)=dC(j,i)
4247 if (itype(i,1).ne.10) then
4250 dC_uncor(j,ind1)=dC(j,i+nres)
4259 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
4263 if (itype(k,1).ne.10) then
4266 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
4271 ! Calculate deviations from standard virtual-bond lengths
4275 x(ind)=vbld(i+1)**2-vbl**2
4278 if (itype(i,1).ne.10) then
4280 x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4284 write (iout,*) "Coordinates and violations"
4286 write(iout,'(i5,3f10.5,5x,e15.5)') &
4287 i,(dC_uncor(j,i),j=1,3),x(i)
4289 write (iout,*) "Velocities and violations"
4293 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4294 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
4298 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4299 .and.(mnum.ne.5)) then
4302 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4303 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
4304 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
4307 ! write (iout,*) "gdc"
4309 ! write (iout,*) "i",i
4311 ! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
4317 if (dabs(x(i)).gt.xmax) then
4321 if (xmax.lt.tol_rattle) then
4325 ! Calculate the matrix of the system of equations
4330 Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
4335 write (iout,*) "Matrix Cmat"
4336 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
4338 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
4339 ! Add constraint term to positions
4346 xx = xx+x(ii)*gdc(j,ind,ii)
4350 d_t_new(j,i)=d_t_new(j,i)-xx/d_time
4354 if (itype(i,1).ne.10) then
4359 xx = xx+x(ii)*gdc(j,ind,ii)
4362 dC(j,i+nres)=dC(j,i+nres)-xx
4363 d_t_new(j,i+nres)=d_t_new(j,i+nres)-xx/d_time
4367 ! Rebuild the chain using the new coordinates
4368 call chainbuild_cart
4370 write (iout,*) "New coordinates, Lagrange multipliers,",&
4371 " and differences between actual and standard bond lengths"
4375 xx=vbld(i+1)**2-vbl**2
4376 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4377 i,(dC(j,i),j=1,3),x(ind),xx
4381 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4384 xx=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4385 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4386 i,(dC(j,i+nres),j=1,3),x(ind),xx
4389 write (iout,*) "Velocities and violations"
4393 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4394 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
4397 if (itype(i,1).ne.10) then
4399 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4400 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
4401 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
4408 10 write (iout,*) "Error - singularity in solving the system",&
4409 " of equations for Lagrange multipliers."
4413 "RATTLE inactive; use -DRATTLE switch at compile time."
4416 end subroutine rattle1
4417 !-----------------------------------------------------------------------------
4419 ! RATTLE algorithm for velocity Verlet - step 2, UNRES
4423 ! implicit real*8 (a-h,o-z)
4424 ! include 'DIMENSIONS'
4426 ! include 'COMMON.CONTROL'
4427 ! include 'COMMON.VAR'
4428 ! include 'COMMON.MD'
4430 ! include 'COMMON.LANGEVIN'
4432 ! include 'COMMON.LANGEVIN.lang0'
4434 ! include 'COMMON.CHAIN'
4435 ! include 'COMMON.DERIV'
4436 ! include 'COMMON.GEO'
4437 ! include 'COMMON.LOCAL'
4438 ! include 'COMMON.INTERACT'
4439 ! include 'COMMON.IOUNITS'
4440 ! include 'COMMON.NAMES'
4441 ! include 'COMMON.TIME1'
4442 !el real(kind=8) :: gginv(2*nres,2*nres),&
4443 !el gdc(3,2*nres,2*nres)
4444 real(kind=8) :: dC_uncor(3,2*nres) !,&
4445 !el Cmat(2*nres,2*nres)
4446 real(kind=8) :: x(2*nres) !maxres2=2*maxres
4447 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4448 !el common /przechowalnia/ nbond
4449 integer :: max_rattle = 5
4450 logical :: lprn = .false., lprn1 = .false., not_done
4451 real(kind=8) :: tol_rattle = 1.0d-5
4455 !el /common/ przechowalnia
4456 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4457 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4458 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4460 if (lprn) write (iout,*) "RATTLE2"
4461 if (lprn) write (iout,*) "Velocity correction"
4462 ! Calculate the matrix G dC
4468 gdc(j,i,ind)=GGinv(i,ind)*dC(j,k)
4473 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4474 .and.(mnum.ne.5)) then
4477 gdc(j,i,ind)=GGinv(i,ind)*dC(j,k+nres)
4483 ! write (iout,*) "gdc"
4485 ! write (iout,*) "i",i
4487 ! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
4491 ! Calculate the matrix of the system of equations
4498 Cmat(ind,j)=Cmat(ind,j)+dC(k,i)*gdc(k,ind,j)
4504 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4505 .and.(mnum.ne.5)) then
4510 Cmat(ind,j)=Cmat(ind,j)+dC(k,i+nres)*gdc(k,ind,j)
4515 ! Calculate the scalar product dC o d_t_new
4519 x(ind)=scalar(d_t(1,i),dC(1,i))
4523 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4524 .and.(mnum.ne.5)) then
4526 x(ind)=scalar(d_t(1,i+nres),dC(1,i+nres))
4530 write (iout,*) "Velocities and violations"
4534 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4535 i,ind,(d_t(j,i),j=1,3),x(ind)
4539 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4540 .and.(mnum.ne.5)) then
4542 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4543 i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind)
4549 if (dabs(x(i)).gt.xmax) then
4553 if (xmax.lt.tol_rattle) then
4558 write (iout,*) "Matrix Cmat"
4559 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
4561 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
4562 ! Add constraint term to velocities
4569 xx = xx+x(ii)*gdc(j,ind,ii)
4571 d_t(j,i)=d_t(j,i)-xx
4576 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4577 .and.(mnum.ne.5)) then
4582 xx = xx+x(ii)*gdc(j,ind,ii)
4584 d_t(j,i+nres)=d_t(j,i+nres)-xx
4590 "New velocities, Lagrange multipliers violations"
4594 if (lprn) write (iout,'(2i5,3f10.5,5x,2e15.5)') &
4595 i,ind,(d_t(j,i),j=1,3),x(ind),scalar(d_t(1,i),dC(1,i))
4599 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4602 write (iout,'(2i5,3f10.5,5x,2e15.5)') &
4603 i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind),&
4604 scalar(d_t(1,i+nres),dC(1,i+nres))
4610 10 write (iout,*) "Error - singularity in solving the system",&
4611 " of equations for Lagrange multipliers."
4615 "RATTLE inactive; use -DRATTLE option at compile time."
4618 end subroutine rattle2
4619 !-----------------------------------------------------------------------------
4620 subroutine rattle_brown
4621 ! RATTLE/LINCS algorithm for Brownian dynamics, UNRES
4625 ! implicit real*8 (a-h,o-z)
4626 ! include 'DIMENSIONS'
4628 ! include 'COMMON.CONTROL'
4629 ! include 'COMMON.VAR'
4630 ! include 'COMMON.MD'
4632 ! include 'COMMON.LANGEVIN'
4634 ! include 'COMMON.LANGEVIN.lang0'
4636 ! include 'COMMON.CHAIN'
4637 ! include 'COMMON.DERIV'
4638 ! include 'COMMON.GEO'
4639 ! include 'COMMON.LOCAL'
4640 ! include 'COMMON.INTERACT'
4641 ! include 'COMMON.IOUNITS'
4642 ! include 'COMMON.NAMES'
4643 ! include 'COMMON.TIME1'
4644 !el real(kind=8) :: gginv(2*nres,2*nres),&
4645 !el gdc(3,2*nres,2*nres)
4646 real(kind=8) :: dC_uncor(3,2*nres) !,&
4647 !el real(kind=8) :: Cmat(2*nres,2*nres)
4648 real(kind=8) :: x(2*nres) !maxres2=2*maxres
4649 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4650 !el common /przechowalnia/ nbond
4651 integer :: max_rattle = 5
4652 logical :: lprn = .false., lprn1 = .false., not_done
4653 real(kind=8) :: tol_rattle = 1.0d-5
4657 !el /common/ przechowalnia
4658 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4659 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4660 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4663 if (lprn) write (iout,*) "RATTLE_BROWN"
4666 if (itype(i,1).ne.10) nbond=nbond+1
4668 ! Make a folded form of the Ginv-matrix
4681 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4685 if (itype(k,1).ne.10) then
4689 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4696 if (itype(i,1).ne.10) then
4706 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4710 if (itype(k,1).ne.10) then
4714 if (j.eq.1 .and. l.eq.1)GGinv(ii,jj)=fricmat(ind,ind1)
4722 write (iout,*) "Matrix GGinv"
4723 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
4729 if (iter.gt.max_rattle) then
4730 write (iout,*) "Error - too many iterations in RATTLE."
4733 ! Calculate the matrix C = GG**(-1) dC_old o dC
4738 dC_uncor(j,ind1)=dC(j,i)
4742 if (itype(i,1).ne.10) then
4745 dC_uncor(j,ind1)=dC(j,i+nres)
4754 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
4758 if (itype(k,1).ne.10) then
4761 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
4766 ! Calculate deviations from standard virtual-bond lengths
4770 x(ind)=vbld(i+1)**2-vbl**2
4773 if (itype(i,1).ne.10) then
4775 x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4779 write (iout,*) "Coordinates and violations"
4781 write(iout,'(i5,3f10.5,5x,e15.5)') &
4782 i,(dC_uncor(j,i),j=1,3),x(i)
4784 write (iout,*) "Velocities and violations"
4788 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4789 i,ind,(d_t(j,i),j=1,3),scalar(d_t(1,i),dC_old(1,i))
4792 if (itype(i,1).ne.10) then
4794 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4795 i+nres,ind,(d_t(j,i+nres),j=1,3),&
4796 scalar(d_t(1,i+nres),dC_old(1,i+nres))
4799 write (iout,*) "gdc"
4801 write (iout,*) "i",i
4803 write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
4809 if (dabs(x(i)).gt.xmax) then
4813 if (xmax.lt.tol_rattle) then
4817 ! Calculate the matrix of the system of equations
4822 Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
4827 write (iout,*) "Matrix Cmat"
4828 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
4830 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
4831 ! Add constraint term to positions
4838 xx = xx+x(ii)*gdc(j,ind,ii)
4841 d_t(j,i)=d_t(j,i)+xx/d_time
4846 if (itype(i,1).ne.10) then
4851 xx = xx+x(ii)*gdc(j,ind,ii)
4854 d_t(j,i+nres)=d_t(j,i+nres)+xx/d_time
4855 dC(j,i+nres)=dC(j,i+nres)+xx
4859 ! Rebuild the chain using the new coordinates
4860 call chainbuild_cart
4862 write (iout,*) "New coordinates, Lagrange multipliers,",&
4863 " and differences between actual and standard bond lengths"
4867 xx=vbld(i+1)**2-vbl**2
4868 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4869 i,(dC(j,i),j=1,3),x(ind),xx
4872 if (itype(i,1).ne.10) then
4874 xx=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4875 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4876 i,(dC(j,i+nres),j=1,3),x(ind),xx
4879 write (iout,*) "Velocities and violations"
4883 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4884 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
4887 if (itype(i,1).ne.10) then
4889 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4890 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
4891 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
4898 10 write (iout,*) "Error - singularity in solving the system",&
4899 " of equations for Lagrange multipliers."
4903 "RATTLE inactive; use -DRATTLE option at compile time"
4906 end subroutine rattle_brown
4907 !-----------------------------------------------------------------------------
4909 !-----------------------------------------------------------------------------
4910 subroutine friction_force
4915 ! implicit real*8 (a-h,o-z)
4916 ! include 'DIMENSIONS'
4917 ! include 'COMMON.VAR'
4918 ! include 'COMMON.CHAIN'
4919 ! include 'COMMON.DERIV'
4920 ! include 'COMMON.GEO'
4921 ! include 'COMMON.LOCAL'
4922 ! include 'COMMON.INTERACT'
4923 ! include 'COMMON.MD'
4925 ! include 'COMMON.LANGEVIN'
4927 ! include 'COMMON.LANGEVIN.lang0'
4929 ! include 'COMMON.IOUNITS'
4930 !el real(kind=8),dimension(6*nres) :: gamvec !(MAXRES6) maxres6=6*maxres
4931 !el common /syfek/ gamvec
4932 real(kind=8) :: vv(3),vvtot(3,nres),v_work(6*nres) !,&
4933 !el ginvfric(2*nres,2*nres) !maxres2=2*maxres
4934 !el common /przechowalnia/ ginvfric
4936 logical :: lprn = .false., checkmode = .false.
4937 integer :: i,j,ind,k,nres2,nres6,mnum
4941 if(.not.allocated(gamvec)) allocate(gamvec(nres6)) !(MAXRES6)
4942 if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
4950 d_t_work(j)=d_t(j,0)
4955 d_t_work(ind+j)=d_t(j,i)
4961 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
4962 .and.(mnum.ne.5)) then
4964 d_t_work(ind+j)=d_t(j,i+nres)
4970 call fricmat_mult(d_t_work,fric_work)
4972 if (.not.checkmode) return
4975 write (iout,*) "d_t_work and fric_work"
4977 write (iout,'(i3,2e15.5)') i,d_t_work(i),fric_work(i)
4981 friction(j,0)=fric_work(j)
4986 friction(j,i)=fric_work(ind+j)
4992 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
4993 .and.(mnum.ne.5)) then
4994 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
4996 friction(j,i+nres)=fric_work(ind+j)
5002 write(iout,*) "Friction backbone"
5004 write(iout,'(i5,3e15.5,5x,3e15.5)') &
5005 i,(friction(j,i),j=1,3),(d_t(j,i),j=1,3)
5007 write(iout,*) "Friction side chain"
5009 write(iout,'(i5,3e15.5,5x,3e15.5)') &
5010 i,(friction(j,i+nres),j=1,3),(d_t(j,i+nres),j=1,3)
5019 vvtot(j,i)=vv(j)+0.5d0*d_t(j,i)
5020 vvtot(j,i+nres)=vv(j)+d_t(j,i+nres)
5021 vv(j)=vv(j)+d_t(j,i)
5024 write (iout,*) "vvtot backbone and sidechain"
5026 write (iout,'(i5,3e15.5,5x,3e15.5)') i,(vvtot(j,i),j=1,3),&
5027 (vvtot(j,i+nres),j=1,3)
5032 v_work(ind+j)=vvtot(j,i)
5038 v_work(ind+j)=vvtot(j,i+nres)
5042 write (iout,*) "v_work gamvec and site-based friction forces"
5044 write (iout,'(i5,3e15.5)') i,v_work(i),gamvec(i),&
5048 ! fric_work1(i)=0.0d0
5050 ! fric_work1(i)=fric_work1(i)-A(j,i)*gamvec(j)*v_work(j)
5053 ! write (iout,*) "fric_work and fric_work1"
5055 ! write (iout,'(i5,2e15.5)') i,fric_work(i),fric_work1(i)
5061 ginvfric(i,j)=ginvfric(i,j)+ginv(i,k)*fricmat(k,j)
5065 write (iout,*) "ginvfric"
5067 write (iout,'(i5,100f8.3)') i,(ginvfric(i,j),j=1,dimen)
5069 write (iout,*) "symmetry check"
5072 write (iout,*) i,j,ginvfric(i,j)-ginvfric(j,i)
5077 end subroutine friction_force
5078 !-----------------------------------------------------------------------------
5079 subroutine setup_fricmat
5083 use control_data, only:time_Bcast
5084 use control, only:tcpu
5086 ! implicit real*8 (a-h,o-z)
5090 real(kind=8) :: time00
5092 ! include 'DIMENSIONS'
5093 ! include 'COMMON.VAR'
5094 ! include 'COMMON.CHAIN'
5095 ! include 'COMMON.DERIV'
5096 ! include 'COMMON.GEO'
5097 ! include 'COMMON.LOCAL'
5098 ! include 'COMMON.INTERACT'
5099 ! include 'COMMON.MD'
5100 ! include 'COMMON.SETUP'
5101 ! include 'COMMON.TIME1'
5102 ! integer licznik /0/
5105 ! include 'COMMON.LANGEVIN'
5107 ! include 'COMMON.LANGEVIN.lang0'
5109 ! include 'COMMON.IOUNITS'
5111 integer :: i,j,ind,ind1,m
5112 logical :: lprn = .false.
5113 real(kind=8) :: dtdi !el ,gamvec(2*nres)
5114 !el real(kind=8),dimension(2*nres,2*nres) :: ginvfric,fcopy
5115 ! real(kind=8),allocatable,dimension(:,:) :: fcopy
5116 !el real(kind=8),dimension(2*nres*(2*nres+1)/2) :: Ghalf !(mmaxres2) (mmaxres2=(maxres2*(maxres2+1)/2))
5117 !el common /syfek/ gamvec
5118 real(kind=8) :: work(8*2*nres)
5119 integer :: iwork(2*nres)
5120 !el common /przechowalnia/ ginvfric,Ghalf,fcopy
5121 integer :: ii,iti,k,l,nzero,nres2,nres6,ierr,mnum
5125 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
5126 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5127 if (fg_rank.ne.king) goto 10
5132 if(.not.allocated(gamvec)) allocate(gamvec(nres2)) !(MAXRES2)
5133 if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
5134 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5135 !el allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5136 if(.not.allocated(Ghalf)) allocate(Ghalf(nres2*(nres2+1)/2)) !maxres2=2*maxres
5138 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
5139 ! Zeroing out fricmat
5145 ! Load the friction coefficients corresponding to peptide groups
5150 gamvec(ind1)=gamp(mnum)
5152 ! Load the friction coefficients corresponding to side chains
5156 gamsc(ntyp1_molec(j),j)=1.0d0
5163 gamvec(ii)=gamsc(iabs(iti),mnum)
5165 if (surfarea) call sdarea(gamvec)
5167 ! write (iout,*) "Matrix A and vector gamma"
5169 ! write (iout,'(i2,$)') i
5171 ! write (iout,'(f4.1,$)') A(i,j)
5173 ! write (iout,'(f8.3)') gamvec(i)
5177 write (iout,*) "Vector gamvec"
5179 write (iout,'(i5,f10.5)') i, gamvec(i)
5183 ! The friction matrix
5188 dtdi=dtdi+A(j,k)*A(j,i)*gamvec(j)
5195 write (iout,'(//a)') "Matrix fricmat"
5196 call matout2(dimen,dimen,nres2,nres2,fricmat)
5198 if (lang.eq.2 .or. lang.eq.3) then
5199 ! Mass-scale the friction matrix if non-direct integration will be performed
5205 Ginvfric(i,j)=Ginvfric(i,j)+ &
5206 Gsqrm(i,k)*Gsqrm(l,j)*fricmat(k,l)
5211 ! Diagonalize the friction matrix
5216 Ghalf(ind)=Ginvfric(i,j)
5219 call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
5222 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
5223 " mass-scaled friction matrix"
5224 call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
5226 ! Precompute matrices for tinker stochastic integrator
5233 mt1(i,j)=mt1(i,j)+fricvec(k,i)*gsqrm(k,j)
5234 mt2(i,j)=mt2(i,j)+fricvec(k,i)*gsqrp(k,j)
5240 else if (lang.eq.4) then
5241 ! Diagonalize the friction matrix
5246 Ghalf(ind)=fricmat(i,j)
5249 call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
5252 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
5254 call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
5256 ! Determine the number of zero eigenvalues of the friction matrix
5257 nzero=max0(dimen-dimen1,0)
5258 ! do while (fricgam(nzero+1).le.1.0d-5 .and. nzero.lt.dimen)
5261 write (iout,*) "Number of zero eigenvalues:",nzero
5266 fricmat(i,j)=fricmat(i,j) &
5267 +fricvec(i,k)*fricvec(j,k)/fricgam(k)
5272 write (iout,'(//a)') "Generalized inverse of fricmat"
5273 call matout(dimen,dimen,nres6,nres6,fricmat)
5278 if (nfgtasks.gt.1) then
5279 if (fg_rank.eq.0) then
5280 ! The matching BROADCAST for fg processors is called in ERGASTULUM
5286 call MPI_Bcast(10,1,MPI_INTEGER,king,FG_COMM,IERROR)
5288 time_Bcast=time_Bcast+MPI_Wtime()-time00
5290 time_Bcast=time_Bcast+tcpu()-time00
5292 ! print *,"Processor",myrank,
5293 ! & " BROADCAST iorder in SETUP_FRICMAT"
5296 write (iout,*) "setup_fricmat licznik"!,licznik !sp
5302 ! Scatter the friction matrix
5303 call MPI_Scatterv(fricmat(1,1),nginv_counts(0),&
5304 nginv_start(0),MPI_DOUBLE_PRECISION,fcopy(1,1),&
5305 myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR)
5308 time_scatter=time_scatter+MPI_Wtime()-time00
5309 time_scatter_fmat=time_scatter_fmat+MPI_Wtime()-time00
5311 time_scatter=time_scatter+tcpu()-time00
5312 time_scatter_fmat=time_scatter_fmat+tcpu()-time00
5316 do j=1,2*my_ng_count
5317 fricmat(j,i)=fcopy(i,j)
5320 ! write (iout,*) "My chunk of fricmat"
5321 ! call MATOUT2(my_ng_count,dimen,maxres2,maxres2,fcopy)
5325 end subroutine setup_fricmat
5326 !-----------------------------------------------------------------------------
5327 subroutine stochastic_force(stochforcvec)
5330 use random, only:anorm_distr
5331 ! implicit real*8 (a-h,o-z)
5332 ! include 'DIMENSIONS'
5333 use control, only: tcpu
5338 ! include 'COMMON.VAR'
5339 ! include 'COMMON.CHAIN'
5340 ! include 'COMMON.DERIV'
5341 ! include 'COMMON.GEO'
5342 ! include 'COMMON.LOCAL'
5343 ! include 'COMMON.INTERACT'
5344 ! include 'COMMON.MD'
5345 ! include 'COMMON.TIME1'
5347 ! include 'COMMON.LANGEVIN'
5349 ! include 'COMMON.LANGEVIN.lang0'
5351 ! include 'COMMON.IOUNITS'
5353 real(kind=8) :: x,sig,lowb,highb
5354 real(kind=8) :: ff(3),force(3,0:2*nres),zeta2,lowb2
5355 real(kind=8) :: highb2,sig2,forcvec(6*nres),stochforcvec(6*nres)
5356 real(kind=8) :: time00
5357 logical :: lprn = .false.
5358 integer :: i,j,ind,mnum
5362 stochforc(j,i)=0.0d0
5372 ! Compute the stochastic forces acting on bodies. Store in force.
5378 force(j,i)=anorm_distr(x,sig,lowb,highb)
5386 force(j,i+nres)=anorm_distr(x,sig2,lowb2,highb2)
5390 time_fsample=time_fsample+MPI_Wtime()-time00
5392 time_fsample=time_fsample+tcpu()-time00
5394 ! Compute the stochastic forces acting on virtual-bond vectors.
5400 stochforc(j,i)=ff(j)+0.5d0*force(j,i)
5403 ff(j)=ff(j)+force(j,i)
5405 ! if (itype(i+1,1).ne.ntyp1) then
5407 if (itype(i+1,mnum).ne.ntyp1_molec(mnum)) then
5409 stochforc(j,i)=stochforc(j,i)+force(j,i+nres+1)
5410 ff(j)=ff(j)+force(j,i+nres+1)
5415 stochforc(j,0)=ff(j)+force(j,nnt+nres)
5419 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5420 .and.(mnum.ne.5)) then
5421 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5423 stochforc(j,i+nres)=force(j,i+nres)
5429 stochforcvec(j)=stochforc(j,0)
5434 stochforcvec(ind+j)=stochforc(j,i)
5440 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5441 .and.(mnum.ne.5)) then
5442 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5444 stochforcvec(ind+j)=stochforc(j,i+nres)
5450 write (iout,*) "stochforcvec"
5452 write(iout,'(i5,e15.5)') i,stochforcvec(i)
5454 write(iout,*) "Stochastic forces backbone"
5456 write(iout,'(i5,3e15.5)') i,(stochforc(j,i),j=1,3)
5458 write(iout,*) "Stochastic forces side chain"
5460 write(iout,'(i5,3e15.5)') &
5461 i,(stochforc(j,i+nres),j=1,3)
5469 write (iout,*) i,ind
5471 forcvec(ind+j)=force(j,i)
5476 write (iout,*) i,ind
5478 forcvec(j+ind)=force(j,i+nres)
5483 write (iout,*) "forcvec"
5487 write (iout,'(2i3,2f10.5)') i,j,force(j,i),&
5494 write (iout,'(2i3,2f10.5)') i,j,force(j,i+nres),&
5503 end subroutine stochastic_force
5504 !-----------------------------------------------------------------------------
5505 subroutine sdarea(gamvec)
5507 ! Scale the friction coefficients according to solvent accessible surface areas
5508 ! Code adapted from TINKER
5512 ! implicit real*8 (a-h,o-z)
5513 ! include 'DIMENSIONS'
5514 ! include 'COMMON.CONTROL'
5515 ! include 'COMMON.VAR'
5516 ! include 'COMMON.MD'
5518 ! include 'COMMON.LANGEVIN'
5520 ! include 'COMMON.LANGEVIN.lang0'
5522 ! include 'COMMON.CHAIN'
5523 ! include 'COMMON.DERIV'
5524 ! include 'COMMON.GEO'
5525 ! include 'COMMON.LOCAL'
5526 ! include 'COMMON.INTERACT'
5527 ! include 'COMMON.IOUNITS'
5528 ! include 'COMMON.NAMES'
5529 real(kind=8),dimension(2*nres) :: radius,gamvec !(maxres2)
5530 real(kind=8),parameter :: twosix = 1.122462048309372981d0
5531 logical :: lprn = .false.
5532 real(kind=8) :: probe,area,ratio
5533 integer :: i,j,ind,iti,mnum
5535 ! determine new friction coefficients every few SD steps
5537 ! set the atomic radii to estimates of sigma values
5539 ! print *,"Entered sdarea"
5545 ! Load peptide group radii
5548 radius(i)=pstok(mnum)
5550 ! Load side chain radii
5554 radius(i+nres)=restok(iti,mnum)
5557 ! write (iout,*) "i",i," radius",radius(i)
5560 radius(i) = radius(i) / twosix
5561 if (radius(i) .ne. 0.0d0) radius(i) = radius(i) + probe
5564 ! scale atomic friction coefficients by accessible area
5566 if (lprn) write (iout,*) &
5567 "Original gammas, surface areas, scaling factors, new gammas, ",&
5568 "std's of stochastic forces"
5571 if (radius(i).gt.0.0d0) then
5572 call surfatom (i,area,radius)
5573 ratio = dmax1(area/(4.0d0*pi*radius(i)**2),1.0d-1)
5574 if (lprn) write (iout,'(i5,3f10.5,$)') &
5575 i,gamvec(ind+1),area,ratio
5578 gamvec(ind) = ratio * gamvec(ind)
5581 stdforcp(i)=stdfp(mnum)*dsqrt(gamvec(ind))
5582 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcp(i)
5586 if (radius(i+nres).gt.0.0d0) then
5587 call surfatom (i+nres,area,radius)
5588 ratio = dmax1(area/(4.0d0*pi*radius(i+nres)**2),1.0d-1)
5589 if (lprn) write (iout,'(i5,3f10.5,$)') &
5590 i,gamvec(ind+1),area,ratio
5593 gamvec(ind) = ratio * gamvec(ind)
5596 stdforcsc(i)=stdfsc(itype(i,mnum),mnum)*dsqrt(gamvec(ind))
5597 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcsc(i)
5602 end subroutine sdarea
5603 !-----------------------------------------------------------------------------
5605 !-----------------------------------------------------------------------------
5608 ! ###################################################
5609 ! ## COPYRIGHT (C) 1996 by Jay William Ponder ##
5610 ! ## All Rights Reserved ##
5611 ! ###################################################
5613 ! ################################################################
5615 ! ## subroutine surfatom -- exposed surface area of an atom ##
5617 ! ################################################################
5620 ! "surfatom" performs an analytical computation of the surface
5621 ! area of a specified atom; a simplified version of "surface"
5623 ! literature references:
5625 ! T. J. Richmond, "Solvent Accessible Surface Area and
5626 ! Excluded Volume in Proteins", Journal of Molecular Biology,
5629 ! L. Wesson and D. Eisenberg, "Atomic Solvation Parameters
5630 ! Applied to Molecular Dynamics of Proteins in Solution",
5631 ! Protein Science, 1, 227-235 (1992)
5633 ! variables and parameters:
5635 ! ir number of atom for which area is desired
5636 ! area accessible surface area of the atom
5637 ! radius radii of each of the individual atoms
5640 subroutine surfatom(ir,area,radius)
5642 ! implicit real*8 (a-h,o-z)
5643 ! include 'DIMENSIONS'
5645 ! include 'COMMON.GEO'
5646 ! include 'COMMON.IOUNITS'
5648 integer :: nsup,nstart_sup
5649 ! double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm
5650 ! common /chain/ c(3,maxres2+2),dc(3,0:maxres2),dc_old(3,0:maxres2),
5651 ! & xloc(3,maxres),xrot(3,maxres),dc_norm(3,0:maxres2),
5652 ! & dc_work(MAXRES6),nres,nres0
5653 integer,parameter :: maxarc=300
5657 integer :: mi,ni,narc
5658 integer :: key(maxarc)
5659 integer :: intag(maxarc)
5660 integer :: intag1(maxarc)
5661 real(kind=8) :: area,arcsum
5662 real(kind=8) :: arclen,exang
5663 real(kind=8) :: delta,delta2
5664 real(kind=8) :: eps,rmove
5665 real(kind=8) :: xr,yr,zr
5666 real(kind=8) :: rr,rrsq
5667 real(kind=8) :: rplus,rminus
5668 real(kind=8) :: axx,axy,axz
5669 real(kind=8) :: ayx,ayy
5670 real(kind=8) :: azx,azy,azz
5671 real(kind=8) :: uxj,uyj,uzj
5672 real(kind=8) :: tx,ty,tz
5673 real(kind=8) :: txb,tyb,td
5674 real(kind=8) :: tr2,tr,txr,tyr
5675 real(kind=8) :: tk1,tk2
5676 real(kind=8) :: thec,the,t,tb
5677 real(kind=8) :: txk,tyk,tzk
5678 real(kind=8) :: t1,ti,tf,tt
5679 real(kind=8) :: txj,tyj,tzj
5680 real(kind=8) :: ccsq,cc,xysq
5681 real(kind=8) :: bsqk,bk,cosine
5682 real(kind=8) :: dsqj,gi,pix2
5683 real(kind=8) :: therk,dk,gk
5684 real(kind=8) :: risqk,rik
5685 real(kind=8) :: radius(2*nres) !(maxatm) (maxatm=maxres2)
5686 real(kind=8) :: ri(maxarc),risq(maxarc)
5687 real(kind=8) :: ux(maxarc),uy(maxarc),uz(maxarc)
5688 real(kind=8) :: xc(maxarc),yc(maxarc),zc(maxarc)
5689 real(kind=8) :: xc1(maxarc),yc1(maxarc),zc1(maxarc)
5690 real(kind=8) :: dsq(maxarc),bsq(maxarc)
5691 real(kind=8) :: dsq1(maxarc),bsq1(maxarc)
5692 real(kind=8) :: arci(maxarc),arcf(maxarc)
5693 real(kind=8) :: ex(maxarc),lt(maxarc),gr(maxarc)
5694 real(kind=8) :: b(maxarc),b1(maxarc),bg(maxarc)
5695 real(kind=8) :: kent(maxarc),kout(maxarc)
5696 real(kind=8) :: ther(maxarc)
5697 logical :: moved,top
5698 logical :: omit(maxarc)
5701 ! maxatm = 2*nres !maxres2 maxres2=2*maxres
5702 ! maxlight = 8*maxatm
5705 ! maxtors = 4*maxatm
5707 ! zero out the surface area for the sphere of interest
5710 ! write (2,*) "ir",ir," radius",radius(ir)
5711 if (radius(ir) .eq. 0.0d0) return
5713 ! set the overlap significance and connectivity shift
5717 delta2 = delta * delta
5722 ! store coordinates and radius of the sphere of interest
5730 ! initialize values of some counters and summations
5739 ! test each sphere to see if it overlaps the sphere of interest
5742 if (i.eq.ir .or. radius(i).eq.0.0d0) goto 30
5743 rplus = rr + radius(i)
5745 if (abs(tx) .ge. rplus) goto 30
5747 if (abs(ty) .ge. rplus) goto 30
5749 if (abs(tz) .ge. rplus) goto 30
5751 ! check for sphere overlap by testing distance against radii
5753 xysq = tx*tx + ty*ty
5754 if (xysq .lt. delta2) then
5761 if (rplus-cc .le. delta) goto 30
5762 rminus = rr - radius(i)
5764 ! check to see if sphere of interest is completely buried
5766 if (cc-abs(rminus) .le. delta) then
5767 if (rminus .le. 0.0d0) goto 170
5771 ! check for too many overlaps with sphere of interest
5773 if (io .ge. maxarc) then
5775 20 format (/,' SURFATOM -- Increase the Value of MAXARC')
5779 ! get overlap between current sphere and sphere of interest
5788 gr(io) = (ccsq+rplus*rminus) / (2.0d0*rr*b1(io))
5794 ! case where no other spheres overlap the sphere of interest
5797 area = 4.0d0 * pi * rrsq
5801 ! case where only one sphere overlaps the sphere of interest
5804 area = pix2 * (1.0d0 + gr(1))
5805 area = mod(area,4.0d0*pi) * rrsq
5809 ! case where many spheres intersect the sphere of interest;
5810 ! sort the intersecting spheres by their degree of overlap
5812 call sort2 (io,gr,key)
5815 intag(i) = intag1(k)
5824 ! get radius of each overlap circle on surface of the sphere
5829 risq(i) = rrsq - gi*gi
5830 ri(i) = sqrt(risq(i))
5831 ther(i) = 0.5d0*pi - asin(min(1.0d0,max(-1.0d0,gr(i))))
5834 ! find boundary of inaccessible area on sphere of interest
5837 if (.not. omit(k)) then
5844 ! check to see if J circle is intersecting K circle;
5845 ! get distance between circle centers and sum of radii
5848 if (omit(j)) goto 60
5849 cc = (txk*xc(j)+tyk*yc(j)+tzk*zc(j))/(bk*b(j))
5850 cc = acos(min(1.0d0,max(-1.0d0,cc)))
5851 td = therk + ther(j)
5853 ! check to see if circles enclose separate regions
5855 if (cc .ge. td) goto 60
5857 ! check for circle J completely inside circle K
5859 if (cc+ther(j) .lt. therk) goto 40
5861 ! check for circles that are essentially parallel
5863 if (cc .gt. delta) goto 50
5868 ! check to see if sphere of interest is completely buried
5871 if (pix2-cc .le. td) goto 170
5877 ! find T value of circle intersections
5880 if (omit(k)) goto 110
5895 ! rotation matrix elements
5907 if (.not. omit(j)) then
5912 ! rotate spheres so K vector colinear with z-axis
5914 uxj = txj*axx + tyj*axy - tzj*axz
5915 uyj = tyj*ayy - txj*ayx
5916 uzj = txj*azx + tyj*azy + tzj*azz
5917 cosine = min(1.0d0,max(-1.0d0,uzj/b(j)))
5918 if (acos(cosine) .lt. therk+ther(j)) then
5919 dsqj = uxj*uxj + uyj*uyj
5924 tr2 = risqk*dsqj - tb*tb
5930 ! get T values of intersection for K circle
5933 tb = min(1.0d0,max(-1.0d0,tb))
5935 if (tyb-txr .lt. 0.0d0) tk1 = pix2 - tk1
5937 tb = min(1.0d0,max(-1.0d0,tb))
5939 if (tyb+txr .lt. 0.0d0) tk2 = pix2 - tk2
5940 thec = (rrsq*uzj-gk*bg(j)) / (rik*ri(j)*b(j))
5941 if (abs(thec) .lt. 1.0d0) then
5943 else if (thec .ge. 1.0d0) then
5945 else if (thec .le. -1.0d0) then
5949 ! see if "tk1" is entry or exit point; check t=0 point;
5950 ! "ti" is exit point, "tf" is entry point
5952 cosine = min(1.0d0,max(-1.0d0, &
5953 (uzj*gk-uxj*rik)/(b(j)*rr)))
5954 if ((acos(cosine)-ther(j))*(tk2-tk1) .le. 0.0d0) then
5962 if (narc .ge. maxarc) then
5964 70 format (/,' SURFATOM -- Increase the Value',&
5968 if (tf .le. ti) then
5989 ! special case; K circle without intersections
5991 if (narc .le. 0) goto 90
5993 ! general case; sum up arclength and set connectivity code
5995 call sort2 (narc,arci,key)
6000 if (narc .gt. 1) then
6003 if (t .lt. arci(j)) then
6004 arcsum = arcsum + arci(j) - t
6005 exang = exang + ex(ni)
6007 if (jb .ge. maxarc) then
6009 80 format (/,' SURFATOM -- Increase the Value',&
6014 kent(jb) = maxarc*i + k
6016 kout(jb) = maxarc*k + i
6025 arcsum = arcsum + pix2 - t
6027 exang = exang + ex(ni)
6030 kent(jb) = maxarc*i + k
6032 kout(jb) = maxarc*k + i
6039 arclen = arclen + gr(k)*arcsum
6042 if (arclen .eq. 0.0d0) goto 170
6043 if (jb .eq. 0) goto 150
6045 ! find number of independent boundaries and check connectivity
6049 if (kout(k) .ne. 0) then
6056 if (m .eq. kent(ii)) then
6059 if (j .eq. jb) goto 150
6071 ! attempt to fix connectivity error by moving atom slightly
6075 140 format (/,' SURFATOM -- Connectivity Error at Atom',i6)
6084 ! compute the exposed surface area for the sphere of interest
6087 area = ib*pix2 + exang + arclen
6088 area = mod(area,4.0d0*pi) * rrsq
6090 ! attempt to fix negative area by moving atom slightly
6092 if (area .lt. 0.0d0) then
6095 160 format (/,' SURFATOM -- Negative Area at Atom',i6)
6106 end subroutine surfatom
6107 !----------------------------------------------------------------
6108 !----------------------------------------------------------------
6109 subroutine alloc_MD_arrays
6110 !EL Allocation of arrays used by MD module
6112 integer :: nres2,nres6
6115 !----------------------
6119 allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
6120 allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
6121 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
6122 allocate(fricvec(nres2,nres2))
6123 allocate(pfric_mat(nres2,nres2),vfric_mat(nres2,nres2))
6124 allocate(afric_mat(nres2,nres2),prand_mat(nres2,nres2))
6125 allocate(vrand_mat1(nres2,nres2),vrand_mat2(nres2,nres2)) !(MAXRES2,MAXRES2)
6126 allocate(pfric0_mat(nres2,nres2,0:maxflag_stoch))
6127 allocate(afric0_mat(nres2,nres2,0:maxflag_stoch))
6128 allocate(vfric0_mat(nres2,nres2,0:maxflag_stoch))
6129 allocate(prand0_mat(nres2,nres2,0:maxflag_stoch))
6130 allocate(vrand0_mat1(nres2,nres2,0:maxflag_stoch))
6131 allocate(vrand0_mat2(nres2,nres2,0:maxflag_stoch)) !(MAXRES2,MAXRES2,0:maxflag_stoch)
6132 allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
6134 allocate(mt1(nres2,nres2),mt2(nres2,nres2),mt3(nres2,nres2)) !(maxres2,maxres2)
6135 !----------------------
6137 ! commom.langevin.lang0
6139 allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
6140 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
6141 allocate(fricvec(nres2,nres2)) !(MAXRES2,MAXRES2)
6142 allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
6143 allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
6146 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2))
6147 !----------------------
6148 ! commom.hairpin in CSA module
6149 !----------------------
6150 ! common.mce in MCM_MD module
6151 !----------------------
6153 ! common /mdgrad/ in module.energy
6154 ! common /back_constr/ in module.energy
6155 ! common /qmeas/ in module.energy
6158 allocate(potEcomp(0:n_ene+4)) !(0:n_ene+4)
6160 allocate(d_t(3,0:nres2),d_a(3,0:nres2),d_t_old(3,0:nres2)) !(3,0:MAXRES2)
6161 allocate(d_a_work(nres6)) !(6*MAXRES)
6163 allocate(DM(nres2),DU1(nres2),DU2(nres2))
6164 allocate(DMorig(nres2),DU1orig(nres2),DU2orig(nres2))
6166 write (iout,*) "Before A Allocation",nfgtasks-1
6168 allocate(Gmat(nres2,nres2),A(nres2,nres2))
6169 if(.not.allocated(Ginv)) allocate(Ginv(nres2,nres2)) !in control: ergastulum
6170 allocate(Gsqrp(nres2,nres2),Gsqrm(nres2,nres2),Gvec(nres2,nres2)) !(maxres2,maxres2)
6172 allocate(Geigen(nres2)) !(maxres2)
6173 if(.not.allocated(vtot)) allocate(vtot(nres2)) !(maxres2)
6174 ! common /inertia/ in io_conf: parmread
6175 ! real(kind=8),dimension(:),allocatable :: ISC,msc !(ntyp+1)
6176 ! common /langevin/in io read_MDpar
6177 ! real(kind=8),dimension(:),allocatable :: gamsc !(ntyp1)
6178 ! real(kind=8),dimension(:),allocatable :: stdfsc !(ntyp)
6179 ! in io_conf: parmread
6180 ! real(kind=8),dimension(:),allocatable :: restok !(ntyp+1)
6181 ! common /mdpmpi/ in control: ergastulum
6182 if(.not.allocated(ng_start)) allocate(ng_start(0:nfgtasks-1))
6183 if(.not.allocated(ng_counts)) allocate(ng_counts(0:nfgtasks-1))
6184 if(.not.allocated(nginv_counts)) allocate(nginv_counts(0:nfgtasks-1)) !(0:MaxProcs-1)
6185 if(.not.allocated(nginv_start)) allocate(nginv_start(0:nfgtasks)) !(0:MaxProcs)
6186 !----------------------
6187 ! common.muca in read_muca
6188 ! common /double_muca/
6189 ! real(kind=8) :: elow,ehigh,factor,hbin,factor_min
6190 ! real(kind=8),dimension(:),allocatable :: emuca,nemuca,&
6191 ! nemuca2,hist !(4*maxres)
6192 ! common /integer_muca/
6193 ! integer :: nmuca,imtime,muca_smooth
6195 ! real(kind=8),dimension(:),allocatable :: elowi,ehighi !(maxprocs)
6196 !----------------------
6198 ! common /mdgrad/ in module.energy
6199 ! common /back_constr/ in module.energy
6200 ! common /qmeas/ in module.energy
6204 allocate(d_t_work(nres6),d_t_work_new(nres6),d_af_work(nres6))
6205 allocate(d_as_work(nres6),kinetic_force(nres6)) !(MAXRES6)
6206 allocate(d_t_new(3,0:nres2),d_a_old(3,0:nres2),d_a_short(3,0:nres2)) !,d_a !(3,0:MAXRES2)
6207 allocate(stdforcp(nres),stdforcsc(nres)) !(MAXRES)
6208 !----------------------
6210 allocate(D_ban(nres6)) !(MAXRES6) maxres6=6*maxres
6211 ! common /stochcalc/ stochforcvec
6212 allocate(stochforcvec(nres6)) !(MAXRES6) maxres6=6*maxres
6213 !----------------------
6215 end subroutine alloc_MD_arrays
6216 !-----------------------------------------------------------------------------
6217 !-----------------------------------------------------------------------------