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(51)
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
817 integer,dimension(4,nres) :: iharp !(4,nres/3)(4,maxres/3)
819 real(kind=8) :: tt0,scalfac
820 integer :: nres2,itime
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)
991 if (mod(itime,ntwe).eq.0) then
994 ! call check_ecartint
1004 v_work(ind)=d_t(j,i)
1009 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1.and.mnum.ne.5) then
1012 v_work(ind)=d_t(j,i+nres)
1017 write (66,'(80f10.5)') &
1018 ((d_t(j,i),j=1,3),i=0,nres-1),((d_t(j,i+nres),j=1,3),i=1,nres)
1022 v_transf(i)=v_transf(i)+gvec(j,i)*v_work(j)
1024 v_transf(i)= v_transf(i)*dsqrt(geigen(i))
1026 write (67,'(80f10.5)') (v_transf(i),i=1,ind)
1029 if (mod(itime,ntwx).eq.0) then
1031 write (tytul,'("time",f8.2)') totT
1033 call hairpin(.true.,nharp,iharp)
1034 call secondary2(.true.)
1035 call pdbout(potE,tytul,ipdb)
1040 if (rstcount.eq.1000.or.itime.eq.n_timestep) then
1041 open(irest2,file=rest2name,status='unknown')
1042 write(irest2,*) totT,EK,potE,totE,t_bath
1044 ! AL 4/17/17: Now writing d_t(0,:) too
1046 write (irest2,'(3e15.5)') (d_t(j,i),j=1,3)
1048 ! AL 4/17/17: Now writing d_c(0,:) too
1050 write (irest2,'(3e15.5)') (dc(j,i),j=1,3)
1058 t_MD=MPI_Wtime()-tt0
1062 write (iout,'(//35(1h=),a10,35(1h=)/10(/a40,1pe15.5))') &
1064 'MD calculations setup:',t_MDsetup,&
1065 'Energy & gradient evaluation:',t_enegrad,&
1066 'Stochastic MD setup:',t_langsetup,&
1067 'Stochastic MD step setup:',t_sdsetup,&
1069 write (iout,'(/28(1h=),a25,27(1h=))') &
1070 ' End of MD calculation '
1072 write (iout,*) "time for etotal",t_etotal," elong",t_elong,&
1074 write (iout,*) "time_fric",time_fric," time_stoch",time_stoch,&
1075 " time_fricmatmult",time_fricmatmult," time_fsample ",&
1080 !-----------------------------------------------------------------------------
1081 subroutine velverlet_step(itime)
1082 !-------------------------------------------------------------------------------
1083 ! Perform a single velocity Verlet step; the time step can be rescaled if
1084 ! increments in accelerations exceed the threshold
1085 !-------------------------------------------------------------------------------
1086 ! implicit real*8 (a-h,o-z)
1087 ! include 'DIMENSIONS'
1089 use control, only:tcpu
1091 use minimm, only:minim_dc
1094 integer :: ierror,ierrcode
1095 real(kind=8) :: errcode
1097 ! include 'COMMON.SETUP'
1098 ! include 'COMMON.VAR'
1099 ! include 'COMMON.MD'
1101 ! include 'COMMON.LANGEVIN'
1103 ! include 'COMMON.LANGEVIN.lang0'
1105 ! include 'COMMON.CHAIN'
1106 ! include 'COMMON.DERIV'
1107 ! include 'COMMON.GEO'
1108 ! include 'COMMON.LOCAL'
1109 ! include 'COMMON.INTERACT'
1110 ! include 'COMMON.IOUNITS'
1111 ! include 'COMMON.NAMES'
1112 ! include 'COMMON.TIME1'
1113 ! include 'COMMON.MUCA'
1114 real(kind=8),dimension(3) :: vcm,incr
1115 real(kind=8),dimension(3) :: L
1116 integer :: count,rstcount !ilen,
1118 character(len=50) :: tytul
1119 integer :: maxcount_scale = 30
1120 !el common /gucio/ cm
1121 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
1122 !el common /stochcalc/ stochforcvec
1123 integer :: icount_scale,itime_scal,i,j,ifac_time,iretcode,itime
1125 real(kind=8) :: epdrift,tt0,fac_time
1127 if (.not.allocated(stochforcvec)) allocate(stochforcvec(6*nres)) !(MAXRES6) maxres6=6*maxres
1133 else if (lang.eq.2 .or. lang.eq.3) then
1135 call stochastic_force(stochforcvec)
1138 "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
1140 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1147 icount_scale=icount_scale+1
1148 ! write(iout,*) "icount_scale",icount_scale,scalel
1149 if (icount_scale.gt.maxcount_scale) then
1151 "ERROR: too many attempts at scaling down the time step. ",&
1152 "amax=",amax,"epdrift=",epdrift,&
1153 "damax=",damax,"edriftmax=",edriftmax,&
1157 call MPI_Abort(MPI_COMM_WORLD,IERROR,IERRCODE)
1161 ! First step of the velocity Verlet algorithm
1166 else if (lang.eq.3) then
1168 call sd_verlet1_ciccotti
1170 else if (lang.eq.1) then
1175 ! Build the chain from the newly calculated coordinates
1176 call chainbuild_cart
1177 if (rattle) call rattle1
1179 if (large.and. mod(itime,ntwe).eq.0) then
1180 write (iout,*) "Cartesian and internal coordinates: step 1"
1185 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),&
1186 (dc(j,i+nres),j=1,3)
1188 write (iout,*) "Accelerations"
1190 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1191 (d_a(j,i+nres),j=1,3)
1193 write (iout,*) "Velocities, step 1"
1195 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1196 (d_t(j,i+nres),j=1,3)
1205 ! Calculate energy and forces
1207 call etotal(potEcomp)
1208 ! AL 4/17/17: Reduce the steps if NaNs occurred.
1209 if (potEcomp(0).gt.0.99e18 .or. isnan(potEcomp(0)).gt.0) then
1210 call enerprint(potEcomp)
1212 if (icount_scale.gt.15) then
1213 write (iout,*) "Tu jest problem",potEcomp(0),d_time
1214 ! call gen_rand_conf(1,*335)
1215 ! call minim_dc(potEcomp(0),iretcode,100)
1218 ! call etotal(potEcomp)
1219 ! write(iout,*) "needed to repara,",potEcomp
1222 ! 335 write(iout,*) "Failed genrand"
1226 if (large.and. mod(itime,ntwe).eq.0) &
1227 call enerprint(potEcomp)
1230 t_etotal=t_etotal+MPI_Wtime()-tt0
1232 t_etotal=t_etotal+tcpu()-tt0
1235 potE=potEcomp(0)-potEcomp(51)
1237 ! Get the new accelerations
1240 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1242 t_enegrad=t_enegrad+tcpu()-tt0
1244 ! Determine maximum acceleration and scale down the timestep if needed
1246 amax=amax/(itime_scal+1)**2
1247 call predict_edrift(epdrift)
1248 ! write(iout,*) "amax=",amax,damax,epdrift,edriftmax,amax/(itime_scal+1)
1250 ! write (iout,*) "before enter if",scalel,icount_scale
1251 if (amax/(itime_scal+1).gt.damax .or. epdrift.gt.edriftmax) then
1252 ! write(iout,*) "I enter if"
1253 ! Maximum acceleration or maximum predicted energy drift exceeded, rescale the time step
1255 ifac_time=dmax1(dlog(amax/damax),dlog(epdrift/edriftmax)) &
1257 itime_scal=itime_scal+ifac_time
1258 ! fac_time=dmin1(damax/amax,0.5d0)
1259 fac_time=0.5d0**ifac_time
1260 d_time=d_time*fac_time
1261 if (lang.eq.2 .or. lang.eq.3) then
1263 ! write (iout,*) "Calling sd_verlet_setup: 1"
1264 ! Rescale the stochastic forces and recalculate or restore
1265 ! the matrices of tinker integrator
1266 if (itime_scal.gt.maxflag_stoch) then
1267 if (large) write (iout,'(a,i5,a)') &
1268 "Calculate matrices for stochastic step;",&
1269 " itime_scal ",itime_scal
1271 call sd_verlet_p_setup
1273 call sd_verlet_ciccotti_setup
1275 write (iout,'(2a,i3,a,i3,1h.)') &
1276 "Warning: cannot store matrices for stochastic",&
1277 " integration because the index",itime_scal,&
1278 " is greater than",maxflag_stoch
1279 write (iout,'(2a)')"Increase MAXFLAG_STOCH or use direct",&
1280 " integration Langevin algorithm for better efficiency."
1281 else if (flag_stoch(itime_scal)) then
1282 if (large) write (iout,'(a,i5,a,l1)') &
1283 "Restore matrices for stochastic step; itime_scal ",&
1284 itime_scal," flag ",flag_stoch(itime_scal)
1287 pfric_mat(i,j)=pfric0_mat(i,j,itime_scal)
1288 afric_mat(i,j)=afric0_mat(i,j,itime_scal)
1289 vfric_mat(i,j)=vfric0_mat(i,j,itime_scal)
1290 prand_mat(i,j)=prand0_mat(i,j,itime_scal)
1291 vrand_mat1(i,j)=vrand0_mat1(i,j,itime_scal)
1292 vrand_mat2(i,j)=vrand0_mat2(i,j,itime_scal)
1296 if (large) write (iout,'(2a,i5,a,l1)') &
1297 "Calculate & store matrices for stochastic step;",&
1298 " itime_scal ",itime_scal," flag ",flag_stoch(itime_scal)
1300 call sd_verlet_p_setup
1302 call sd_verlet_ciccotti_setup
1304 flag_stoch(ifac_time)=.true.
1307 pfric0_mat(i,j,itime_scal)=pfric_mat(i,j)
1308 afric0_mat(i,j,itime_scal)=afric_mat(i,j)
1309 vfric0_mat(i,j,itime_scal)=vfric_mat(i,j)
1310 prand0_mat(i,j,itime_scal)=prand_mat(i,j)
1311 vrand0_mat1(i,j,itime_scal)=vrand_mat1(i,j)
1312 vrand0_mat2(i,j,itime_scal)=vrand_mat2(i,j)
1316 fac_time=1.0d0/dsqrt(fac_time)
1318 stochforcvec(i)=fac_time*stochforcvec(i)
1321 else if (lang.eq.1) then
1322 ! Rescale the accelerations due to stochastic forces
1323 fac_time=1.0d0/dsqrt(fac_time)
1325 d_as_work(i)=d_as_work(i)*fac_time
1328 if (large) write (iout,'(a,i10,a,f8.6,a,i3,a,i3)') &
1329 "itime",itime," Timestep scaled down to ",&
1330 d_time," ifac_time",ifac_time," itime_scal",itime_scal
1332 ! Second step of the velocity Verlet algorithm
1337 else if (lang.eq.3) then
1339 call sd_verlet2_ciccotti
1341 else if (lang.eq.1) then
1346 if (rattle) call rattle2
1349 if (d_time.ne.d_time0) then
1352 if (lang.eq.2 .or. lang.eq.3) then
1353 if (large) write (iout,'(a)') &
1354 "Restore original matrices for stochastic step"
1355 ! write (iout,*) "Calling sd_verlet_setup: 2"
1356 ! Restore the matrices of tinker integrator if the time step has been restored
1359 pfric_mat(i,j)=pfric0_mat(i,j,0)
1360 afric_mat(i,j)=afric0_mat(i,j,0)
1361 vfric_mat(i,j)=vfric0_mat(i,j,0)
1362 prand_mat(i,j)=prand0_mat(i,j,0)
1363 vrand_mat1(i,j)=vrand0_mat1(i,j,0)
1364 vrand_mat2(i,j)=vrand0_mat2(i,j,0)
1372 ! Calculate the kinetic and the total energy and the kinetic temperature
1376 ! call kinetic1(EK1)
1377 ! write (iout,*) "step",itime," EK",EK," EK1",EK1
1379 ! Couple the system to Berendsen bath if needed
1380 if (tbf .and. lang.eq.0) then
1383 kinetic_T=2.0d0/(dimen3*Rb)*EK
1384 ! Backup the coordinates, velocities, and accelerations
1388 d_t_old(j,i)=d_t(j,i)
1389 d_a_old(j,i)=d_a(j,i)
1393 if (mod(itime,ntwe).eq.0 .and. large) then
1394 write (iout,*) "Velocities, step 2"
1396 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1397 (d_t(j,i+nres),j=1,3)
1402 end subroutine velverlet_step
1403 !-----------------------------------------------------------------------------
1404 subroutine RESPA_step(itime)
1405 !-------------------------------------------------------------------------------
1406 ! Perform a single RESPA step.
1407 !-------------------------------------------------------------------------------
1408 ! implicit real*8 (a-h,o-z)
1409 ! include 'DIMENSIONS'
1413 use control, only:tcpu
1415 ! use io_conf, only:cartprint
1418 integer :: IERROR,ERRCODE
1420 ! include 'COMMON.SETUP'
1421 ! include 'COMMON.CONTROL'
1422 ! include 'COMMON.VAR'
1423 ! include 'COMMON.MD'
1425 ! include 'COMMON.LANGEVIN'
1427 ! include 'COMMON.LANGEVIN.lang0'
1429 ! include 'COMMON.CHAIN'
1430 ! include 'COMMON.DERIV'
1431 ! include 'COMMON.GEO'
1432 ! include 'COMMON.LOCAL'
1433 ! include 'COMMON.INTERACT'
1434 ! include 'COMMON.IOUNITS'
1435 ! include 'COMMON.NAMES'
1436 ! include 'COMMON.TIME1'
1437 real(kind=8),dimension(0:n_ene) :: energia_short,energia_long
1438 real(kind=8),dimension(3) :: L,vcm,incr
1439 real(kind=8),dimension(3,0:2*nres) :: dc_old0,d_t_old0,d_a_old0 !(3,0:maxres2) maxres2=2*maxres
1440 logical :: PRINT_AMTS_MSG = .false.
1441 integer :: count,rstcount !ilen,
1443 character(len=50) :: tytul
1444 integer :: maxcount_scale = 10
1445 !el common /gucio/ cm
1446 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
1447 !el common /stochcalc/ stochforcvec
1448 integer :: itt,i,j,itsplit,itime
1450 !el common /cipiszcze/ itt
1452 real(kind=8) :: epdrift,tt0,epdriftmax
1455 if (.not.allocated(stochforcvec)) allocate(stochforcvec(6*nres)) !(MAXRES6) maxres6=6*maxres
1459 if (large.and. mod(itime,ntwe).eq.0) then
1460 write (iout,*) "***************** RESPA itime",itime
1461 write (iout,*) "Cartesian and internal coordinates: step 0"
1463 call pdbout(0.0d0,"cipiszcze",iout)
1465 write (iout,*) "Accelerations from long-range forces"
1467 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1468 (d_a(j,i+nres),j=1,3)
1470 write (iout,*) "Velocities, step 0"
1472 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1473 (d_t(j,i+nres),j=1,3)
1478 ! Perform the initial RESPA step (increment velocities)
1479 ! write (iout,*) "*********************** RESPA ini"
1482 if (mod(itime,ntwe).eq.0 .and. large) then
1483 write (iout,*) "Velocities, end"
1485 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1486 (d_t(j,i+nres),j=1,3)
1490 ! Compute the short-range forces
1496 ! 7/2/2009 commented out
1498 ! call etotal_short(energia_short)
1501 ! 7/2/2009 Copy accelerations due to short-lange forces from previous MD step
1504 d_a(j,i)=d_a_short(j,i)
1508 if (large.and. mod(itime,ntwe).eq.0) then
1509 write (iout,*) "energia_short",energia_short(0)
1510 write (iout,*) "Accelerations from short-range forces"
1512 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1513 (d_a(j,i+nres),j=1,3)
1518 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1520 t_enegrad=t_enegrad+tcpu()-tt0
1525 d_t_old(j,i)=d_t(j,i)
1526 d_a_old(j,i)=d_a(j,i)
1529 ! 6/30/08 A-MTS: attempt at increasing the split number
1532 dc_old0(j,i)=dc_old(j,i)
1533 d_t_old0(j,i)=d_t_old(j,i)
1534 d_a_old0(j,i)=d_a_old(j,i)
1537 if (ntime_split.gt.ntime_split0) ntime_split=ntime_split/2
1538 if (ntime_split.lt.ntime_split0) ntime_split=ntime_split0
1545 ! write (iout,*) "itime",itime," ntime_split",ntime_split
1546 ! Split the time step
1547 d_time=d_time0/ntime_split
1548 ! Perform the short-range RESPA steps (velocity Verlet increments of
1549 ! positions and velocities using short-range forces)
1550 ! write (iout,*) "*********************** RESPA split"
1551 do itsplit=1,ntime_split
1554 else if (lang.eq.2 .or. lang.eq.3) then
1556 call stochastic_force(stochforcvec)
1559 "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
1561 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1566 ! First step of the velocity Verlet algorithm
1571 else if (lang.eq.3) then
1573 call sd_verlet1_ciccotti
1575 else if (lang.eq.1) then
1580 ! Build the chain from the newly calculated coordinates
1581 call chainbuild_cart
1582 if (rattle) call rattle1
1584 if (large.and. mod(itime,ntwe).eq.0) then
1585 write (iout,*) "***** ITSPLIT",itsplit
1586 write (iout,*) "Cartesian and internal coordinates: step 1"
1587 call pdbout(0.0d0,"cipiszcze",iout)
1590 write (iout,*) "Velocities, step 1"
1592 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1593 (d_t(j,i+nres),j=1,3)
1602 ! Calculate energy and forces
1604 call etotal_short(energia_short)
1605 ! AL 4/17/17: Exit itime_split loop when energy goes infinite
1606 if (energia_short(0).gt.0.99e20 .or. isnan(energia_short(0)) ) then
1607 if (PRINT_AMTS_MSG) &
1608 write (iout,*) "Infinities/NaNs in energia_short",energia_short(0),"; increasing ntime_split to",ntime_split
1609 ntime_split=ntime_split*2
1610 if (ntime_split.gt.maxtime_split) then
1613 "Cannot rescue the run; aborting job. Retry with a smaller time step"
1615 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1618 "Cannot rescue the run; terminating. Retry with a smaller time step"
1624 if (large.and. mod(itime,ntwe).eq.0) &
1625 call enerprint(energia_short)
1628 t_eshort=t_eshort+MPI_Wtime()-tt0
1630 t_eshort=t_eshort+tcpu()-tt0
1634 ! Get the new accelerations
1636 ! 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
1639 d_a_short(j,i)=d_a(j,i)
1643 if (large.and. mod(itime,ntwe).eq.0) then
1644 write (iout,*)"energia_short",energia_short(0)
1645 write (iout,*) "Accelerations from short-range forces"
1647 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1648 (d_a(j,i+nres),j=1,3)
1653 ! Determine maximum acceleration and scale down the timestep if needed
1655 amax=amax/ntime_split**2
1656 call predict_edrift(epdrift)
1657 if (ntwe.gt.0 .and. large .and. mod(itime,ntwe).eq.0) &
1658 write (iout,*) "amax",amax," damax",damax,&
1659 " epdrift",epdrift," epdriftmax",epdriftmax
1660 ! Exit loop and try with increased split number if the change of
1661 ! acceleration is too big
1662 if (amax.gt.damax .or. epdrift.gt.edriftmax) then
1663 if (ntime_split.lt.maxtime_split) then
1665 ntime_split=ntime_split*2
1666 ! AL 4/17/17: We should exit the itime_split loop when acceleration change is too big
1670 dc_old(j,i)=dc_old0(j,i)
1671 d_t_old(j,i)=d_t_old0(j,i)
1672 d_a_old(j,i)=d_a_old0(j,i)
1675 if (PRINT_AMTS_MSG) then
1676 write (iout,*) "acceleration/energy drift too large",amax,&
1677 epdrift," split increased to ",ntime_split," itime",itime,&
1683 "Uh-hu. Bumpy landscape. Maximum splitting number",&
1685 " already reached!!! Trying to carry on!"
1689 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1691 t_enegrad=t_enegrad+tcpu()-tt0
1693 ! Second step of the velocity Verlet algorithm
1698 else if (lang.eq.3) then
1700 call sd_verlet2_ciccotti
1702 else if (lang.eq.1) then
1707 if (rattle) call rattle2
1708 ! Backup the coordinates, velocities, and accelerations
1712 d_t_old(j,i)=d_t(j,i)
1713 d_a_old(j,i)=d_a(j,i)
1720 ! Restore the time step
1722 ! Compute long-range forces
1729 call etotal_long(energia_long)
1730 if (energia_long(0).gt.0.99e20 .or. isnan(energia_long(0))) then
1733 "Infinitied/NaNs in energia_long, Aborting MPI job."
1735 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
1737 write (iout,*) "Infinitied/NaNs in energia_long, terminating."
1741 if (large.and. mod(itime,ntwe).eq.0) &
1742 call enerprint(energia_long)
1745 t_elong=t_elong+MPI_Wtime()-tt0
1747 t_elong=t_elong+tcpu()-tt0
1750 potE=potEcomp(0)-potEcomp(51)
1754 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1756 t_enegrad=t_enegrad+tcpu()-tt0
1758 ! Compute accelerations from long-range forces
1760 if (large.and. mod(itime,ntwe).eq.0) then
1761 write (iout,*) "energia_long",energia_long(0)
1762 write (iout,*) "Cartesian and internal coordinates: step 2"
1764 call pdbout(0.0d0,"cipiszcze",iout)
1766 write (iout,*) "Accelerations from long-range forces"
1768 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1769 (d_a(j,i+nres),j=1,3)
1771 write (iout,*) "Velocities, step 2"
1773 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1774 (d_t(j,i+nres),j=1,3)
1778 ! Compute the final RESPA step (increment velocities)
1779 ! write (iout,*) "*********************** RESPA fin"
1781 ! Compute the complete potential energy
1783 potEcomp(i)=energia_short(i)+energia_long(i)
1785 potE=potEcomp(0)-potEcomp(51)
1786 ! potE=energia_short(0)+energia_long(0)
1789 ! Calculate the kinetic and the total energy and the kinetic temperature
1792 ! Couple the system to Berendsen bath if needed
1793 if (tbf .and. lang.eq.0) then
1796 kinetic_T=2.0d0/(dimen3*Rb)*EK
1797 ! Backup the coordinates, velocities, and accelerations
1799 if (mod(itime,ntwe).eq.0 .and. large) then
1800 write (iout,*) "Velocities, end"
1802 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1803 (d_t(j,i+nres),j=1,3)
1808 end subroutine RESPA_step
1809 !-----------------------------------------------------------------------------
1810 subroutine RESPA_vel
1811 ! First and last RESPA step (incrementing velocities using long-range
1814 ! implicit real*8 (a-h,o-z)
1815 ! include 'DIMENSIONS'
1816 ! include 'COMMON.CONTROL'
1817 ! include 'COMMON.VAR'
1818 ! include 'COMMON.MD'
1819 ! include 'COMMON.CHAIN'
1820 ! include 'COMMON.DERIV'
1821 ! include 'COMMON.GEO'
1822 ! include 'COMMON.LOCAL'
1823 ! include 'COMMON.INTERACT'
1824 ! include 'COMMON.IOUNITS'
1825 ! include 'COMMON.NAMES'
1826 integer :: i,j,inres,mnum
1829 d_t(j,0)=d_t(j,0)+0.5d0*d_a(j,0)*d_time
1833 d_t(j,i)=d_t(j,i)+0.5d0*d_a(j,i)*d_time
1838 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1839 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1840 .and.(mnum.ne.5)) then
1843 d_t(j,inres)=d_t(j,inres)+0.5d0*d_a(j,inres)*d_time
1848 end subroutine RESPA_vel
1849 !-----------------------------------------------------------------------------
1851 ! Applying velocity Verlet algorithm - step 1 to coordinates
1853 ! implicit real*8 (a-h,o-z)
1854 ! include 'DIMENSIONS'
1855 ! include 'COMMON.CONTROL'
1856 ! include 'COMMON.VAR'
1857 ! include 'COMMON.MD'
1858 ! include 'COMMON.CHAIN'
1859 ! include 'COMMON.DERIV'
1860 ! include 'COMMON.GEO'
1861 ! include 'COMMON.LOCAL'
1862 ! include 'COMMON.INTERACT'
1863 ! include 'COMMON.IOUNITS'
1864 ! include 'COMMON.NAMES'
1865 real(kind=8) :: adt,adt2
1866 integer :: i,j,inres,mnum
1869 write (iout,*) "VELVERLET1 START: DC"
1871 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
1872 (dc(j,i+nres),j=1,3)
1876 adt=d_a_old(j,0)*d_time
1878 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
1879 d_t_new(j,0)=d_t_old(j,0)+adt2
1880 d_t(j,0)=d_t_old(j,0)+adt
1884 adt=d_a_old(j,i)*d_time
1886 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
1887 d_t_new(j,i)=d_t_old(j,i)+adt2
1888 d_t(j,i)=d_t_old(j,i)+adt
1893 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1894 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1895 .and.(mnum.ne.5)) then
1898 adt=d_a_old(j,inres)*d_time
1900 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
1901 d_t_new(j,inres)=d_t_old(j,inres)+adt2
1902 d_t(j,inres)=d_t_old(j,inres)+adt
1907 write (iout,*) "VELVERLET1 END: DC"
1909 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
1910 (dc(j,i+nres),j=1,3)
1914 end subroutine verlet1
1915 !-----------------------------------------------------------------------------
1917 ! Step 2 of the velocity Verlet algorithm: update velocities
1919 ! implicit real*8 (a-h,o-z)
1920 ! include 'DIMENSIONS'
1921 ! include 'COMMON.CONTROL'
1922 ! include 'COMMON.VAR'
1923 ! include 'COMMON.MD'
1924 ! include 'COMMON.CHAIN'
1925 ! include 'COMMON.DERIV'
1926 ! include 'COMMON.GEO'
1927 ! include 'COMMON.LOCAL'
1928 ! include 'COMMON.INTERACT'
1929 ! include 'COMMON.IOUNITS'
1930 ! include 'COMMON.NAMES'
1931 integer :: i,j,inres,mnum
1934 d_t(j,0)=d_t_new(j,0)+0.5d0*d_a(j,0)*d_time
1938 d_t(j,i)=d_t_new(j,i)+0.5d0*d_a(j,i)*d_time
1943 ! iti=iabs(itype(i,mnum))
1944 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1945 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1946 .and.(mnum.ne.5)) then
1949 d_t(j,inres)=d_t_new(j,inres)+0.5d0*d_a(j,inres)*d_time
1954 end subroutine verlet2
1955 !-----------------------------------------------------------------------------
1956 subroutine sddir_precalc
1957 ! Applying velocity Verlet algorithm - step 1 to coordinates
1958 ! implicit real*8 (a-h,o-z)
1959 ! include 'DIMENSIONS'
1965 ! include 'COMMON.CONTROL'
1966 ! include 'COMMON.VAR'
1967 ! include 'COMMON.MD'
1969 ! include 'COMMON.LANGEVIN'
1971 ! include 'COMMON.LANGEVIN.lang0'
1973 ! include 'COMMON.CHAIN'
1974 ! include 'COMMON.DERIV'
1975 ! include 'COMMON.GEO'
1976 ! include 'COMMON.LOCAL'
1977 ! include 'COMMON.INTERACT'
1978 ! include 'COMMON.IOUNITS'
1979 ! include 'COMMON.NAMES'
1980 ! include 'COMMON.TIME1'
1981 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
1982 !el common /stochcalc/ stochforcvec
1983 real(kind=8) :: time00
1985 ! Compute friction and stochastic forces
1990 time_fric=time_fric+MPI_Wtime()-time00
1992 call stochastic_force(stochforcvec)
1993 time_stoch=time_stoch+MPI_Wtime()-time00
1996 ! Compute the acceleration due to friction forces (d_af_work) and stochastic
1997 ! forces (d_as_work)
1999 call ginv_mult(fric_work, d_af_work)
2000 call ginv_mult(stochforcvec, d_as_work)
2002 end subroutine sddir_precalc
2003 !-----------------------------------------------------------------------------
2004 subroutine sddir_verlet1
2005 ! Applying velocity Verlet algorithm - step 1 to velocities
2008 ! implicit real*8 (a-h,o-z)
2009 ! include 'DIMENSIONS'
2010 ! include 'COMMON.CONTROL'
2011 ! include 'COMMON.VAR'
2012 ! include 'COMMON.MD'
2014 ! include 'COMMON.LANGEVIN'
2016 ! include 'COMMON.LANGEVIN.lang0'
2018 ! include 'COMMON.CHAIN'
2019 ! include 'COMMON.DERIV'
2020 ! include 'COMMON.GEO'
2021 ! include 'COMMON.LOCAL'
2022 ! include 'COMMON.INTERACT'
2023 ! include 'COMMON.IOUNITS'
2024 ! include 'COMMON.NAMES'
2025 ! Revised 3/31/05 AL: correlation between random contributions to
2026 ! position and velocity increments included.
2027 real(kind=8) :: sqrt13 = 0.57735026918962576451d0 ! 1/sqrt(3)
2028 real(kind=8) :: adt,adt2
2029 integer :: i,j,ind,inres,mnum
2031 ! Add the contribution from BOTH friction and stochastic force to the
2032 ! coordinates, but ONLY the contribution from the friction forces to velocities
2035 adt=(d_a_old(j,0)+d_af_work(j))*d_time
2036 adt2=0.5d0*adt+sqrt13*d_as_work(j)*d_time
2037 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
2038 d_t_new(j,0)=d_t_old(j,0)+0.5d0*adt
2039 d_t(j,0)=d_t_old(j,0)+adt
2044 adt=(d_a_old(j,i)+d_af_work(ind+j))*d_time
2045 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
2046 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
2047 d_t_new(j,i)=d_t_old(j,i)+0.5d0*adt
2048 d_t(j,i)=d_t_old(j,i)+adt
2054 ! iti=iabs(itype(i,mnum))
2055 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2056 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2057 .and.(mnum.ne.5)) then
2060 adt=(d_a_old(j,inres)+d_af_work(ind+j))*d_time
2061 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
2062 ! write(iout,*) "adt",adt,"ads",adt2
2063 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
2064 d_t_new(j,inres)=d_t_old(j,inres)+0.5d0*adt
2065 d_t(j,inres)=d_t_old(j,inres)+adt
2071 end subroutine sddir_verlet1
2072 !-----------------------------------------------------------------------------
2073 subroutine sddir_verlet2
2074 ! Calculating the adjusted velocities for accelerations
2077 ! implicit real*8 (a-h,o-z)
2078 ! include 'DIMENSIONS'
2079 ! include 'COMMON.CONTROL'
2080 ! include 'COMMON.VAR'
2081 ! include 'COMMON.MD'
2083 ! include 'COMMON.LANGEVIN'
2085 ! include 'COMMON.LANGEVIN.lang0'
2087 ! include 'COMMON.CHAIN'
2088 ! include 'COMMON.DERIV'
2089 ! include 'COMMON.GEO'
2090 ! include 'COMMON.LOCAL'
2091 ! include 'COMMON.INTERACT'
2092 ! include 'COMMON.IOUNITS'
2093 ! include 'COMMON.NAMES'
2094 real(kind=8),dimension(6*nres) :: stochforcvec,d_as_work1 !(MAXRES6) maxres6=6*maxres
2095 real(kind=8) :: cos60 = 0.5d0, sin60 = 0.86602540378443864676d0
2096 integer :: i,j,ind,inres,mnum
2097 ! Revised 3/31/05 AL: correlation between random contributions to
2098 ! position and velocity increments included.
2099 ! The correlation coefficients are calculated at low-friction limit.
2100 ! Also, friction forces are now not calculated with new velocities.
2102 ! call friction_force
2103 call stochastic_force(stochforcvec)
2105 ! Compute the acceleration due to friction forces (d_af_work) and stochastic
2106 ! forces (d_as_work)
2108 call ginv_mult(stochforcvec, d_as_work1)
2114 d_t(j,0)=d_t_new(j,0)+(0.5d0*(d_a(j,0)+d_af_work(j)) &
2115 +sin60*d_as_work(j)+cos60*d_as_work1(j))*d_time
2120 d_t(j,i)=d_t_new(j,i)+(0.5d0*(d_a(j,i)+d_af_work(ind+j)) &
2121 +sin60*d_as_work(ind+j)+cos60*d_as_work1(ind+j))*d_time
2127 ! iti=iabs(itype(i,mnum))
2128 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2129 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2130 .and.(mnum.ne.5)) then
2133 d_t(j,inres)=d_t_new(j,inres)+(0.5d0*(d_a(j,inres) &
2134 +d_af_work(ind+j))+sin60*d_as_work(ind+j) &
2135 +cos60*d_as_work1(ind+j))*d_time
2141 end subroutine sddir_verlet2
2142 !-----------------------------------------------------------------------------
2143 subroutine max_accel
2145 ! Find the maximum difference in the accelerations of the the sites
2146 ! at the beginning and the end of the time step.
2149 ! implicit real*8 (a-h,o-z)
2150 ! include 'DIMENSIONS'
2151 ! include 'COMMON.CONTROL'
2152 ! include 'COMMON.VAR'
2153 ! include 'COMMON.MD'
2154 ! include 'COMMON.CHAIN'
2155 ! include 'COMMON.DERIV'
2156 ! include 'COMMON.GEO'
2157 ! include 'COMMON.LOCAL'
2158 ! include 'COMMON.INTERACT'
2159 ! include 'COMMON.IOUNITS'
2160 real(kind=8),dimension(3) :: aux,accel,accel_old
2161 real(kind=8) :: dacc
2165 ! aux(j)=d_a(j,0)-d_a_old(j,0)
2166 accel_old(j)=d_a_old(j,0)
2173 ! 7/3/08 changed to asymmetric difference
2175 ! accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i))
2176 accel_old(j)=accel_old(j)+0.5d0*d_a_old(j,i)
2177 accel(j)=accel(j)+0.5d0*d_a(j,i)
2178 ! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
2179 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
2180 dacc=dabs(accel(j)-accel_old(j))
2181 ! write (iout,*) i,dacc
2182 if (dacc.gt.amax) amax=dacc
2190 accel_old(j)=d_a_old(j,0)
2195 accel_old(j)=accel_old(j)+d_a_old(j,1)
2196 accel(j)=accel(j)+d_a(j,1)
2201 ! iti=iabs(itype(i,mnum))
2202 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2203 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2204 .and.(mnum.ne.5)) then
2206 ! accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres)
2207 accel_old(j)=accel_old(j)+d_a_old(j,i+nres)
2208 accel(j)=accel(j)+d_a(j,i+nres)
2212 ! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
2213 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
2214 dacc=dabs(accel(j)-accel_old(j))
2215 ! write (iout,*) "side-chain",i,dacc
2216 if (dacc.gt.amax) amax=dacc
2220 accel_old(j)=accel_old(j)+d_a_old(j,i)
2221 accel(j)=accel(j)+d_a(j,i)
2222 ! aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i)
2226 end subroutine max_accel
2227 !-----------------------------------------------------------------------------
2228 subroutine predict_edrift(epdrift)
2230 ! Predict the drift of the potential energy
2233 use control_data, only: lmuca
2234 ! implicit real*8 (a-h,o-z)
2235 ! include 'DIMENSIONS'
2236 ! include 'COMMON.CONTROL'
2237 ! include 'COMMON.VAR'
2238 ! include 'COMMON.MD'
2239 ! include 'COMMON.CHAIN'
2240 ! include 'COMMON.DERIV'
2241 ! include 'COMMON.GEO'
2242 ! include 'COMMON.LOCAL'
2243 ! include 'COMMON.INTERACT'
2244 ! include 'COMMON.IOUNITS'
2245 ! include 'COMMON.MUCA'
2246 real(kind=8) :: epdrift,epdriftij
2248 ! Drift of the potential energy
2254 epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i))
2255 if (lmuca) epdriftij=epdriftij*factor
2256 ! write (iout,*) "back",i,j,epdriftij
2257 if (epdriftij.gt.epdrift) epdrift=epdriftij
2261 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1.and.&
2262 molnum(i).ne.5) then
2265 dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
2266 if (lmuca) epdriftij=epdriftij*factor
2267 ! write (iout,*) "side",i,j,epdriftij
2268 if (epdriftij.gt.epdrift) epdrift=epdriftij
2272 epdrift=0.5d0*epdrift*d_time*d_time
2273 ! write (iout,*) "epdrift",epdrift
2275 end subroutine predict_edrift
2276 !-----------------------------------------------------------------------------
2277 subroutine verlet_bath
2279 ! Coupling to the thermostat by using the Berendsen algorithm
2282 ! implicit real*8 (a-h,o-z)
2283 ! include 'DIMENSIONS'
2284 ! include 'COMMON.CONTROL'
2285 ! include 'COMMON.VAR'
2286 ! include 'COMMON.MD'
2287 ! include 'COMMON.CHAIN'
2288 ! include 'COMMON.DERIV'
2289 ! include 'COMMON.GEO'
2290 ! include 'COMMON.LOCAL'
2291 ! include 'COMMON.INTERACT'
2292 ! include 'COMMON.IOUNITS'
2293 ! include 'COMMON.NAMES'
2294 real(kind=8) :: T_half,fact
2295 integer :: i,j,inres,mnum
2297 T_half=2.0d0/(dimen3*Rb)*EK
2298 fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0))
2299 ! write(iout,*) "T_half", T_half
2300 ! write(iout,*) "EK", EK
2301 ! write(iout,*) "fact", fact
2303 d_t(j,0)=fact*d_t(j,0)
2307 d_t(j,i)=fact*d_t(j,i)
2312 ! iti=iabs(itype(i,mnum))
2313 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2314 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2315 .and.(mnum.ne.5)) then
2318 d_t(j,inres)=fact*d_t(j,inres)
2323 end subroutine verlet_bath
2324 !-----------------------------------------------------------------------------
2326 ! Set up the initial conditions of a MD simulation
2329 use control, only:tcpu
2330 !el use io_basic, only:ilen
2333 use minimm, only:minim_dc,minimize,sc_move
2334 use io_config, only:readrst
2335 use io, only:statout
2336 use random, only: iran_num
2337 ! implicit real*8 (a-h,o-z)
2338 ! include 'DIMENSIONS'
2341 character(len=16) :: form
2342 integer :: IERROR,ERRCODE
2344 integer :: iranmin,itrial,itmp,n_model_try,k, &
2346 integer, dimension(:),allocatable :: list_model_try
2347 integer, dimension(0:nodes-1) :: i_start_models
2348 ! include 'COMMON.SETUP'
2349 ! include 'COMMON.CONTROL'
2350 ! include 'COMMON.VAR'
2351 ! include 'COMMON.MD'
2353 ! include 'COMMON.LANGEVIN'
2355 ! include 'COMMON.LANGEVIN.lang0'
2357 ! include 'COMMON.CHAIN'
2358 ! include 'COMMON.DERIV'
2359 ! include 'COMMON.GEO'
2360 ! include 'COMMON.LOCAL'
2361 ! include 'COMMON.INTERACT'
2362 ! include 'COMMON.IOUNITS'
2363 ! include 'COMMON.NAMES'
2364 ! include 'COMMON.REMD'
2365 real(kind=8),dimension(0:n_ene) :: energia_long,energia_short,energia
2366 real(kind=8),dimension(3) :: vcm,incr,L
2367 real(kind=8) :: xv,sigv,lowb,highb
2368 real(kind=8),dimension(6*nres) :: varia !(maxvar) (maxvar=6*maxres)
2369 character(len=256) :: qstr
2372 character(len=50) :: tytul
2373 logical :: file_exist
2374 !el common /gucio/ cm
2375 integer :: i,j,ipos,iq,iw,nft_sc,iretcode,nfun,ierr,mnum,itime
2376 real(kind=8) :: etot,tt0
2380 ! write(iout,*) "d_time", d_time
2381 ! Compute the standard deviations of stochastic forces for Langevin dynamics
2382 ! if the friction coefficients do not depend on surface area
2383 if (lang.gt.0 .and. .not.surfarea) then
2386 stdforcp(i)=stdfp(mnum)*dsqrt(gamp(mnum))
2390 stdforcsc(i)=stdfsc(iabs(itype(i,mnum)),mnum) &
2391 *dsqrt(gamsc(iabs(itype(i,mnum)),mnum))
2395 ! Open the pdb file for snapshotshots
2398 if (ilen(tmpdir).gt.0) &
2399 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2400 liczba(:ilen(liczba))//".pdb")
2402 file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2406 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
2407 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2408 liczba(:ilen(liczba))//".x")
2409 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2412 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
2413 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2414 liczba(:ilen(liczba))//".cx")
2415 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2421 if (ilen(tmpdir).gt.0) &
2422 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb")
2423 open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb")
2425 if (ilen(tmpdir).gt.0) &
2426 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx")
2427 cartname=prefix(:ilen(prefix))//"_MD.cx"
2431 write (qstr,'(256(1h ))')
2434 iq = qinfrag(i,iset)*10
2435 iw = wfrag(i,iset)/100
2437 if(me.eq.king.or..not.out1file) &
2438 write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw
2439 write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw
2444 iq = qinpair(i,iset)*10
2445 iw = wpair(i,iset)/100
2447 if(me.eq.king.or..not.out1file) &
2448 write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw
2449 write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw
2453 ! pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb'
2455 ! cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x'
2457 ! cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx'
2459 ! statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat'
2463 if (restart1file) then
2465 inquire(file=mremd_rst_name,exist=file_exist)
2466 write (*,*) me," Before broadcast: file_exist",file_exist
2468 call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM,&
2471 write (*,*) me," After broadcast: file_exist",file_exist
2472 ! inquire(file=mremd_rst_name,exist=file_exist)
2473 if(me.eq.king.or..not.out1file) &
2474 write(iout,*) "Initial state read by master and distributed"
2476 if (ilen(tmpdir).gt.0) &
2477 call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_' &
2478 //liczba(:ilen(liczba))//'.rst')
2479 inquire(file=rest2name,exist=file_exist)
2482 if(.not.restart1file) then
2483 if(me.eq.king.or..not.out1file) &
2484 write(iout,*) "Initial state will be read from file ",&
2485 rest2name(:ilen(rest2name))
2488 call rescale_weights(t_bath)
2490 if(me.eq.king.or..not.out1file)then
2491 if (restart1file) then
2492 write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)),&
2495 write(iout,*) "File ",rest2name(:ilen(rest2name)),&
2498 write(iout,*) "Initial velocities randomly generated"
2505 ! Generate initial velocities
2506 if(me.eq.king.or..not.out1file) &
2507 write(iout,*) "Initial velocities randomly generated"
2512 ! rest2name = prefix(:ilen(prefix))//'.rst'
2513 if(me.eq.king.or..not.out1file)then
2514 write (iout,*) "Initial velocities"
2516 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
2517 (d_t(j,i+nres),j=1,3)
2519 ! Zeroing the total angular momentum of the system
2520 write(iout,*) "Calling the zero-angular momentum subroutine"
2523 ! Getting the potential energy and forces and velocities and accelerations
2525 ! write (iout,*) "velocity of the center of the mass:"
2526 ! write (iout,*) (vcm(j),j=1,3)
2528 d_t(j,0)=d_t(j,0)-vcm(j)
2530 ! Removing the velocity of the center of mass
2532 if(me.eq.king.or..not.out1file)then
2533 write (iout,*) "vcm right after adjustment:"
2534 write (iout,*) (vcm(j),j=1,3)
2541 if ((.not.rest).or.(forceminim)) then
2542 if (forceminim) call chainbuild_cart
2544 if(iranconf.ne.0 .or.indpdb.gt.0.and..not.unres_pdb .or.preminim) then
2546 print *, 'Calling OVERLAP_SC'
2547 call overlap_sc(fail)
2548 print *,'after OVERLAP'
2551 print *,'call SC_MOVE'
2552 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
2553 print *,'SC_move',nft_sc,etot
2554 if(me.eq.king.or..not.out1file) &
2555 write(iout,*) 'SC_move',nft_sc,etot
2559 print *, 'Calling MINIM_DC'
2560 call minim_dc(etot,iretcode,nfun)
2562 call geom_to_var(nvar,varia)
2563 print *,'Calling MINIMIZE.'
2564 call minimize(etot,varia,iretcode,nfun)
2565 call var_to_geom(nvar,varia)
2567 if(me.eq.king.or..not.out1file) &
2568 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2570 if(iranconf.ne.0) then
2571 !c 8/22/17 AL Loop to produce a low-energy random conformation
2574 if(me.eq.king.or..not.out1file) &
2575 write (iout,*) 'Calling OVERLAP_SC'
2576 call overlap_sc(fail)
2577 endif !endif overlap
2580 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
2581 print *,'SC_move',nft_sc,etot
2582 if(me.eq.king.or..not.out1file) &
2583 write(iout,*) 'SC_move',nft_sc,etot
2587 print *, 'Calling MINIM_DC'
2588 call minim_dc(etot,iretcode,nfun)
2589 call int_from_cart1(.false.)
2591 call geom_to_var(nvar,varia)
2592 print *,'Calling MINIMIZE.'
2593 call minimize(etot,varia,iretcode,nfun)
2594 call var_to_geom(nvar,varia)
2596 if(me.eq.king.or..not.out1file) &
2597 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2599 if (isnan(etot) .or. etot.gt.4.0d6) then
2600 write (iout,*) "Energy too large",etot, &
2601 " trying another random conformation"
2604 call gen_rand_conf(itmp,*30)
2606 30 write (iout,*) 'Failed to generate random conformation', &
2608 write (*,*) 'Processor:',me, &
2609 ' Failed to generate random conformation',&
2618 write (iout,'(a,i3,a)') 'Processor:',me, &
2619 ' error in generating random conformation.'
2620 write (*,'(a,i3,a)') 'Processor:',me, &
2621 ' error in generating random conformation.'
2624 ! call MPI_Abort(mpi_comm_world,error_msg,ierrcode)
2625 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
2635 write (iout,'(a,i3,a)') 'Processor:',me, &
2636 ' failed to generate a low-energy random conformation.'
2637 write (*,'(a,i3,a,f10.3)') 'Processor:',me, &
2638 ' failed to generate a low-energy random conformation.',etot
2642 ! call MPI_Abort(mpi_comm_world,error_msg,ierrcode)
2643 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
2648 else if (preminim) then
2649 if (start_from_model) then
2653 do while (fail .and. n_model_try.lt.nmodel_start)
2654 write (iout,*) "n_model_try",n_model_try
2656 i_model=iran_num(1,nmodel_start)
2658 if (i_model.eq.list_model_try(k)) exit
2660 if (k.gt.n_model_try) exit
2662 n_model_try=n_model_try+1
2663 list_model_try(n_model_try)=i_model
2664 if (me.eq.king .or. .not. out1file) &
2665 write (iout,*) 'Trying to start from model ',&
2666 pdbfiles_chomo(i_model)(:ilen(pdbfiles_chomo(i_model)))
2669 c(j,i)=chomo(j,i,i_model)
2672 call int_from_cart(.true.,.false.)
2673 call sc_loc_geom(.false.)
2677 dc(j,i)=c(j,i+1)-c(j,i)
2678 dc_norm(j,i)=dc(j,i)*vbld_inv(i+1)
2683 dc(j,i+nres)=c(j,i+nres)-c(j,i)
2684 dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres)
2687 if (me.eq.king.or..not.out1file) then
2688 write (iout,*) "Energies before removing overlaps"
2689 call etotal(energia(0))
2690 call enerprint(energia(0))
2692 ! Remove SC overlaps if requested
2694 write (iout,*) 'Calling OVERLAP_SC'
2695 call overlap_sc(fail)
2698 "Failed to remove overlap from model",i_model
2702 if (me.eq.king.or..not.out1file) then
2703 write (iout,*) "Energies after removing overlaps"
2704 call etotal(energia(0))
2705 call enerprint(energia(0))
2708 ! Search for better SC rotamers if requested
2710 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
2711 print *,'SC_move',nft_sc,etot
2712 if (me.eq.king.or..not.out1file)&
2713 write(iout,*) 'SC_move',nft_sc,etot
2715 call etotal(energia(0))
2718 call MPI_Gather(i_model,1,MPI_INTEGER,i_start_models(0),&
2719 1,MPI_INTEGER,king,CG_COMM,IERROR)
2720 if (n_model_try.gt.nmodel_start .and.&
2721 (me.eq.king .or. out1file)) then
2723 "All models have irreparable overlaps. Trying randoms starts."
2725 i_model=nmodel_start+1
2729 ! Remove SC overlaps if requested
2731 write (iout,*) 'Calling OVERLAP_SC'
2732 call overlap_sc(fail)
2735 "Failed to remove overlap"
2738 if (me.eq.king.or..not.out1file) then
2739 write (iout,*) "Energies after removing overlaps"
2740 call etotal(energia(0))
2741 call enerprint(energia(0))
2744 ! 8/22/17 AL Minimize initial structure
2746 if (me.eq.king.or..not.out1file) write(iout,*)&
2747 'Minimizing initial PDB structure: Calling MINIM_DC'
2748 call minim_dc(etot,iretcode,nfun)
2750 call geom_to_var(nvar,varia)
2751 if(me.eq.king.or..not.out1file) write (iout,*)&
2752 'Minimizing initial PDB structure: Calling MINIMIZE.'
2753 call minimize(etot,varia,iretcode,nfun)
2754 call var_to_geom(nvar,varia)
2756 if (me.eq.king.or..not.out1file)&
2757 write(iout,*) 'LBFGS return code is ',status,' eval ',nfun
2758 if(me.eq.king.or..not.out1file)&
2759 write(iout,*) 'LBFGS return code is ',status,' eval ',nfun
2761 if (me.eq.king.or..not.out1file)&
2762 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2763 if(me.eq.king.or..not.out1file)&
2764 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2768 if (nmodel_start.gt.0 .and. me.eq.king) then
2769 write (iout,'(a)') "Task Starting model"
2771 if (i_start_models(i).gt.nmodel_start) then
2772 write (iout,'(i4,2x,a)') i,"RANDOM STRUCTURE"
2774 write(iout,'(i4,2x,a)')i,pdbfiles_chomo(i_start_models(i)) &
2775 (:ilen(pdbfiles_chomo(i_start_models(i))))
2780 call chainbuild_cart
2785 kinetic_T=2.0d0/(dimen3*Rb)*EK
2786 if(me.eq.king.or..not.out1file)then
2796 write(iout,*) "before ETOTAL"
2797 call etotal(potEcomp)
2798 if (large) call enerprint(potEcomp)
2801 t_etotal=t_etotal+MPI_Wtime()-tt0
2803 t_etotal=t_etotal+tcpu()-tt0
2810 if (amax*d_time .gt. dvmax) then
2811 d_time=d_time*dvmax/amax
2812 if(me.eq.king.or..not.out1file) write (iout,*) &
2813 "Time step reduced to",d_time,&
2814 " because of too large initial acceleration."
2816 if(me.eq.king.or..not.out1file)then
2817 write(iout,*) "Potential energy and its components"
2818 call enerprint(potEcomp)
2819 ! write(iout,*) (potEcomp(i),i=0,n_ene)
2821 potE=potEcomp(0)-potEcomp(51)
2825 if (ntwe.ne.0) call statout(itime)
2826 if(me.eq.king.or..not.out1file) &
2827 write (iout,'(/a/3(a25,1pe14.5/))') "Initial:", &
2828 " Kinetic energy",EK," Potential energy",potE, &
2829 " Total energy",totE," Maximum acceleration ", &
2832 write (iout,*) "Initial coordinates"
2834 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3),&
2837 write (iout,*) "Initial dC"
2839 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),&
2840 (dc(j,i+nres),j=1,3)
2842 write (iout,*) "Initial velocities"
2843 write (iout,"(13x,' backbone ',23x,' side chain')")
2845 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
2846 (d_t(j,i+nres),j=1,3)
2848 write (iout,*) "Initial accelerations"
2850 ! write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
2851 write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3),&
2852 (d_a(j,i+nres),j=1,3)
2858 d_t_old(j,i)=d_t(j,i)
2859 d_a_old(j,i)=d_a(j,i)
2861 ! write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3)
2870 call etotal_short(energia_short)
2871 if (large) call enerprint(potEcomp)
2874 t_eshort=t_eshort+MPI_Wtime()-tt0
2876 t_eshort=t_eshort+tcpu()-tt0
2881 if(.not.out1file .and. large) then
2882 write (iout,*) "energia_long",energia_long(0),&
2883 " energia_short",energia_short(0),&
2884 " total",energia_long(0)+energia_short(0)
2885 write (iout,*) "Initial fast-force accelerations"
2887 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
2888 (d_a(j,i+nres),j=1,3)
2891 ! 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
2894 d_a_short(j,i)=d_a(j,i)
2903 call etotal_long(energia_long)
2904 if (large) call enerprint(potEcomp)
2907 t_elong=t_elong+MPI_Wtime()-tt0
2909 t_elong=t_elong+tcpu()-tt0
2914 if(.not.out1file .and. large) then
2915 write (iout,*) "energia_long",energia_long(0)
2916 write (iout,*) "Initial slow-force accelerations"
2918 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
2919 (d_a(j,i+nres),j=1,3)
2923 t_enegrad=t_enegrad+MPI_Wtime()-tt0
2925 t_enegrad=t_enegrad+tcpu()-tt0
2929 end subroutine init_MD
2930 !-----------------------------------------------------------------------------
2931 subroutine random_vel
2933 ! implicit real*8 (a-h,o-z)
2935 use random, only:anorm_distr
2937 ! include 'DIMENSIONS'
2938 ! include 'COMMON.CONTROL'
2939 ! include 'COMMON.VAR'
2940 ! include 'COMMON.MD'
2942 ! include 'COMMON.LANGEVIN'
2944 ! include 'COMMON.LANGEVIN.lang0'
2946 ! include 'COMMON.CHAIN'
2947 ! include 'COMMON.DERIV'
2948 ! include 'COMMON.GEO'
2949 ! include 'COMMON.LOCAL'
2950 ! include 'COMMON.INTERACT'
2951 ! include 'COMMON.IOUNITS'
2952 ! include 'COMMON.NAMES'
2953 ! include 'COMMON.TIME1'
2954 real(kind=8) :: xv,sigv,lowb,highb ,Ek1
2957 real(kind=8) ,allocatable, dimension(:) :: DDU1,DDU2,DL2,DL1,xsolv,DML,rs
2958 real(kind=8) :: sumx
2960 real(kind=8) ,allocatable, dimension(:) :: rsold
2961 real (kind=8),allocatable,dimension(:,:) :: matold
2965 integer :: i,j,ii,k,ind,mark,imark,mnum
2966 ! Generate random velocities from Gaussian distribution of mean 0 and std of KT/m
2967 ! First generate velocities in the eigenspace of the G matrix
2968 ! write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3
2975 sigv=dsqrt((Rb*t_bath)/geigen(i))
2978 d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb)
2980 write (iout,*) "i",i," ii",ii," geigen",geigen(i),&
2981 " d_t_work_new",d_t_work_new(ii)
2992 Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2
2995 write (iout,*) "Ek from eigenvectors",Ek1
2996 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
3000 ! Transform velocities to UNRES coordinate space
3001 allocate (DL1(2*nres))
3002 allocate (DDU1(2*nres))
3003 allocate (DL2(2*nres))
3004 allocate (DDU2(2*nres))
3005 allocate (xsolv(2*nres))
3006 allocate (DML(2*nres))
3007 allocate (rs(2*nres))
3009 allocate (rsold(2*nres))
3010 allocate (matold(2*nres,2*nres))
3012 matold(1,1)=DMorig(1)
3013 matold(1,2)=DU1orig(1)
3014 matold(1,3)=DU2orig(1)
3015 write (*,*) DMorig(1),DU1orig(1),DU2orig(1)
3020 matold(i,j)=DMorig(i)
3021 matold(i,j-1)=DU1orig(i-1)
3023 matold(i,j-2)=DU2orig(i-2)
3031 matold(i,j+1)=DU1orig(i)
3037 matold(i,j+2)=DU2orig(i)
3041 matold(dimen,dimen)=DMorig(dimen)
3042 matold(dimen,dimen-1)=DU1orig(dimen-1)
3043 matold(dimen,dimen-2)=DU2orig(dimen-2)
3044 write(iout,*) "old gmatrix"
3045 call matout(dimen,dimen,2*nres,2*nres,matold)
3049 ! Find the ith eigenvector of the pentadiagonal inertiq matrix
3053 DML(j)=DMorig(j)-geigen(i)
3056 DML(j-1)=DMorig(j)-geigen(i)
3061 DDU1(imark-1)=DU2orig(imark-1)
3062 do j=imark+1,dimen-1
3063 DDU1(j-1)=DU1orig(j)
3071 DDU2(j)=DU2orig(j+1)
3080 write (iout,*) "DL2,DL1,DML,DDU1,DDU2"
3081 write(iout,'(10f10.5)') (DL2(k),k=3,dimen-1)
3082 write(iout,'(10f10.5)') (DL1(k),k=2,dimen-1)
3083 write(iout,'(10f10.5)') (DML(k),k=1,dimen-1)
3084 write(iout,'(10f10.5)') (DDU1(k),k=1,dimen-2)
3085 write(iout,'(10f10.5)') (DDU2(k),k=1,dimen-3)
3088 if (imark.gt.2) rs(imark-2)=-DU2orig(imark-2)
3089 if (imark.gt.1) rs(imark-1)=-DU1orig(imark-1)
3090 if (imark.lt.dimen) rs(imark)=-DU1orig(imark)
3091 if (imark.lt.dimen-1) rs(imark+1)=-DU2orig(imark)
3095 ! write (iout,*) "Vector rs"
3097 ! write (iout,*) j,rs(j)
3100 call FDIAG(dimen-1,DL2,DL1,DML,DDU1,DDU2,rs,xsolv,mark)
3107 sumx=-geigen(i)*xsolv(j)
3109 sumx=sumx+matold(j,k)*xsolv(k)
3112 sumx=sumx+matold(j,k)*xsolv(k-1)
3114 write(iout,'(i5,3f10.5)') j,sumx,rsold(j),sumx-rsold(j)
3117 sumx=-geigen(i)*xsolv(j-1)
3119 sumx=sumx+matold(j,k)*xsolv(k)
3122 sumx=sumx+matold(j,k)*xsolv(k-1)
3124 write(iout,'(i5,3f10.5)') j-1,sumx,rsold(j-1),sumx-rsold(j-1)
3128 "Solution of equations system",i," for eigenvalue",geigen(i)
3130 write(iout,'(i5,f10.5)') j,xsolv(j)
3133 do j=dimen-1,imark,-1
3138 write (iout,*) "Un-normalized eigenvector",i," for eigenvalue",geigen(i)
3140 write(iout,'(i5,f10.5)') j,xsolv(j)
3143 ! Normalize ith eigenvector
3146 sumx=sumx+xsolv(j)**2
3150 xsolv(j)=xsolv(j)/sumx
3153 write (iout,*) "Eigenvector",i," for eigenvalue",geigen(i)
3155 write(iout,'(i5,3f10.5)') j,xsolv(j)
3158 ! All done at this point for eigenvector i, exit loop
3166 write (iout,*) "Unable to find eigenvector",i
3169 ! write (iout,*) "i=",i
3171 ! write (iout,*) "k=",k
3174 ! write(iout,*) "ind",ind," ind1",3*(i-1)+k
3175 d_t_work(ind)=d_t_work(ind) &
3176 +xsolv(j)*d_t_work_new(3*(i-1)+k)
3179 enddo ! i (loop over the eigenvectors)
3182 write (iout,*) "d_t_work"
3184 write (iout,"(i5,f10.5)") i,d_t_work(i)
3189 ! if (itype(i,1).eq.10) then
3191 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
3192 iti=iabs(itype(i,mnum))
3193 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3194 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
3195 .or.(mnum.eq.5)) then
3202 ! write (iout,*) "k",k," ii+k",ii+k," ii+j+k",ii+j+k,"EK1",Ek1
3203 Ek1=Ek1+0.5d0*mp(mnum)*((d_t_work(ii+j+k)+d_t_work_new(ii+k))/2)**2+&
3204 0.5d0*0.25d0*IP(mnum)*(d_t_work(ii+j+k)-d_t_work_new(ii+k))**2
3207 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3208 .and.(mnum.ne.5)) ii=ii+3
3209 write (iout,*) "i",i," itype",itype(i,mnum)," mass",msc(itype(i,mnum),mnum)
3210 write (iout,*) "ii",ii
3213 write (iout,*) "k",k," ii",ii,"EK1",EK1
3214 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3216 Ek1=Ek1+0.5d0*Isc(iabs(itype(i,mnum)),mnum)*(d_t_work(ii)-d_t_work(ii-3))**2
3217 Ek1=Ek1+0.5d0*msc(iabs(itype(i,mnum)),mnum)*d_t_work(ii)**2
3219 write (iout,*) "i",i," ii",ii
3221 write (iout,*) "Ek from d_t_work",Ek1
3222 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
3224 if(allocated(DDU1)) deallocate(DDU1)
3225 if(allocated(DDU2)) deallocate(DDU2)
3226 if(allocated(DL2)) deallocate(DL2)
3227 if(allocated(DL1)) deallocate(DL1)
3228 if(allocated(xsolv)) deallocate(xsolv)
3229 if(allocated(DML)) deallocate(DML)
3230 if(allocated(rs)) deallocate(rs)
3232 if(allocated(matold)) deallocate(matold)
3233 if(allocated(rsold)) deallocate(rsold)
3238 d_t(k,j)=d_t_work(ind)
3242 if (itype(j,1).ne.10 .and. itype(j,mnum).ne.ntyp1_molec(mnum)&
3243 .and.(mnum.ne.5)) then
3245 d_t(k,j+nres)=d_t_work(ind)
3251 write (iout,*) "Random velocities in the Calpha,SC space"
3253 write (iout,'(i3,3f10.5)') i,(d_t(j,i),j=1,3)
3256 write (iout,'(i3,3f10.5)') i,(d_t(j,i+nres),j=1,3)
3263 ! if (itype(i,1).eq.10) then
3265 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
3266 .or.(mnum.eq.5)) then
3268 d_t(j,i)=d_t(j,i+1)-d_t(j,i)
3272 d_t(j,i+nres)=d_t(j,i+nres)-d_t(j,i)
3273 d_t(j,i)=d_t(j,i+1)-d_t(j,i)
3278 write (iout,*)"Random velocities in the virtual-bond-vector space"
3280 write (iout,'(i3,3f10.5)') i,(d_t(j,i),j=1,3)
3283 write (iout,'(i3,3f10.5)') i,(d_t(j,i+nres),j=1,3)
3286 write (iout,*) "Ek from d_t_work",Ek1
3287 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
3295 d_t_work(ind)=d_t_work(ind) &
3296 +Gvec(i,j)*d_t_work_new((j-1)*3+k+1)
3298 ! write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind)
3302 ! Transfer to the d_t vector
3304 d_t(j,0)=d_t_work(j)
3310 d_t(j,i)=d_t_work(ind)
3315 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3316 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3317 .and.(mnum.ne.5)) then
3320 d_t(j,i+nres)=d_t_work(ind)
3326 ! write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",&
3327 ! 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
3329 ! write(iout,*) "end init MD"
3331 end subroutine random_vel
3332 !-----------------------------------------------------------------------------
3334 subroutine sd_verlet_p_setup
3335 ! Sets up the parameters of stochastic Verlet algorithm
3336 ! implicit real*8 (a-h,o-z)
3337 ! include 'DIMENSIONS'
3338 use control, only: tcpu
3343 ! include 'COMMON.CONTROL'
3344 ! include 'COMMON.VAR'
3345 ! include 'COMMON.MD'
3347 ! include 'COMMON.LANGEVIN'
3349 ! include 'COMMON.LANGEVIN.lang0'
3351 ! include 'COMMON.CHAIN'
3352 ! include 'COMMON.DERIV'
3353 ! include 'COMMON.GEO'
3354 ! include 'COMMON.LOCAL'
3355 ! include 'COMMON.INTERACT'
3356 ! include 'COMMON.IOUNITS'
3357 ! include 'COMMON.NAMES'
3358 ! include 'COMMON.TIME1'
3359 real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
3360 real(kind=8) :: pterm,vterm,rho,rhoc,vsig
3361 real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
3362 prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
3363 logical :: lprn = .false.
3364 real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
3365 real(kind=8) :: ktm,gdt,egdt,gdt2,gdt3,gdt4,gdt5,gdt6,gdt7,gdt8,&
3367 integer :: i,maxres2
3374 ! AL 8/17/04 Code adapted from tinker
3376 ! Get the frictional and random terms for stochastic dynamics in the
3377 ! eigenspace of mass-scaled UNRES friction matrix
3381 gdt = fricgam(i) * d_time
3383 ! Stochastic dynamics reduces to simple MD for zero friction
3385 if (gdt .le. zero) then
3386 pfric_vec(i) = 1.0d0
3387 vfric_vec(i) = d_time
3388 afric_vec(i) = 0.5d0 * d_time * d_time
3389 prand_vec(i) = 0.0d0
3390 vrand_vec1(i) = 0.0d0
3391 vrand_vec2(i) = 0.0d0
3393 ! Analytical expressions when friction coefficient is large
3396 if (gdt .ge. gdt_radius) then
3399 vfric_vec(i) = (1.0d0-egdt) / fricgam(i)
3400 afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i)
3401 pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt
3402 vterm = 1.0d0 - egdt**2
3403 rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm)
3405 ! Use series expansions when friction coefficient is small
3416 afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0 &
3417 - gdt5/120.0d0 + gdt6/720.0d0 &
3418 - gdt7/5040.0d0 + gdt8/40320.0d0 &
3419 - gdt9/362880.0d0) / fricgam(i)**2
3420 vfric_vec(i) = d_time - fricgam(i)*afric_vec(i)
3421 pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i)
3422 pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0 &
3423 + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0 &
3424 + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0 &
3425 + 127.0d0*gdt9/90720.0d0
3426 vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0 &
3427 - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0 &
3428 - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0 &
3429 - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0
3430 rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0 &
3431 - 17.0d0*gdt2/1280.0d0 &
3432 + 17.0d0*gdt3/6144.0d0 &
3433 + 40967.0d0*gdt4/34406400.0d0 &
3434 - 57203.0d0*gdt5/275251200.0d0 &
3435 - 1429487.0d0*gdt6/13212057600.0d0)
3438 ! Compute the scaling factors of random terms for the nonzero friction case
3440 ktm = 0.5d0*d_time/fricgam(i)
3441 psig = dsqrt(ktm*pterm) / fricgam(i)
3442 vsig = dsqrt(ktm*vterm)
3443 rhoc = dsqrt(1.0d0 - rho*rho)
3445 vrand_vec1(i) = vsig * rho
3446 vrand_vec2(i) = vsig * rhoc
3451 "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
3454 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
3455 afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
3459 ! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
3462 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
3463 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
3464 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
3465 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
3466 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1)
3467 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
3470 t_sdsetup=t_sdsetup+MPI_Wtime()
3472 t_sdsetup=t_sdsetup+tcpu()-tt0
3475 end subroutine sd_verlet_p_setup
3476 !-----------------------------------------------------------------------------
3477 subroutine eigtransf1(n,ndim,ab,d,c)
3481 real(kind=8) :: ab(ndim,ndim,n),c(ndim,n),d(ndim)
3487 c(i,j)=c(i,j)+ab(k,j,i)*d(k)
3492 end subroutine eigtransf1
3493 !-----------------------------------------------------------------------------
3494 subroutine eigtransf(n,ndim,a,b,d,c)
3498 real(kind=8) :: a(ndim,n),b(ndim,n),c(ndim,n),d(ndim)
3504 c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k)
3509 end subroutine eigtransf
3510 !-----------------------------------------------------------------------------
3511 subroutine sd_verlet1
3513 ! Applying stochastic velocity Verlet algorithm - step 1 to velocities
3515 ! implicit real*8 (a-h,o-z)
3516 ! include 'DIMENSIONS'
3517 ! include 'COMMON.CONTROL'
3518 ! include 'COMMON.VAR'
3519 ! include 'COMMON.MD'
3521 ! include 'COMMON.LANGEVIN'
3523 ! include 'COMMON.LANGEVIN.lang0'
3525 ! include 'COMMON.CHAIN'
3526 ! include 'COMMON.DERIV'
3527 ! include 'COMMON.GEO'
3528 ! include 'COMMON.LOCAL'
3529 ! include 'COMMON.INTERACT'
3530 ! include 'COMMON.IOUNITS'
3531 ! include 'COMMON.NAMES'
3532 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
3533 !el common /stochcalc/ stochforcvec
3534 logical :: lprn = .false.
3535 real(kind=8) :: ddt1,ddt2
3536 integer :: i,j,ind,inres
3538 ! write (iout,*) "dc_old"
3540 ! write (iout,'(i5,3f10.5,5x,3f10.5)')
3541 ! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
3544 dc_work(j)=dc_old(j,0)
3545 d_t_work(j)=d_t_old(j,0)
3546 d_a_work(j)=d_a_old(j,0)
3551 dc_work(ind+j)=dc_old(j,i)
3552 d_t_work(ind+j)=d_t_old(j,i)
3553 d_a_work(ind+j)=d_a_old(j,i)
3559 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3560 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3561 .and.(mnum.ne.5)) then
3563 dc_work(ind+j)=dc_old(j,i+nres)
3564 d_t_work(ind+j)=d_t_old(j,i+nres)
3565 d_a_work(ind+j)=d_a_old(j,i+nres)
3573 "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
3577 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
3578 vfric_mat(i,j),afric_mat(i,j),&
3579 prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
3587 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
3588 +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
3589 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
3590 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
3592 d_t_work_new(i)=ddt1+0.5d0*ddt2
3593 d_t_work(i)=ddt1+ddt2
3598 d_t(j,0)=d_t_work(j)
3603 dc(j,i)=dc_work(ind+j)
3604 d_t(j,i)=d_t_work(ind+j)
3610 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3611 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3612 .and.(mnum.ne.5)) then
3615 dc(j,inres)=dc_work(ind+j)
3616 d_t(j,inres)=d_t_work(ind+j)
3622 end subroutine sd_verlet1
3623 !-----------------------------------------------------------------------------
3624 subroutine sd_verlet2
3626 ! Calculating the adjusted velocities for accelerations
3628 ! implicit real*8 (a-h,o-z)
3629 ! include 'DIMENSIONS'
3630 ! include 'COMMON.CONTROL'
3631 ! include 'COMMON.VAR'
3632 ! include 'COMMON.MD'
3634 ! include 'COMMON.LANGEVIN'
3636 ! include 'COMMON.LANGEVIN.lang0'
3638 ! include 'COMMON.CHAIN'
3639 ! include 'COMMON.DERIV'
3640 ! include 'COMMON.GEO'
3641 ! include 'COMMON.LOCAL'
3642 ! include 'COMMON.INTERACT'
3643 ! include 'COMMON.IOUNITS'
3644 ! include 'COMMON.NAMES'
3645 !el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
3646 real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
3647 !el common /stochcalc/ stochforcvec
3649 real(kind=8) :: ddt1,ddt2
3650 integer :: i,j,ind,inres
3651 ! Compute the stochastic forces which contribute to velocity change
3653 call stochastic_force(stochforcvecV)
3660 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
3661 ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+ &
3662 vrand_mat2(i,j)*stochforcvecV(j)
3664 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
3668 d_t(j,0)=d_t_work(j)
3673 d_t(j,i)=d_t_work(ind+j)
3679 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3680 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3681 .and.(mnum.ne.5)) then
3684 d_t(j,inres)=d_t_work(ind+j)
3690 end subroutine sd_verlet2
3691 !-----------------------------------------------------------------------------
3692 subroutine sd_verlet_ciccotti_setup
3694 ! Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's
3696 ! implicit real*8 (a-h,o-z)
3697 ! include 'DIMENSIONS'
3698 use control, only: tcpu
3703 ! include 'COMMON.CONTROL'
3704 ! include 'COMMON.VAR'
3705 ! include 'COMMON.MD'
3707 ! include 'COMMON.LANGEVIN'
3709 ! include 'COMMON.LANGEVIN.lang0'
3711 ! include 'COMMON.CHAIN'
3712 ! include 'COMMON.DERIV'
3713 ! include 'COMMON.GEO'
3714 ! include 'COMMON.LOCAL'
3715 ! include 'COMMON.INTERACT'
3716 ! include 'COMMON.IOUNITS'
3717 ! include 'COMMON.NAMES'
3718 ! include 'COMMON.TIME1'
3719 real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
3720 real(kind=8) :: pterm,vterm,rho,rhoc,vsig
3721 real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
3722 prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
3723 logical :: lprn = .false.
3724 real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
3725 real(kind=8) :: ktm,gdt,egdt,tt0
3726 integer :: i,maxres2
3733 ! AL 8/17/04 Code adapted from tinker
3735 ! Get the frictional and random terms for stochastic dynamics in the
3736 ! eigenspace of mass-scaled UNRES friction matrix
3740 write (iout,*) "i",i," fricgam",fricgam(i)
3741 gdt = fricgam(i) * d_time
3743 ! Stochastic dynamics reduces to simple MD for zero friction
3745 if (gdt .le. zero) then
3746 pfric_vec(i) = 1.0d0
3747 vfric_vec(i) = d_time
3748 afric_vec(i) = 0.5d0*d_time*d_time
3749 prand_vec(i) = afric_vec(i)
3750 vrand_vec2(i) = vfric_vec(i)
3752 ! Analytical expressions when friction coefficient is large
3757 vfric_vec(i) = dexp(-0.5d0*gdt)*d_time
3758 afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time
3759 prand_vec(i) = afric_vec(i)
3760 vrand_vec2(i) = vfric_vec(i)
3762 ! Compute the scaling factors of random terms for the nonzero friction case
3764 ! ktm = 0.5d0*d_time/fricgam(i)
3765 ! psig = dsqrt(ktm*pterm) / fricgam(i)
3766 ! vsig = dsqrt(ktm*vterm)
3767 ! prand_vec(i) = psig*afric_vec(i)
3768 ! vrand_vec2(i) = vsig*vfric_vec(i)
3773 "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
3776 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
3777 afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
3781 ! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
3783 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
3784 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
3785 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
3786 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
3787 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
3789 t_sdsetup=t_sdsetup+MPI_Wtime()
3791 t_sdsetup=t_sdsetup+tcpu()-tt0
3794 end subroutine sd_verlet_ciccotti_setup
3795 !-----------------------------------------------------------------------------
3796 subroutine sd_verlet1_ciccotti
3798 ! Applying stochastic velocity Verlet algorithm - step 1 to velocities
3799 ! implicit real*8 (a-h,o-z)
3801 ! include 'DIMENSIONS'
3805 ! include 'COMMON.CONTROL'
3806 ! include 'COMMON.VAR'
3807 ! include 'COMMON.MD'
3809 ! include 'COMMON.LANGEVIN'
3811 ! include 'COMMON.LANGEVIN.lang0'
3813 ! include 'COMMON.CHAIN'
3814 ! include 'COMMON.DERIV'
3815 ! include 'COMMON.GEO'
3816 ! include 'COMMON.LOCAL'
3817 ! include 'COMMON.INTERACT'
3818 ! include 'COMMON.IOUNITS'
3819 ! include 'COMMON.NAMES'
3820 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
3821 !el common /stochcalc/ stochforcvec
3822 logical :: lprn = .false.
3823 real(kind=8) :: ddt1,ddt2
3824 integer :: i,j,ind,inres
3825 ! write (iout,*) "dc_old"
3827 ! write (iout,'(i5,3f10.5,5x,3f10.5)')
3828 ! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
3831 dc_work(j)=dc_old(j,0)
3832 d_t_work(j)=d_t_old(j,0)
3833 d_a_work(j)=d_a_old(j,0)
3838 dc_work(ind+j)=dc_old(j,i)
3839 d_t_work(ind+j)=d_t_old(j,i)
3840 d_a_work(ind+j)=d_a_old(j,i)
3845 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3847 dc_work(ind+j)=dc_old(j,i+nres)
3848 d_t_work(ind+j)=d_t_old(j,i+nres)
3849 d_a_work(ind+j)=d_a_old(j,i+nres)
3858 "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
3862 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
3863 vfric_mat(i,j),afric_mat(i,j),&
3864 prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
3872 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
3873 +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
3874 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
3875 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
3877 d_t_work_new(i)=ddt1+0.5d0*ddt2
3878 d_t_work(i)=ddt1+ddt2
3883 d_t(j,0)=d_t_work(j)
3888 dc(j,i)=dc_work(ind+j)
3889 d_t(j,i)=d_t_work(ind+j)
3895 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3896 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3897 .and.(mnum.ne.5)) then
3900 dc(j,inres)=dc_work(ind+j)
3901 d_t(j,inres)=d_t_work(ind+j)
3907 end subroutine sd_verlet1_ciccotti
3908 !-----------------------------------------------------------------------------
3909 subroutine sd_verlet2_ciccotti
3911 ! Calculating the adjusted velocities for accelerations
3913 ! implicit real*8 (a-h,o-z)
3914 ! include 'DIMENSIONS'
3915 ! include 'COMMON.CONTROL'
3916 ! include 'COMMON.VAR'
3917 ! include 'COMMON.MD'
3919 ! include 'COMMON.LANGEVIN'
3921 ! include 'COMMON.LANGEVIN.lang0'
3923 ! include 'COMMON.CHAIN'
3924 ! include 'COMMON.DERIV'
3925 ! include 'COMMON.GEO'
3926 ! include 'COMMON.LOCAL'
3927 ! include 'COMMON.INTERACT'
3928 ! include 'COMMON.IOUNITS'
3929 ! include 'COMMON.NAMES'
3930 !el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
3931 real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
3932 !el common /stochcalc/ stochforcvec
3933 real(kind=8) :: ddt1,ddt2
3934 integer :: i,j,ind,inres
3936 ! Compute the stochastic forces which contribute to velocity change
3938 call stochastic_force(stochforcvecV)
3945 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
3946 ! ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j)
3947 ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j)
3949 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
3953 d_t(j,0)=d_t_work(j)
3958 d_t(j,i)=d_t_work(ind+j)
3964 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3966 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3969 d_t(j,inres)=d_t_work(ind+j)
3975 end subroutine sd_verlet2_ciccotti
3977 !-----------------------------------------------------------------------------
3979 !-----------------------------------------------------------------------------
3980 subroutine inertia_tensor
3982 ! Calculating the intertia tensor for the entire protein in order to
3983 ! remove the perpendicular components of velocity matrix which cause
3984 ! the molecule to rotate.
3987 ! implicit real*8 (a-h,o-z)
3988 ! include 'DIMENSIONS'
3989 ! include 'COMMON.CONTROL'
3990 ! include 'COMMON.VAR'
3991 ! include 'COMMON.MD'
3992 ! include 'COMMON.CHAIN'
3993 ! include 'COMMON.DERIV'
3994 ! include 'COMMON.GEO'
3995 ! include 'COMMON.LOCAL'
3996 ! include 'COMMON.INTERACT'
3997 ! include 'COMMON.IOUNITS'
3998 ! include 'COMMON.NAMES'
4000 real(kind=8),dimension(3,3) :: Im,Imcp,eigvec,Id
4001 real(kind=8),dimension(3) :: pr,eigval,L,vp,vrot
4002 real(kind=8) :: M_SC,mag,mag2,M_PEP
4003 real(kind=8),dimension(3,0:nres) :: vpp !(3,0:MAXRES)
4004 real(kind=8),dimension(3) :: vs_p,pp,incr,v
4005 real(kind=8),dimension(3,3) :: pr1,pr2
4007 !el common /gucio/ cm
4008 integer :: iti,inres,i,j,k,mnum
4019 ! calculating the center of the mass of the protein
4023 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4024 if (itype(i,mnum).eq.ntyp1_molec(mnum)) cycle
4025 M_PEP=M_PEP+mp(mnum)
4027 cm(j)=cm(j)+(c(j,i)+0.5d0*dc(j,i))*mp(mnum)
4036 if (mnum.eq.5) cycle
4037 iti=iabs(itype(i,mnum))
4038 M_SC=M_SC+msc(iabs(iti),mnum)
4041 cm(j)=cm(j)+msc(iabs(iti),mnum)*c(j,inres)
4045 cm(j)=cm(j)/(M_SC+M_PEP)
4050 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4052 pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
4054 Im(1,1)=Im(1,1)+mp(mnum)*(pr(2)*pr(2)+pr(3)*pr(3))
4055 Im(1,2)=Im(1,2)-mp(mnum)*pr(1)*pr(2)
4056 Im(1,3)=Im(1,3)-mp(mnum)*pr(1)*pr(3)
4057 Im(2,3)=Im(2,3)-mp(mnum)*pr(2)*pr(3)
4058 Im(2,2)=Im(2,2)+mp(mnum)*(pr(3)*pr(3)+pr(1)*pr(1))
4059 Im(3,3)=Im(3,3)+mp(mnum)*(pr(1)*pr(1)+pr(2)*pr(2))
4064 iti=iabs(itype(i,mnum))
4065 if (mnum.eq.5) cycle
4068 pr(j)=c(j,inres)-cm(j)
4070 Im(1,1)=Im(1,1)+msc(iabs(iti),mnum)*(pr(2)*pr(2)+pr(3)*pr(3))
4071 Im(1,2)=Im(1,2)-msc(iabs(iti),mnum)*pr(1)*pr(2)
4072 Im(1,3)=Im(1,3)-msc(iabs(iti),mnum)*pr(1)*pr(3)
4073 Im(2,3)=Im(2,3)-msc(iabs(iti),mnum)*pr(2)*pr(3)
4074 Im(2,2)=Im(2,2)+msc(iabs(iti),mnum)*(pr(3)*pr(3)+pr(1)*pr(1))
4075 Im(3,3)=Im(3,3)+msc(iabs(iti),mnum)*(pr(1)*pr(1)+pr(2)*pr(2))
4080 Im(1,1)=Im(1,1)+Ip(mnum)*(1-dc_norm(1,i)*dc_norm(1,i))* &
4081 vbld(i+1)*vbld(i+1)*0.25d0
4082 Im(1,2)=Im(1,2)+Ip(mnum)*(-dc_norm(1,i)*dc_norm(2,i))* &
4083 vbld(i+1)*vbld(i+1)*0.25d0
4084 Im(1,3)=Im(1,3)+Ip(mnum)*(-dc_norm(1,i)*dc_norm(3,i))* &
4085 vbld(i+1)*vbld(i+1)*0.25d0
4086 Im(2,3)=Im(2,3)+Ip(mnum)*(-dc_norm(2,i)*dc_norm(3,i))* &
4087 vbld(i+1)*vbld(i+1)*0.25d0
4088 Im(2,2)=Im(2,2)+Ip(mnum)*(1-dc_norm(2,i)*dc_norm(2,i))* &
4089 vbld(i+1)*vbld(i+1)*0.25d0
4090 Im(3,3)=Im(3,3)+Ip(mnum)*(1-dc_norm(3,i)*dc_norm(3,i))* &
4091 vbld(i+1)*vbld(i+1)*0.25d0
4097 ! if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)) then
4098 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4099 .and.(mnum.ne.5)) then
4100 iti=iabs(itype(i,mnum))
4102 Im(1,1)=Im(1,1)+Isc(iti,mnum)*(1-dc_norm(1,inres)* &
4103 dc_norm(1,inres))*vbld(inres)*vbld(inres)
4104 Im(1,2)=Im(1,2)-Isc(iti,mnum)*(dc_norm(1,inres)* &
4105 dc_norm(2,inres))*vbld(inres)*vbld(inres)
4106 Im(1,3)=Im(1,3)-Isc(iti,mnum)*(dc_norm(1,inres)* &
4107 dc_norm(3,inres))*vbld(inres)*vbld(inres)
4108 Im(2,3)=Im(2,3)-Isc(iti,mnum)*(dc_norm(2,inres)* &
4109 dc_norm(3,inres))*vbld(inres)*vbld(inres)
4110 Im(2,2)=Im(2,2)+Isc(iti,mnum)*(1-dc_norm(2,inres)* &
4111 dc_norm(2,inres))*vbld(inres)*vbld(inres)
4112 Im(3,3)=Im(3,3)+Isc(iti,mnum)*(1-dc_norm(3,inres)* &
4113 dc_norm(3,inres))*vbld(inres)*vbld(inres)
4118 ! write(iout,*) "The angular momentum before adjustment:"
4119 ! write(iout,*) (L(j),j=1,3)
4125 ! Copying the Im matrix for the djacob subroutine
4133 ! Finding the eigenvectors and eignvalues of the inertia tensor
4134 call djacob(3,3,10000,1.0d-10,Imcp,eigvec,eigval)
4135 ! write (iout,*) "Eigenvalues & Eigenvectors"
4136 ! write (iout,'(5x,3f10.5)') (eigval(i),i=1,3)
4139 ! write (iout,'(i5,3f10.5)') i,(eigvec(i,j),j=1,3)
4141 ! Constructing the diagonalized matrix
4143 if (dabs(eigval(i)).gt.1.0d-15) then
4144 Id(i,i)=1.0d0/eigval(i)
4151 Imcp(i,j)=eigvec(j,i)
4157 pr1(i,j)=pr1(i,j)+Id(i,k)*Imcp(k,j)
4164 pr2(i,j)=pr2(i,j)+eigvec(i,k)*pr1(k,j)
4168 ! Calculating the total rotational velocity of the molecule
4171 vrot(i)=vrot(i)+pr2(i,j)*L(j)
4174 ! Resetting the velocities
4176 call vecpr(vrot(1),dc(1,i),vp)
4178 d_t(j,i)=d_t(j,i)-vp(j)
4183 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4184 .and.(mnum.ne.5)) then
4185 ! if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)) then
4186 ! if(itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
4188 call vecpr(vrot(1),dc(1,inres),vp)
4190 d_t(j,inres)=d_t(j,inres)-vp(j)
4195 ! write(iout,*) "The angular momentum after adjustment:"
4196 ! write(iout,*) (L(j),j=1,3)
4199 end subroutine inertia_tensor
4200 !-----------------------------------------------------------------------------
4201 subroutine angmom(cm,L)
4204 ! implicit real*8 (a-h,o-z)
4205 ! include 'DIMENSIONS'
4206 ! include 'COMMON.CONTROL'
4207 ! include 'COMMON.VAR'
4208 ! include 'COMMON.MD'
4209 ! include 'COMMON.CHAIN'
4210 ! include 'COMMON.DERIV'
4211 ! include 'COMMON.GEO'
4212 ! include 'COMMON.LOCAL'
4213 ! include 'COMMON.INTERACT'
4214 ! include 'COMMON.IOUNITS'
4215 ! include 'COMMON.NAMES'
4216 real(kind=8) :: mscab
4217 real(kind=8),dimension(3) :: L,cm,pr,vp,vrot,incr,v,pp
4218 integer :: iti,inres,i,j,mnum
4219 ! Calculate the angular momentum
4228 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4230 pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
4233 v(j)=incr(j)+0.5d0*d_t(j,i)
4236 incr(j)=incr(j)+d_t(j,i)
4238 call vecpr(pr(1),v(1),vp)
4240 L(j)=L(j)+mp(mnum)*vp(j)
4244 pp(j)=0.5d0*d_t(j,i)
4246 call vecpr(pr(1),pp(1),vp)
4248 L(j)=L(j)+Ip(mnum)*vp(j)
4256 iti=iabs(itype(i,mnum))
4264 pr(j)=c(j,inres)-cm(j)
4266 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4267 .and.(mnum.ne.5)) then
4269 v(j)=incr(j)+d_t(j,inres)
4276 call vecpr(pr(1),v(1),vp)
4277 ! write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3),&
4278 ! " v",(v(j),j=1,3)," vp",(vp(j),j=1,3)
4280 L(j)=L(j)+mscab*vp(j)
4282 ! write (iout,*) "L",(l(j),j=1,3)
4283 if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4284 .and.(mnum.ne.5)) then
4286 v(j)=incr(j)+d_t(j,inres)
4288 call vecpr(dc(1,inres),d_t(1,inres),vp)
4290 L(j)=L(j)+Isc(iti,mnum)*vp(j)
4294 incr(j)=incr(j)+d_t(j,i)
4298 end subroutine angmom
4299 !-----------------------------------------------------------------------------
4300 subroutine vcm_vel(vcm)
4303 ! implicit real*8 (a-h,o-z)
4304 ! include 'DIMENSIONS'
4305 ! include 'COMMON.VAR'
4306 ! include 'COMMON.MD'
4307 ! include 'COMMON.CHAIN'
4308 ! include 'COMMON.DERIV'
4309 ! include 'COMMON.GEO'
4310 ! include 'COMMON.LOCAL'
4311 ! include 'COMMON.INTERACT'
4312 ! include 'COMMON.IOUNITS'
4313 real(kind=8),dimension(3) :: vcm,vv
4314 real(kind=8) :: summas,amas
4324 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4326 summas=summas+mp(mnum)
4328 vcm(j)=vcm(j)+mp(mnum)*(vv(j)+0.5d0*d_t(j,i))
4332 amas=msc(iabs(itype(i,mnum)),mnum)
4337 if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4338 .and.(mnum.ne.5)) then
4340 vcm(j)=vcm(j)+amas*(vv(j)+d_t(j,i+nres))
4344 vcm(j)=vcm(j)+amas*vv(j)
4348 vv(j)=vv(j)+d_t(j,i)
4351 ! write (iout,*) "vcm",(vcm(j),j=1,3)," summas",summas
4353 vcm(j)=vcm(j)/summas
4356 end subroutine vcm_vel
4357 !-----------------------------------------------------------------------------
4359 !-----------------------------------------------------------------------------
4361 ! RATTLE algorithm for velocity Verlet - step 1, UNRES
4365 ! implicit real*8 (a-h,o-z)
4366 ! include 'DIMENSIONS'
4368 ! include 'COMMON.CONTROL'
4369 ! include 'COMMON.VAR'
4370 ! include 'COMMON.MD'
4372 ! include 'COMMON.LANGEVIN'
4374 ! include 'COMMON.LANGEVIN.lang0'
4376 ! include 'COMMON.CHAIN'
4377 ! include 'COMMON.DERIV'
4378 ! include 'COMMON.GEO'
4379 ! include 'COMMON.LOCAL'
4380 ! include 'COMMON.INTERACT'
4381 ! include 'COMMON.IOUNITS'
4382 ! include 'COMMON.NAMES'
4383 ! include 'COMMON.TIME1'
4384 !el real(kind=8) :: gginv(2*nres,2*nres),&
4385 !el gdc(3,2*nres,2*nres)
4386 real(kind=8) :: dC_uncor(3,2*nres) !,&
4387 !el real(kind=8) :: Cmat(2*nres,2*nres)
4388 real(kind=8) :: x(2*nres),xcorr(3,2*nres) !maxres2=2*maxres
4389 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4390 !el common /przechowalnia/ nbond
4391 integer :: max_rattle = 5
4392 logical :: lprn = .false., lprn1 = .false., not_done
4393 real(kind=8) :: tol_rattle = 1.0d-5
4395 integer :: ii,i,j,jj,l,ind,ind1,nres2
4398 !el /common/ przechowalnia
4400 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4401 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4402 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4404 if (lprn) write (iout,*) "RATTLE1"
4408 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4409 .and.(mnum.ne.5)) nbond=nbond+1
4411 ! Make a folded form of the Ginv-matrix
4424 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4429 if (itype(k,1).ne.10 .and. itype(k,mnum).ne.ntyp1_molec(mnum)&
4430 .and.(mnum.ne.5)) then
4434 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4442 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4453 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4457 if (itype(k,1).ne.10) then
4461 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4469 write (iout,*) "Matrix GGinv"
4470 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
4476 if (iter.gt.max_rattle) then
4477 write (iout,*) "Error - too many iterations in RATTLE."
4480 ! Calculate the matrix C = GG**(-1) dC_old o dC
4485 dC_uncor(j,ind1)=dC(j,i)
4489 if (itype(i,1).ne.10) then
4492 dC_uncor(j,ind1)=dC(j,i+nres)
4501 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
4505 if (itype(k,1).ne.10) then
4508 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
4513 ! Calculate deviations from standard virtual-bond lengths
4517 x(ind)=vbld(i+1)**2-vbl**2
4520 if (itype(i,1).ne.10) then
4522 x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4526 write (iout,*) "Coordinates and violations"
4528 write(iout,'(i5,3f10.5,5x,e15.5)') &
4529 i,(dC_uncor(j,i),j=1,3),x(i)
4531 write (iout,*) "Velocities and violations"
4535 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4536 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
4540 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4541 .and.(mnum.ne.5)) then
4544 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4545 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
4546 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
4549 ! write (iout,*) "gdc"
4551 ! write (iout,*) "i",i
4553 ! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
4559 if (dabs(x(i)).gt.xmax) then
4563 if (xmax.lt.tol_rattle) then
4567 ! Calculate the matrix of the system of equations
4572 Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
4577 write (iout,*) "Matrix Cmat"
4578 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
4580 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
4581 ! Add constraint term to positions
4588 xx = xx+x(ii)*gdc(j,ind,ii)
4592 d_t_new(j,i)=d_t_new(j,i)-xx/d_time
4596 if (itype(i,1).ne.10) then
4601 xx = xx+x(ii)*gdc(j,ind,ii)
4604 dC(j,i+nres)=dC(j,i+nres)-xx
4605 d_t_new(j,i+nres)=d_t_new(j,i+nres)-xx/d_time
4609 ! Rebuild the chain using the new coordinates
4610 call chainbuild_cart
4612 write (iout,*) "New coordinates, Lagrange multipliers,",&
4613 " and differences between actual and standard bond lengths"
4617 xx=vbld(i+1)**2-vbl**2
4618 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4619 i,(dC(j,i),j=1,3),x(ind),xx
4623 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4626 xx=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4627 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4628 i,(dC(j,i+nres),j=1,3),x(ind),xx
4631 write (iout,*) "Velocities and violations"
4635 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4636 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
4639 if (itype(i,1).ne.10) then
4641 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4642 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
4643 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
4650 10 write (iout,*) "Error - singularity in solving the system",&
4651 " of equations for Lagrange multipliers."
4655 "RATTLE inactive; use -DRATTLE switch at compile time."
4658 end subroutine rattle1
4659 !-----------------------------------------------------------------------------
4661 ! RATTLE algorithm for velocity Verlet - step 2, UNRES
4665 ! implicit real*8 (a-h,o-z)
4666 ! include 'DIMENSIONS'
4668 ! include 'COMMON.CONTROL'
4669 ! include 'COMMON.VAR'
4670 ! include 'COMMON.MD'
4672 ! include 'COMMON.LANGEVIN'
4674 ! include 'COMMON.LANGEVIN.lang0'
4676 ! include 'COMMON.CHAIN'
4677 ! include 'COMMON.DERIV'
4678 ! include 'COMMON.GEO'
4679 ! include 'COMMON.LOCAL'
4680 ! include 'COMMON.INTERACT'
4681 ! include 'COMMON.IOUNITS'
4682 ! include 'COMMON.NAMES'
4683 ! include 'COMMON.TIME1'
4684 !el real(kind=8) :: gginv(2*nres,2*nres),&
4685 !el gdc(3,2*nres,2*nres)
4686 real(kind=8) :: dC_uncor(3,2*nres) !,&
4687 !el Cmat(2*nres,2*nres)
4688 real(kind=8) :: x(2*nres) !maxres2=2*maxres
4689 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4690 !el common /przechowalnia/ nbond
4691 integer :: max_rattle = 5
4692 logical :: lprn = .false., lprn1 = .false., not_done
4693 real(kind=8) :: tol_rattle = 1.0d-5
4697 !el /common/ przechowalnia
4698 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4699 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4700 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4702 if (lprn) write (iout,*) "RATTLE2"
4703 if (lprn) write (iout,*) "Velocity correction"
4704 ! Calculate the matrix G dC
4710 gdc(j,i,ind)=GGinv(i,ind)*dC(j,k)
4715 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4716 .and.(mnum.ne.5)) then
4719 gdc(j,i,ind)=GGinv(i,ind)*dC(j,k+nres)
4725 ! write (iout,*) "gdc"
4727 ! write (iout,*) "i",i
4729 ! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
4733 ! Calculate the matrix of the system of equations
4740 Cmat(ind,j)=Cmat(ind,j)+dC(k,i)*gdc(k,ind,j)
4746 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4747 .and.(mnum.ne.5)) then
4752 Cmat(ind,j)=Cmat(ind,j)+dC(k,i+nres)*gdc(k,ind,j)
4757 ! Calculate the scalar product dC o d_t_new
4761 x(ind)=scalar(d_t(1,i),dC(1,i))
4765 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4766 .and.(mnum.ne.5)) then
4768 x(ind)=scalar(d_t(1,i+nres),dC(1,i+nres))
4772 write (iout,*) "Velocities and violations"
4776 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4777 i,ind,(d_t(j,i),j=1,3),x(ind)
4781 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4782 .and.(mnum.ne.5)) then
4784 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4785 i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind)
4791 if (dabs(x(i)).gt.xmax) then
4795 if (xmax.lt.tol_rattle) then
4800 write (iout,*) "Matrix Cmat"
4801 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
4803 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
4804 ! Add constraint term to velocities
4811 xx = xx+x(ii)*gdc(j,ind,ii)
4813 d_t(j,i)=d_t(j,i)-xx
4818 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4819 .and.(mnum.ne.5)) then
4824 xx = xx+x(ii)*gdc(j,ind,ii)
4826 d_t(j,i+nres)=d_t(j,i+nres)-xx
4832 "New velocities, Lagrange multipliers violations"
4836 if (lprn) write (iout,'(2i5,3f10.5,5x,2e15.5)') &
4837 i,ind,(d_t(j,i),j=1,3),x(ind),scalar(d_t(1,i),dC(1,i))
4841 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4844 write (iout,'(2i5,3f10.5,5x,2e15.5)') &
4845 i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind),&
4846 scalar(d_t(1,i+nres),dC(1,i+nres))
4852 10 write (iout,*) "Error - singularity in solving the system",&
4853 " of equations for Lagrange multipliers."
4857 "RATTLE inactive; use -DRATTLE option at compile time."
4860 end subroutine rattle2
4861 !-----------------------------------------------------------------------------
4862 subroutine rattle_brown
4863 ! RATTLE/LINCS algorithm for Brownian dynamics, UNRES
4867 ! implicit real*8 (a-h,o-z)
4868 ! include 'DIMENSIONS'
4870 ! include 'COMMON.CONTROL'
4871 ! include 'COMMON.VAR'
4872 ! include 'COMMON.MD'
4874 ! include 'COMMON.LANGEVIN'
4876 ! include 'COMMON.LANGEVIN.lang0'
4878 ! include 'COMMON.CHAIN'
4879 ! include 'COMMON.DERIV'
4880 ! include 'COMMON.GEO'
4881 ! include 'COMMON.LOCAL'
4882 ! include 'COMMON.INTERACT'
4883 ! include 'COMMON.IOUNITS'
4884 ! include 'COMMON.NAMES'
4885 ! include 'COMMON.TIME1'
4886 !el real(kind=8) :: gginv(2*nres,2*nres),&
4887 !el gdc(3,2*nres,2*nres)
4888 real(kind=8) :: dC_uncor(3,2*nres) !,&
4889 !el real(kind=8) :: Cmat(2*nres,2*nres)
4890 real(kind=8) :: x(2*nres) !maxres2=2*maxres
4891 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4892 !el common /przechowalnia/ nbond
4893 integer :: max_rattle = 5
4894 logical :: lprn = .false., lprn1 = .false., not_done
4895 real(kind=8) :: tol_rattle = 1.0d-5
4899 !el /common/ przechowalnia
4900 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4901 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4902 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4905 if (lprn) write (iout,*) "RATTLE_BROWN"
4908 if (itype(i,1).ne.10) nbond=nbond+1
4910 ! Make a folded form of the Ginv-matrix
4923 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4927 if (itype(k,1).ne.10) then
4931 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4938 if (itype(i,1).ne.10) then
4948 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4952 if (itype(k,1).ne.10) then
4956 if (j.eq.1 .and. l.eq.1)GGinv(ii,jj)=fricmat(ind,ind1)
4964 write (iout,*) "Matrix GGinv"
4965 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
4971 if (iter.gt.max_rattle) then
4972 write (iout,*) "Error - too many iterations in RATTLE."
4975 ! Calculate the matrix C = GG**(-1) dC_old o dC
4980 dC_uncor(j,ind1)=dC(j,i)
4984 if (itype(i,1).ne.10) then
4987 dC_uncor(j,ind1)=dC(j,i+nres)
4996 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
5000 if (itype(k,1).ne.10) then
5003 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
5008 ! Calculate deviations from standard virtual-bond lengths
5012 x(ind)=vbld(i+1)**2-vbl**2
5015 if (itype(i,1).ne.10) then
5017 x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
5021 write (iout,*) "Coordinates and violations"
5023 write(iout,'(i5,3f10.5,5x,e15.5)') &
5024 i,(dC_uncor(j,i),j=1,3),x(i)
5026 write (iout,*) "Velocities and violations"
5030 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5031 i,ind,(d_t(j,i),j=1,3),scalar(d_t(1,i),dC_old(1,i))
5034 if (itype(i,1).ne.10) then
5036 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5037 i+nres,ind,(d_t(j,i+nres),j=1,3),&
5038 scalar(d_t(1,i+nres),dC_old(1,i+nres))
5041 write (iout,*) "gdc"
5043 write (iout,*) "i",i
5045 write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
5051 if (dabs(x(i)).gt.xmax) then
5055 if (xmax.lt.tol_rattle) then
5059 ! Calculate the matrix of the system of equations
5064 Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
5069 write (iout,*) "Matrix Cmat"
5070 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
5072 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
5073 ! Add constraint term to positions
5080 xx = xx+x(ii)*gdc(j,ind,ii)
5083 d_t(j,i)=d_t(j,i)+xx/d_time
5088 if (itype(i,1).ne.10) then
5093 xx = xx+x(ii)*gdc(j,ind,ii)
5096 d_t(j,i+nres)=d_t(j,i+nres)+xx/d_time
5097 dC(j,i+nres)=dC(j,i+nres)+xx
5101 ! Rebuild the chain using the new coordinates
5102 call chainbuild_cart
5104 write (iout,*) "New coordinates, Lagrange multipliers,",&
5105 " and differences between actual and standard bond lengths"
5109 xx=vbld(i+1)**2-vbl**2
5110 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
5111 i,(dC(j,i),j=1,3),x(ind),xx
5114 if (itype(i,1).ne.10) then
5116 xx=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
5117 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
5118 i,(dC(j,i+nres),j=1,3),x(ind),xx
5121 write (iout,*) "Velocities and violations"
5125 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5126 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
5129 if (itype(i,1).ne.10) then
5131 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5132 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
5133 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
5140 10 write (iout,*) "Error - singularity in solving the system",&
5141 " of equations for Lagrange multipliers."
5145 "RATTLE inactive; use -DRATTLE option at compile time"
5148 end subroutine rattle_brown
5149 !-----------------------------------------------------------------------------
5151 !-----------------------------------------------------------------------------
5152 subroutine friction_force
5157 ! implicit real*8 (a-h,o-z)
5158 ! include 'DIMENSIONS'
5159 ! include 'COMMON.VAR'
5160 ! include 'COMMON.CHAIN'
5161 ! include 'COMMON.DERIV'
5162 ! include 'COMMON.GEO'
5163 ! include 'COMMON.LOCAL'
5164 ! include 'COMMON.INTERACT'
5165 ! include 'COMMON.MD'
5167 ! include 'COMMON.LANGEVIN'
5169 ! include 'COMMON.LANGEVIN.lang0'
5171 ! include 'COMMON.IOUNITS'
5172 !el real(kind=8),dimension(6*nres) :: gamvec !(MAXRES6) maxres6=6*maxres
5173 !el common /syfek/ gamvec
5174 real(kind=8) :: vv(3),vvtot(3,nres),v_work(6*nres) !,&
5175 !el ginvfric(2*nres,2*nres) !maxres2=2*maxres
5176 !el common /przechowalnia/ ginvfric
5178 logical :: lprn, checkmode
5179 integer :: i,j,ind,k,nres2,nres6,mnum
5184 ! if (large) lprn=.true.
5185 ! if (large) checkmode=.true.
5186 if(.not.allocated(gamvec)) allocate(gamvec(nres6)) !(MAXRES6)
5187 if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
5195 d_t_work(j)=d_t(j,0)
5200 d_t_work(ind+j)=d_t(j,i)
5206 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5207 .and.(mnum.ne.5)) then
5209 d_t_work(ind+j)=d_t(j,i+nres)
5215 call fricmat_mult(d_t_work,fric_work)
5217 if (.not.checkmode) return
5220 write (iout,*) "d_t_work and fric_work"
5222 write (iout,'(i3,2e15.5)') i,d_t_work(i),fric_work(i)
5226 friction(j,0)=fric_work(j)
5231 friction(j,i)=fric_work(ind+j)
5237 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5238 .and.(mnum.ne.5)) then
5239 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5241 friction(j,i+nres)=fric_work(ind+j)
5247 write(iout,*) "Friction backbone"
5249 write(iout,'(i5,3e15.5,5x,3e15.5)') &
5250 i,(friction(j,i),j=1,3),(d_t(j,i),j=1,3)
5252 write(iout,*) "Friction side chain"
5254 write(iout,'(i5,3e15.5,5x,3e15.5)') &
5255 i,(friction(j,i+nres),j=1,3),(d_t(j,i+nres),j=1,3)
5264 vvtot(j,i)=vv(j)+0.5d0*d_t(j,i)
5265 vvtot(j,i+nres)=vv(j)+d_t(j,i+nres)
5266 vv(j)=vv(j)+d_t(j,i)
5269 write (iout,*) "vvtot backbone and sidechain"
5271 write (iout,'(i5,3e15.5,5x,3e15.5)') i,(vvtot(j,i),j=1,3),&
5272 (vvtot(j,i+nres),j=1,3)
5277 v_work(ind+j)=vvtot(j,i)
5283 v_work(ind+j)=vvtot(j,i+nres)
5287 write (iout,*) "v_work gamvec and site-based friction forces"
5289 write (iout,'(i5,3e15.5)') i,v_work(i),gamvec(i),&
5293 ! fric_work1(i)=0.0d0
5295 ! fric_work1(i)=fric_work1(i)-A(j,i)*gamvec(j)*v_work(j)
5298 ! write (iout,*) "fric_work and fric_work1"
5300 ! write (iout,'(i5,2e15.5)') i,fric_work(i),fric_work1(i)
5306 ginvfric(i,j)=ginvfric(i,j)+ginv(i,k)*fricmat(k,j)
5310 write (iout,*) "ginvfric"
5312 write (iout,'(i5,100f8.3)') i,(ginvfric(i,j),j=1,dimen)
5314 write (iout,*) "symmetry check"
5317 write (iout,*) i,j,ginvfric(i,j)-ginvfric(j,i)
5322 end subroutine friction_force
5323 !-----------------------------------------------------------------------------
5324 subroutine setup_fricmat
5328 use control_data, only:time_Bcast
5329 use control, only:tcpu
5331 ! implicit real*8 (a-h,o-z)
5335 real(kind=8) :: time00
5337 ! include 'DIMENSIONS'
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.SETUP'
5346 ! include 'COMMON.TIME1'
5347 ! integer licznik /0/
5350 ! include 'COMMON.LANGEVIN'
5352 ! include 'COMMON.LANGEVIN.lang0'
5354 ! include 'COMMON.IOUNITS'
5356 integer :: i,j,ind,ind1,m
5357 logical :: lprn = .false.
5358 real(kind=8) :: dtdi !el ,gamvec(2*nres)
5359 !el real(kind=8),dimension(2*nres,2*nres) :: ginvfric,fcopy
5360 ! real(kind=8),allocatable,dimension(:,:) :: fcopy
5361 !el real(kind=8),dimension(2*nres*(2*nres+1)/2) :: Ghalf !(mmaxres2) (mmaxres2=(maxres2*(maxres2+1)/2))
5362 !el common /syfek/ gamvec
5363 real(kind=8) :: work(8*2*nres)
5364 integer :: iwork(2*nres)
5365 !el common /przechowalnia/ ginvfric,Ghalf,fcopy
5366 integer :: ii,iti,k,l,nzero,nres2,nres6,ierr,mnum
5370 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
5371 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5372 if (fg_rank.ne.king) goto 10
5377 if(.not.allocated(gamvec)) allocate(gamvec(nres2)) !(MAXRES2)
5378 if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
5379 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5380 !el allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5381 if(.not.allocated(Ghalf)) allocate(Ghalf(nres2*(nres2+1)/2)) !maxres2=2*maxres
5383 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
5384 ! Zeroing out fricmat
5390 ! Load the friction coefficients corresponding to peptide groups
5395 gamvec(ind1)=gamp(mnum)
5397 ! Load the friction coefficients corresponding to side chains
5401 gamsc(ntyp1_molec(j),j)=1.0d0
5408 gamvec(ii)=gamsc(iabs(iti),mnum)
5410 if (surfarea) call sdarea(gamvec)
5412 ! write (iout,*) "Matrix A and vector gamma"
5414 ! write (iout,'(i2,$)') i
5416 ! write (iout,'(f4.1,$)') A(i,j)
5418 ! write (iout,'(f8.3)') gamvec(i)
5422 write (iout,*) "Vector gamvec"
5424 write (iout,'(i5,f10.5)') i, gamvec(i)
5428 ! The friction matrix
5433 dtdi=dtdi+A(j,k)*A(j,i)*gamvec(j)
5440 write (iout,'(//a)') "Matrix fricmat"
5441 call matout2(dimen,dimen,nres2,nres2,fricmat)
5443 if (lang.eq.2 .or. lang.eq.3) then
5444 ! Mass-scale the friction matrix if non-direct integration will be performed
5450 Ginvfric(i,j)=Ginvfric(i,j)+ &
5451 Gsqrm(i,k)*Gsqrm(l,j)*fricmat(k,l)
5456 ! Diagonalize the friction matrix
5461 Ghalf(ind)=Ginvfric(i,j)
5464 call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
5467 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
5468 " mass-scaled friction matrix"
5469 call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
5471 ! Precompute matrices for tinker stochastic integrator
5478 mt1(i,j)=mt1(i,j)+fricvec(k,i)*gsqrm(k,j)
5479 mt2(i,j)=mt2(i,j)+fricvec(k,i)*gsqrp(k,j)
5485 else if (lang.eq.4) then
5486 ! Diagonalize the friction matrix
5491 Ghalf(ind)=fricmat(i,j)
5494 call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
5497 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
5499 call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
5501 ! Determine the number of zero eigenvalues of the friction matrix
5502 nzero=max0(dimen-dimen1,0)
5503 ! do while (fricgam(nzero+1).le.1.0d-5 .and. nzero.lt.dimen)
5506 write (iout,*) "Number of zero eigenvalues:",nzero
5511 fricmat(i,j)=fricmat(i,j) &
5512 +fricvec(i,k)*fricvec(j,k)/fricgam(k)
5517 write (iout,'(//a)') "Generalized inverse of fricmat"
5518 call matout(dimen,dimen,nres6,nres6,fricmat)
5523 if (nfgtasks.gt.1) then
5524 if (fg_rank.eq.0) then
5525 ! The matching BROADCAST for fg processors is called in ERGASTULUM
5531 call MPI_Bcast(10,1,MPI_INTEGER,king,FG_COMM,IERROR)
5533 time_Bcast=time_Bcast+MPI_Wtime()-time00
5535 time_Bcast=time_Bcast+tcpu()-time00
5537 ! print *,"Processor",myrank,
5538 ! & " BROADCAST iorder in SETUP_FRICMAT"
5541 write (iout,*) "setup_fricmat licznik"!,licznik !sp
5547 ! Scatter the friction matrix
5548 call MPI_Scatterv(fricmat(1,1),nginv_counts(0),&
5549 nginv_start(0),MPI_DOUBLE_PRECISION,fcopy(1,1),&
5550 myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR)
5553 time_scatter=time_scatter+MPI_Wtime()-time00
5554 time_scatter_fmat=time_scatter_fmat+MPI_Wtime()-time00
5556 time_scatter=time_scatter+tcpu()-time00
5557 time_scatter_fmat=time_scatter_fmat+tcpu()-time00
5561 do j=1,2*my_ng_count
5562 fricmat(j,i)=fcopy(i,j)
5565 ! write (iout,*) "My chunk of fricmat"
5566 ! call MATOUT2(my_ng_count,dimen,maxres2,maxres2,fcopy)
5570 end subroutine setup_fricmat
5571 !-----------------------------------------------------------------------------
5572 subroutine stochastic_force(stochforcvec)
5575 use random, only:anorm_distr
5576 ! implicit real*8 (a-h,o-z)
5577 ! include 'DIMENSIONS'
5578 use control, only: tcpu
5583 ! include 'COMMON.VAR'
5584 ! include 'COMMON.CHAIN'
5585 ! include 'COMMON.DERIV'
5586 ! include 'COMMON.GEO'
5587 ! include 'COMMON.LOCAL'
5588 ! include 'COMMON.INTERACT'
5589 ! include 'COMMON.MD'
5590 ! include 'COMMON.TIME1'
5592 ! include 'COMMON.LANGEVIN'
5594 ! include 'COMMON.LANGEVIN.lang0'
5596 ! include 'COMMON.IOUNITS'
5598 real(kind=8) :: x,sig,lowb,highb
5599 real(kind=8) :: ff(3),force(3,0:2*nres),zeta2,lowb2
5600 real(kind=8) :: highb2,sig2,forcvec(6*nres),stochforcvec(6*nres)
5601 real(kind=8) :: time00
5602 logical :: lprn = .false.
5603 integer :: i,j,ind,mnum
5607 stochforc(j,i)=0.0d0
5617 ! Compute the stochastic forces acting on bodies. Store in force.
5623 force(j,i)=anorm_distr(x,sig,lowb,highb)
5631 force(j,i+nres)=anorm_distr(x,sig2,lowb2,highb2)
5635 time_fsample=time_fsample+MPI_Wtime()-time00
5637 time_fsample=time_fsample+tcpu()-time00
5639 ! Compute the stochastic forces acting on virtual-bond vectors.
5645 stochforc(j,i)=ff(j)+0.5d0*force(j,i)
5648 ff(j)=ff(j)+force(j,i)
5650 ! if (itype(i+1,1).ne.ntyp1) then
5652 if (itype(i+1,mnum).ne.ntyp1_molec(mnum)) then
5654 stochforc(j,i)=stochforc(j,i)+force(j,i+nres+1)
5655 ff(j)=ff(j)+force(j,i+nres+1)
5660 stochforc(j,0)=ff(j)+force(j,nnt+nres)
5664 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5665 .and.(mnum.ne.5)) then
5666 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5668 stochforc(j,i+nres)=force(j,i+nres)
5674 stochforcvec(j)=stochforc(j,0)
5679 stochforcvec(ind+j)=stochforc(j,i)
5685 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5686 .and.(mnum.ne.5)) then
5687 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5689 stochforcvec(ind+j)=stochforc(j,i+nres)
5695 write (iout,*) "stochforcvec"
5697 write(iout,'(i5,e15.5)') i,stochforcvec(i)
5699 write(iout,*) "Stochastic forces backbone"
5701 write(iout,'(i5,3e15.5)') i,(stochforc(j,i),j=1,3)
5703 write(iout,*) "Stochastic forces side chain"
5705 write(iout,'(i5,3e15.5)') &
5706 i,(stochforc(j,i+nres),j=1,3)
5714 write (iout,*) i,ind
5716 forcvec(ind+j)=force(j,i)
5721 write (iout,*) i,ind
5723 forcvec(j+ind)=force(j,i+nres)
5728 write (iout,*) "forcvec"
5732 write (iout,'(2i3,2f10.5)') i,j,force(j,i),&
5739 write (iout,'(2i3,2f10.5)') i,j,force(j,i+nres),&
5748 end subroutine stochastic_force
5749 !-----------------------------------------------------------------------------
5750 subroutine sdarea(gamvec)
5752 ! Scale the friction coefficients according to solvent accessible surface areas
5753 ! Code adapted from TINKER
5757 ! implicit real*8 (a-h,o-z)
5758 ! include 'DIMENSIONS'
5759 ! include 'COMMON.CONTROL'
5760 ! include 'COMMON.VAR'
5761 ! include 'COMMON.MD'
5763 ! include 'COMMON.LANGEVIN'
5765 ! include 'COMMON.LANGEVIN.lang0'
5767 ! include 'COMMON.CHAIN'
5768 ! include 'COMMON.DERIV'
5769 ! include 'COMMON.GEO'
5770 ! include 'COMMON.LOCAL'
5771 ! include 'COMMON.INTERACT'
5772 ! include 'COMMON.IOUNITS'
5773 ! include 'COMMON.NAMES'
5774 real(kind=8),dimension(2*nres) :: radius,gamvec !(maxres2)
5775 real(kind=8),parameter :: twosix = 1.122462048309372981d0
5776 logical :: lprn = .false.
5777 real(kind=8) :: probe,area,ratio
5778 integer :: i,j,ind,iti,mnum
5780 ! determine new friction coefficients every few SD steps
5782 ! set the atomic radii to estimates of sigma values
5784 ! print *,"Entered sdarea"
5790 ! Load peptide group radii
5793 radius(i)=pstok(mnum)
5795 ! Load side chain radii
5799 radius(i+nres)=restok(iti,mnum)
5802 ! write (iout,*) "i",i," radius",radius(i)
5805 radius(i) = radius(i) / twosix
5806 if (radius(i) .ne. 0.0d0) radius(i) = radius(i) + probe
5809 ! scale atomic friction coefficients by accessible area
5811 if (lprn) write (iout,*) &
5812 "Original gammas, surface areas, scaling factors, new gammas, ",&
5813 "std's of stochastic forces"
5816 if (radius(i).gt.0.0d0) then
5817 call surfatom (i,area,radius)
5818 ratio = dmax1(area/(4.0d0*pi*radius(i)**2),1.0d-1)
5819 if (lprn) write (iout,'(i5,3f10.5,$)') &
5820 i,gamvec(ind+1),area,ratio
5823 gamvec(ind) = ratio * gamvec(ind)
5826 stdforcp(i)=stdfp(mnum)*dsqrt(gamvec(ind))
5827 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcp(i)
5831 if (radius(i+nres).gt.0.0d0) then
5832 call surfatom (i+nres,area,radius)
5833 ratio = dmax1(area/(4.0d0*pi*radius(i+nres)**2),1.0d-1)
5834 if (lprn) write (iout,'(i5,3f10.5,$)') &
5835 i,gamvec(ind+1),area,ratio
5838 gamvec(ind) = ratio * gamvec(ind)
5841 stdforcsc(i)=stdfsc(itype(i,mnum),mnum)*dsqrt(gamvec(ind))
5842 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcsc(i)
5847 end subroutine sdarea
5848 !-----------------------------------------------------------------------------
5850 !-----------------------------------------------------------------------------
5853 ! ###################################################
5854 ! ## COPYRIGHT (C) 1996 by Jay William Ponder ##
5855 ! ## All Rights Reserved ##
5856 ! ###################################################
5858 ! ################################################################
5860 ! ## subroutine surfatom -- exposed surface area of an atom ##
5862 ! ################################################################
5865 ! "surfatom" performs an analytical computation of the surface
5866 ! area of a specified atom; a simplified version of "surface"
5868 ! literature references:
5870 ! T. J. Richmond, "Solvent Accessible Surface Area and
5871 ! Excluded Volume in Proteins", Journal of Molecular Biology,
5874 ! L. Wesson and D. Eisenberg, "Atomic Solvation Parameters
5875 ! Applied to Molecular Dynamics of Proteins in Solution",
5876 ! Protein Science, 1, 227-235 (1992)
5878 ! variables and parameters:
5880 ! ir number of atom for which area is desired
5881 ! area accessible surface area of the atom
5882 ! radius radii of each of the individual atoms
5885 subroutine surfatom(ir,area,radius)
5887 ! implicit real*8 (a-h,o-z)
5888 ! include 'DIMENSIONS'
5890 ! include 'COMMON.GEO'
5891 ! include 'COMMON.IOUNITS'
5893 integer :: nsup,nstart_sup
5894 ! double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm
5895 ! common /chain/ c(3,maxres2+2),dc(3,0:maxres2),dc_old(3,0:maxres2),
5896 ! & xloc(3,maxres),xrot(3,maxres),dc_norm(3,0:maxres2),
5897 ! & dc_work(MAXRES6),nres,nres0
5898 integer,parameter :: maxarc=300
5902 integer :: mi,ni,narc
5903 integer :: key(maxarc)
5904 integer :: intag(maxarc)
5905 integer :: intag1(maxarc)
5906 real(kind=8) :: area,arcsum
5907 real(kind=8) :: arclen,exang
5908 real(kind=8) :: delta,delta2
5909 real(kind=8) :: eps,rmove
5910 real(kind=8) :: xr,yr,zr
5911 real(kind=8) :: rr,rrsq
5912 real(kind=8) :: rplus,rminus
5913 real(kind=8) :: axx,axy,axz
5914 real(kind=8) :: ayx,ayy
5915 real(kind=8) :: azx,azy,azz
5916 real(kind=8) :: uxj,uyj,uzj
5917 real(kind=8) :: tx,ty,tz
5918 real(kind=8) :: txb,tyb,td
5919 real(kind=8) :: tr2,tr,txr,tyr
5920 real(kind=8) :: tk1,tk2
5921 real(kind=8) :: thec,the,t,tb
5922 real(kind=8) :: txk,tyk,tzk
5923 real(kind=8) :: t1,ti,tf,tt
5924 real(kind=8) :: txj,tyj,tzj
5925 real(kind=8) :: ccsq,cc,xysq
5926 real(kind=8) :: bsqk,bk,cosine
5927 real(kind=8) :: dsqj,gi,pix2
5928 real(kind=8) :: therk,dk,gk
5929 real(kind=8) :: risqk,rik
5930 real(kind=8) :: radius(2*nres) !(maxatm) (maxatm=maxres2)
5931 real(kind=8) :: ri(maxarc),risq(maxarc)
5932 real(kind=8) :: ux(maxarc),uy(maxarc),uz(maxarc)
5933 real(kind=8) :: xc(maxarc),yc(maxarc),zc(maxarc)
5934 real(kind=8) :: xc1(maxarc),yc1(maxarc),zc1(maxarc)
5935 real(kind=8) :: dsq(maxarc),bsq(maxarc)
5936 real(kind=8) :: dsq1(maxarc),bsq1(maxarc)
5937 real(kind=8) :: arci(maxarc),arcf(maxarc)
5938 real(kind=8) :: ex(maxarc),lt(maxarc),gr(maxarc)
5939 real(kind=8) :: b(maxarc),b1(maxarc),bg(maxarc)
5940 real(kind=8) :: kent(maxarc),kout(maxarc)
5941 real(kind=8) :: ther(maxarc)
5942 logical :: moved,top
5943 logical :: omit(maxarc)
5946 ! maxatm = 2*nres !maxres2 maxres2=2*maxres
5947 ! maxlight = 8*maxatm
5950 ! maxtors = 4*maxatm
5952 ! zero out the surface area for the sphere of interest
5955 ! write (2,*) "ir",ir," radius",radius(ir)
5956 if (radius(ir) .eq. 0.0d0) return
5958 ! set the overlap significance and connectivity shift
5962 delta2 = delta * delta
5967 ! store coordinates and radius of the sphere of interest
5975 ! initialize values of some counters and summations
5984 ! test each sphere to see if it overlaps the sphere of interest
5987 if (i.eq.ir .or. radius(i).eq.0.0d0) goto 30
5988 rplus = rr + radius(i)
5990 if (abs(tx) .ge. rplus) goto 30
5992 if (abs(ty) .ge. rplus) goto 30
5994 if (abs(tz) .ge. rplus) goto 30
5996 ! check for sphere overlap by testing distance against radii
5998 xysq = tx*tx + ty*ty
5999 if (xysq .lt. delta2) then
6006 if (rplus-cc .le. delta) goto 30
6007 rminus = rr - radius(i)
6009 ! check to see if sphere of interest is completely buried
6011 if (cc-abs(rminus) .le. delta) then
6012 if (rminus .le. 0.0d0) goto 170
6016 ! check for too many overlaps with sphere of interest
6018 if (io .ge. maxarc) then
6020 20 format (/,' SURFATOM -- Increase the Value of MAXARC')
6024 ! get overlap between current sphere and sphere of interest
6033 gr(io) = (ccsq+rplus*rminus) / (2.0d0*rr*b1(io))
6039 ! case where no other spheres overlap the sphere of interest
6042 area = 4.0d0 * pi * rrsq
6046 ! case where only one sphere overlaps the sphere of interest
6049 area = pix2 * (1.0d0 + gr(1))
6050 area = mod(area,4.0d0*pi) * rrsq
6054 ! case where many spheres intersect the sphere of interest;
6055 ! sort the intersecting spheres by their degree of overlap
6057 call sort2 (io,gr,key)
6060 intag(i) = intag1(k)
6069 ! get radius of each overlap circle on surface of the sphere
6074 risq(i) = rrsq - gi*gi
6075 ri(i) = sqrt(risq(i))
6076 ther(i) = 0.5d0*pi - asin(min(1.0d0,max(-1.0d0,gr(i))))
6079 ! find boundary of inaccessible area on sphere of interest
6082 if (.not. omit(k)) then
6089 ! check to see if J circle is intersecting K circle;
6090 ! get distance between circle centers and sum of radii
6093 if (omit(j)) goto 60
6094 cc = (txk*xc(j)+tyk*yc(j)+tzk*zc(j))/(bk*b(j))
6095 cc = acos(min(1.0d0,max(-1.0d0,cc)))
6096 td = therk + ther(j)
6098 ! check to see if circles enclose separate regions
6100 if (cc .ge. td) goto 60
6102 ! check for circle J completely inside circle K
6104 if (cc+ther(j) .lt. therk) goto 40
6106 ! check for circles that are essentially parallel
6108 if (cc .gt. delta) goto 50
6113 ! check to see if sphere of interest is completely buried
6116 if (pix2-cc .le. td) goto 170
6122 ! find T value of circle intersections
6125 if (omit(k)) goto 110
6140 ! rotation matrix elements
6152 if (.not. omit(j)) then
6157 ! rotate spheres so K vector colinear with z-axis
6159 uxj = txj*axx + tyj*axy - tzj*axz
6160 uyj = tyj*ayy - txj*ayx
6161 uzj = txj*azx + tyj*azy + tzj*azz
6162 cosine = min(1.0d0,max(-1.0d0,uzj/b(j)))
6163 if (acos(cosine) .lt. therk+ther(j)) then
6164 dsqj = uxj*uxj + uyj*uyj
6169 tr2 = risqk*dsqj - tb*tb
6175 ! get T values of intersection for K circle
6178 tb = min(1.0d0,max(-1.0d0,tb))
6180 if (tyb-txr .lt. 0.0d0) tk1 = pix2 - tk1
6182 tb = min(1.0d0,max(-1.0d0,tb))
6184 if (tyb+txr .lt. 0.0d0) tk2 = pix2 - tk2
6185 thec = (rrsq*uzj-gk*bg(j)) / (rik*ri(j)*b(j))
6186 if (abs(thec) .lt. 1.0d0) then
6188 else if (thec .ge. 1.0d0) then
6190 else if (thec .le. -1.0d0) then
6194 ! see if "tk1" is entry or exit point; check t=0 point;
6195 ! "ti" is exit point, "tf" is entry point
6197 cosine = min(1.0d0,max(-1.0d0, &
6198 (uzj*gk-uxj*rik)/(b(j)*rr)))
6199 if ((acos(cosine)-ther(j))*(tk2-tk1) .le. 0.0d0) then
6207 if (narc .ge. maxarc) then
6209 70 format (/,' SURFATOM -- Increase the Value',&
6213 if (tf .le. ti) then
6234 ! special case; K circle without intersections
6236 if (narc .le. 0) goto 90
6238 ! general case; sum up arclength and set connectivity code
6240 call sort2 (narc,arci,key)
6245 if (narc .gt. 1) then
6248 if (t .lt. arci(j)) then
6249 arcsum = arcsum + arci(j) - t
6250 exang = exang + ex(ni)
6252 if (jb .ge. maxarc) then
6254 80 format (/,' SURFATOM -- Increase the Value',&
6259 kent(jb) = maxarc*i + k
6261 kout(jb) = maxarc*k + i
6270 arcsum = arcsum + pix2 - t
6272 exang = exang + ex(ni)
6275 kent(jb) = maxarc*i + k
6277 kout(jb) = maxarc*k + i
6284 arclen = arclen + gr(k)*arcsum
6287 if (arclen .eq. 0.0d0) goto 170
6288 if (jb .eq. 0) goto 150
6290 ! find number of independent boundaries and check connectivity
6294 if (kout(k) .ne. 0) then
6301 if (m .eq. kent(ii)) then
6304 if (j .eq. jb) goto 150
6316 ! attempt to fix connectivity error by moving atom slightly
6320 140 format (/,' SURFATOM -- Connectivity Error at Atom',i6)
6329 ! compute the exposed surface area for the sphere of interest
6332 area = ib*pix2 + exang + arclen
6333 area = mod(area,4.0d0*pi) * rrsq
6335 ! attempt to fix negative area by moving atom slightly
6337 if (area .lt. 0.0d0) then
6340 160 format (/,' SURFATOM -- Negative Area at Atom',i6)
6351 end subroutine surfatom
6352 !----------------------------------------------------------------
6353 !----------------------------------------------------------------
6354 subroutine alloc_MD_arrays
6355 !EL Allocation of arrays used by MD module
6357 integer :: nres2,nres6
6360 !----------------------
6364 allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
6365 allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
6366 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
6367 allocate(fricvec(nres2,nres2))
6368 allocate(pfric_mat(nres2,nres2),vfric_mat(nres2,nres2))
6369 allocate(afric_mat(nres2,nres2),prand_mat(nres2,nres2))
6370 allocate(vrand_mat1(nres2,nres2),vrand_mat2(nres2,nres2)) !(MAXRES2,MAXRES2)
6371 allocate(pfric0_mat(nres2,nres2,0:maxflag_stoch))
6372 allocate(afric0_mat(nres2,nres2,0:maxflag_stoch))
6373 allocate(vfric0_mat(nres2,nres2,0:maxflag_stoch))
6374 allocate(prand0_mat(nres2,nres2,0:maxflag_stoch))
6375 allocate(vrand0_mat1(nres2,nres2,0:maxflag_stoch))
6376 allocate(vrand0_mat2(nres2,nres2,0:maxflag_stoch)) !(MAXRES2,MAXRES2,0:maxflag_stoch)
6377 allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
6379 allocate(mt1(nres2,nres2),mt2(nres2,nres2),mt3(nres2,nres2)) !(maxres2,maxres2)
6380 !----------------------
6382 ! commom.langevin.lang0
6384 allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
6385 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
6386 allocate(fricvec(nres2,nres2)) !(MAXRES2,MAXRES2)
6387 allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
6388 allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
6391 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2))
6392 !----------------------
6393 ! commom.hairpin in CSA module
6394 !----------------------
6395 ! common.mce in MCM_MD module
6396 !----------------------
6398 ! common /mdgrad/ in module.energy
6399 ! common /back_constr/ in module.energy
6400 ! common /qmeas/ in module.energy
6403 allocate(potEcomp(0:n_ene+4)) !(0:n_ene+4)
6405 allocate(d_t(3,0:nres2),d_a(3,0:nres2),d_t_old(3,0:nres2)) !(3,0:MAXRES2)
6406 allocate(d_a_work(nres6)) !(6*MAXRES)
6408 allocate(DM(nres2),DU1(nres2),DU2(nres2))
6409 allocate(DMorig(nres2),DU1orig(nres2),DU2orig(nres2))
6411 write (iout,*) "Before A Allocation",nfgtasks-1
6413 allocate(Gmat(nres2,nres2),A(nres2,nres2))
6414 if(.not.allocated(Ginv)) allocate(Ginv(nres2,nres2)) !in control: ergastulum
6415 allocate(Gsqrp(nres2,nres2),Gsqrm(nres2,nres2),Gvec(nres2,nres2)) !(maxres2,maxres2)
6417 allocate(Geigen(nres2)) !(maxres2)
6418 if(.not.allocated(vtot)) allocate(vtot(nres2)) !(maxres2)
6419 ! common /inertia/ in io_conf: parmread
6420 ! real(kind=8),dimension(:),allocatable :: ISC,msc !(ntyp+1)
6421 ! common /langevin/in io read_MDpar
6422 ! real(kind=8),dimension(:),allocatable :: gamsc !(ntyp1)
6423 ! real(kind=8),dimension(:),allocatable :: stdfsc !(ntyp)
6424 ! in io_conf: parmread
6425 ! real(kind=8),dimension(:),allocatable :: restok !(ntyp+1)
6426 ! common /mdpmpi/ in control: ergastulum
6427 if(.not.allocated(ng_start)) allocate(ng_start(0:nfgtasks-1))
6428 if(.not.allocated(ng_counts)) allocate(ng_counts(0:nfgtasks-1))
6429 if(.not.allocated(nginv_counts)) allocate(nginv_counts(0:nfgtasks-1)) !(0:MaxProcs-1)
6430 if(.not.allocated(nginv_start)) allocate(nginv_start(0:nfgtasks)) !(0:MaxProcs)
6431 !----------------------
6432 ! common.muca in read_muca
6433 ! common /double_muca/
6434 ! real(kind=8) :: elow,ehigh,factor,hbin,factor_min
6435 ! real(kind=8),dimension(:),allocatable :: emuca,nemuca,&
6436 ! nemuca2,hist !(4*maxres)
6437 ! common /integer_muca/
6438 ! integer :: nmuca,imtime,muca_smooth
6440 ! real(kind=8),dimension(:),allocatable :: elowi,ehighi !(maxprocs)
6441 !----------------------
6443 ! common /mdgrad/ in module.energy
6444 ! common /back_constr/ in module.energy
6445 ! common /qmeas/ in module.energy
6449 allocate(d_t_work(nres6),d_t_work_new(nres6),d_af_work(nres6))
6450 allocate(d_as_work(nres6),kinetic_force(nres6)) !(MAXRES6)
6451 allocate(d_t_new(3,0:nres2),d_a_old(3,0:nres2),d_a_short(3,0:nres2)) !,d_a !(3,0:MAXRES2)
6452 allocate(stdforcp(nres),stdforcsc(nres)) !(MAXRES)
6453 !----------------------
6455 allocate(D_ban(nres6)) !(MAXRES6) maxres6=6*maxres
6456 ! common /stochcalc/ stochforcvec
6457 allocate(stochforcvec(nres6)) !(MAXRES6) maxres6=6*maxres
6458 !----------------------
6460 end subroutine alloc_MD_arrays
6461 !-----------------------------------------------------------------------------
6462 !-----------------------------------------------------------------------------