2 !-----------------------------------------------------------------------------
15 !-----------------------------------------------------------------------------
17 ! common /mdgrad/ in module.energy
18 ! common /back_constr/ in module.energy
19 ! common /qmeas/ in module.energy
23 real(kind=8),dimension(:),allocatable :: d_t_work,&
24 d_t_work_new,d_af_work,d_as_work,kinetic_force !(MAXRES6)
25 real(kind=8),dimension(:,:),allocatable :: d_t_new,&
26 d_a_old,d_a_short!,d_a !(3,0:MAXRES2)
27 ! real(kind=8),dimension(:),allocatable :: d_a_work !(6*MAXRES)
28 ! real(kind=8),dimension(:,:),allocatable :: Gmat,Ginv,A,&
29 ! Gsqrp,Gsqrm,Gvec !(maxres2,maxres2)
30 ! real(kind=8),dimension(:),allocatable :: Geigen !(maxres2)
31 ! integer :: dimen,dimen1,dimen3
32 ! integer :: lang,count_reset_moment,count_reset_vel
33 ! logical :: reset_moment,reset_vel,rattle,RESPA
36 ! real(kind=8) :: rwat,etawat,stdfp,cPoise
37 ! real(kind=8),dimension(:),allocatable :: gamsc !(ntyp1)
38 ! real(kind=8),dimension(:),allocatable :: stdfsc !(ntyp)
39 real(kind=8),dimension(:),allocatable :: stdforcp,stdforcsc !(MAXRES)
40 !-----------------------------------------------------------------------------
44 ! ###################################################
45 ! ## COPYRIGHT (C) 1992 by Jay William Ponder ##
46 ! ## All Rights Reserved ##
47 ! ###################################################
49 ! #############################################################
51 ! ## sizes.i -- parameter values to set array dimensions ##
53 ! #############################################################
56 ! "sizes.i" sets values for critical array dimensions used
57 ! throughout the software; these parameters will fix the size
58 ! of the largest systems that can be handled; values too large
59 ! for the computer's memory and/or swap space to accomodate
60 ! will result in poor performance or outright failure
62 ! parameter: maximum allowed number of:
64 ! maxatm atoms in the molecular system
65 ! maxval atoms directly bonded to an atom
66 ! maxgrp ! user-defined groups of atoms
67 ! maxtyp force field atom type definitions
68 ! maxclass force field atom class definitions
69 ! maxkey lines in the keyword file
70 ! maxrot bonds for torsional rotation
71 ! maxvar optimization variables (vector storage)
72 ! maxopt optimization variables (matrix storage)
73 ! maxhess off-diagonal Hessian elements
74 ! maxlight sites for method of lights neighbors
75 ! maxvib vibrational frequencies
76 ! maxgeo distance geometry points
77 ! maxcell unit cells in replicated crystal
78 ! maxring 3-, 4-, or 5-membered rings
79 ! maxfix geometric restraints
80 ! maxbio biopolymer atom definitions
81 ! maxres residues in the macromolecule
82 ! maxamino amino acid residue types
83 ! maxnuc nucleic acid residue types
84 ! maxbnd covalent bonds in molecular system
85 ! maxang bond angles in molecular system
86 ! maxtors torsional angles in molecular system
87 ! maxpi atoms in conjugated pisystem
88 ! maxpib covalent bonds involving pisystem
89 ! maxpit torsional angles involving pisystem
92 !el integer maxatm,maxval,maxgrp
93 !el integer maxtyp,maxclass,maxkey
94 !el integer maxrot,maxopt
95 !el integer maxhess,maxlight,maxvib
96 !el integer maxgeo,maxcell,maxring
97 !el integer maxfix,maxbio
98 !el integer maxamino,maxnuc,maxbnd
99 !el integer maxang,maxtors,maxpi
100 !el integer maxpib,maxpit
101 ! integer :: maxatm !=2*nres !maxres2 maxres2=2*maxres
102 ! integer,parameter :: maxval=8
103 ! integer,parameter :: maxgrp=1000
104 ! integer,parameter :: maxtyp=3000
105 ! integer,parameter :: maxclass=500
106 ! integer,parameter :: maxkey=10000
107 ! integer,parameter :: maxrot=1000
108 ! integer,parameter :: maxopt=1000
109 ! integer,parameter :: maxhess=1000000
110 ! integer :: maxlight !=8*maxatm
111 ! integer,parameter :: maxvib=1000
112 ! integer,parameter :: maxgeo=1000
113 ! integer,parameter :: maxcell=10000
114 ! integer,parameter :: maxring=10000
115 ! integer,parameter :: maxfix=10000
116 ! integer,parameter :: maxbio=10000
117 ! integer,parameter :: maxamino=31
118 ! integer,parameter :: maxnuc=12
119 ! integer :: maxbnd !=2*maxatm
120 ! integer :: maxang !=3*maxatm
121 ! integer :: maxtors !=4*maxatm
122 ! integer,parameter :: maxpi=100
123 ! integer,parameter :: maxpib=2*maxpi
124 ! integer,parameter :: maxpit=4*maxpi
125 !-----------------------------------------------------------------------------
126 ! Maximum number of seed
127 ! integer,parameter :: max_seed=1
128 !-----------------------------------------------------------------------------
129 real(kind=8),dimension(:),allocatable :: stochforcvec !(MAXRES6) maxres6=6*maxres
130 ! common /stochcalc/ stochforcvec
131 !-----------------------------------------------------------------------------
132 ! common /przechowalnia/ subroutines: rattle1,rattle2,rattle_brown
133 real(kind=8),dimension(:,:),allocatable :: GGinv !(2*nres,2*nres) maxres2=2*maxres
134 real(kind=8),dimension(:,:,:),allocatable :: gdc !(3,2*nres,2*nres) maxres2=2*maxres
135 real(kind=8),dimension(:,:),allocatable :: Cmat !(2*nres,2*nres) maxres2=2*maxres
136 !-----------------------------------------------------------------------------
137 ! common /syfek/ subroutines: friction_force,setup_fricmat
138 !el real(kind=8),dimension(:),allocatable :: gamvec !(MAXRES6) or (MAXRES2)
139 !-----------------------------------------------------------------------------
140 ! common /przechowalnia/ subroutines: friction_force,setup_fricmat
141 real(kind=8),dimension(:,:),allocatable :: ginvfric !(2*nres,2*nres) !maxres2=2*maxres
142 !-----------------------------------------------------------------------------
143 ! common /przechowalnia/ subroutine: setup_fricmat
144 real(kind=8),dimension(:,:),allocatable :: fcopy !(2*nres,2*nres)
145 !-----------------------------------------------------------------------------
148 !-----------------------------------------------------------------------------
150 !-----------------------------------------------------------------------------
152 !-----------------------------------------------------------------------------
153 subroutine brown_step(itime)
154 !------------------------------------------------
155 ! Perform a single Euler integration step of Brownian dynamics
156 !------------------------------------------------
157 ! implicit real*8 (a-h,o-z)
159 use control, only: tcpu
162 ! use io_conf, only:cartprint
163 ! include 'DIMENSIONS'
167 ! include 'COMMON.CONTROL'
168 ! include 'COMMON.VAR'
169 ! include 'COMMON.MD'
171 ! include 'COMMON.LANGEVIN'
173 ! include 'COMMON.LANGEVIN.lang0'
175 ! include 'COMMON.CHAIN'
176 ! include 'COMMON.DERIV'
177 ! include 'COMMON.GEO'
178 ! include 'COMMON.LOCAL'
179 ! include 'COMMON.INTERACT'
180 ! include 'COMMON.IOUNITS'
181 ! include 'COMMON.NAMES'
182 ! include 'COMMON.TIME1'
183 real(kind=8),dimension(6*nres) :: zapas !(MAXRES6) maxres6=6*maxres
184 integer :: rstcount !ilen,
186 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
187 real(kind=8),dimension(6*nres,2*nres) :: Bmat,GBmat,Tmat !(MAXRES6,MAXRES2) (maxres2=2*maxres,maxres6=6*maxres)
188 real(kind=8),dimension(2*nres,2*nres) :: Cmat_,Cinv !(maxres2,maxres2) maxres2=2*maxres
189 real(kind=8),dimension(6*nres,6*nres) :: Pmat !(maxres6,maxres6) maxres6=6*maxres
190 ! real(kind=8),dimension(:,:),allocatable :: Bmat,GBmat,Tmat !(MAXRES6,MAXRES2) (maxres2=2*maxres,maxres6=6*maxres)
191 ! real(kind=8),dimension(:,:),allocatable :: Cmat_,Cinv !(maxres2,maxres2) maxres2=2*maxres
192 ! real(kind=8),dimension(:,:),allocatable :: Pmat !(maxres6,maxres6) maxres6=6*maxres
193 real(kind=8),dimension(6*nres) :: Td !(maxres6) maxres6=6*maxres
194 real(kind=8),dimension(2*nres) :: ppvec !(maxres2) maxres2=2*maxres
195 !el common /stochcalc/ stochforcvec
196 !el real(kind=8),dimension(3) :: cm !el
197 !el common /gucio/ cm
199 logical :: lprn = .false.,lprn1 = .false.
200 integer :: maxiter = 5
201 real(kind=8) :: difftol = 1.0d-5
202 real(kind=8) :: xx,diffmax,blen2,diffbond,tt0
203 integer :: i,j,nbond,k,ind,ind1,iter
204 integer :: nres2,nres6
208 ! if (.not.allocated(Bmat)) allocate(Bmat(nres6,nres2))
209 ! if (.not.allocated(GBmat)) allocate (GBmat(nres6,nres2))
210 ! if (.not.allocated(Tmat)) allocate (Tmat(nres6,nres2))
211 ! if (.not.allocated(Cmat_)) allocate(Cmat_(nres2,nres2))
212 ! if (.not.allocated(Cinv)) allocate (Cinv(nres2,nres2))
213 ! if (.not.allocated(Pmat)) allocate(Pmat(6*nres,6*nres))
215 if (.not.allocated(stochforcvec)) allocate(stochforcvec(nres6)) !(MAXRES6) maxres6=6*maxres
219 if (itype(i,1).ne.10) nbond=nbond+1
223 write (iout,*) "Generalized inverse of fricmat"
224 call matout(dimen,dimen,nres6,nres6,fricmat)
236 Bmat(ind+j,ind1)=dC_norm(j,i)
241 if (itype(i,1).ne.10) then
244 Bmat(ind+j,ind1)=dC_norm(j,i+nres)
250 write (iout,*) "Matrix Bmat"
251 call MATOUT(nbond,dimen,nres6,nres6,Bmat)
257 GBmat(i,j)=GBmat(i,j)+fricmat(i,k)*Bmat(k,j)
262 write (iout,*) "Matrix GBmat"
263 call MATOUT(nbond,dimen,nres6,nres2,Gbmat)
269 Cmat_(i,j)=Cmat_(i,j)+Bmat(k,i)*GBmat(k,j)
274 write (iout,*) "Matrix Cmat"
275 call MATOUT(nbond,nbond,nres2,nres2,Cmat_)
277 call matinvert(nbond,nres2,Cmat_,Cinv,osob)
279 write (iout,*) "Matrix Cinv"
280 call MATOUT(nbond,nbond,nres2,nres2,Cinv)
286 Tmat(i,j)=Tmat(i,j)+GBmat(i,k)*Cinv(k,j)
291 write (iout,*) "Matrix Tmat"
292 call MATOUT(nbond,dimen,nres6,nres2,Tmat)
302 Pmat(i,j)=Pmat(i,j)-Tmat(i,k)*Bmat(j,k)
307 write (iout,*) "Matrix Pmat"
308 call MATOUT(dimen,dimen,nres6,nres6,Pmat)
315 Td(i)=Td(i)+vbl*Tmat(i,ind)
318 if (itype(k,1).ne.10) then
320 Td(i)=Td(i)+vbldsc0(1,itype(k,1))*Tmat(i,ind)
325 write (iout,*) "Vector Td"
327 write (iout,'(i5,f10.5)') i,Td(i)
330 call stochastic_force(stochforcvec)
332 write (iout,*) "stochforcvec"
334 write (iout,*) i,stochforcvec(i)
338 zapas(j)=-gcart(j,0)+stochforcvec(j)
340 dC_work(j)=dC_old(j,0)
346 zapas(ind)=-gcart(j,i)+stochforcvec(ind)
347 dC_work(ind)=dC_old(j,i)
351 if (itype(i,1).ne.10) then
354 zapas(ind)=-gxcart(j,i)+stochforcvec(ind)
355 dC_work(ind)=dC_old(j,i+nres)
361 write (iout,*) "Initial d_t_work"
363 write (iout,*) i,d_t_work(i)
370 d_t_work(i)=d_t_work(i)+fricmat(i,j)*zapas(j)
377 zapas(i)=zapas(i)+Pmat(i,j)*(dC_work(j)+d_t_work(j)*d_time)
381 write (iout,*) "Final d_t_work and zapas"
383 write (iout,*) i,d_t_work(i),zapas(i)
397 dc_work(ind+j)=dc(j,i)
403 d_t(j,i+nres)=d_t_work(ind+j)
404 dc(j,i+nres)=zapas(ind+j)
405 dc_work(ind+j)=dc(j,i+nres)
411 write (iout,*) "Before correction for rotational lengthening"
412 write (iout,*) "New coordinates",&
413 " and differences between actual and standard bond lengths"
418 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
422 if (itype(i,1).ne.10) then
424 xx=vbld(i+nres)-vbldsc0(1,itype(i,1))
425 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
426 i,(dC(j,i+nres),j=1,3),xx
430 ! Second correction (rotational lengthening)
436 blen2 = scalar(dc(1,i),dc(1,i))
437 ppvec(ind)=2*vbl**2-blen2
438 diffbond=dabs(vbl-dsqrt(blen2))
439 if (diffbond.gt.diffmax) diffmax=diffbond
440 if (ppvec(ind).gt.0.0d0) then
441 ppvec(ind)=dsqrt(ppvec(ind))
446 write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind)
450 if (itype(i,1).ne.10) then
452 blen2 = scalar(dc(1,i+nres),dc(1,i+nres))
453 ppvec(ind)=2*vbldsc0(1,itype(i,1))**2-blen2
454 diffbond=dabs(vbldsc0(1,itype(i,1))-dsqrt(blen2))
455 if (diffbond.gt.diffmax) diffmax=diffbond
456 if (ppvec(ind).gt.0.0d0) then
457 ppvec(ind)=dsqrt(ppvec(ind))
462 write (iout,'(i5,3f10.5)') ind,diffbond,ppvec(ind)
466 if (lprn) write (iout,*) "iter",iter," diffmax",diffmax
467 if (diffmax.lt.difftol) goto 10
471 Td(i)=Td(i)+ppvec(j)*Tmat(i,j)
477 zapas(i)=zapas(i)+Pmat(i,j)*dc_work(j)
488 dc_work(ind+j)=zapas(ind+j)
493 if (itype(i,1).ne.10) then
495 dc(j,i+nres)=zapas(ind+j)
496 dc_work(ind+j)=zapas(ind+j)
501 ! Building the chain from the newly calculated coordinates
504 if (large.and. mod(itime,ntwe).eq.0) then
505 write (iout,*) "Cartesian and internal coordinates: step 1"
508 write (iout,'(a)') "Potential forces"
510 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(-gcart(j,i),j=1,3),&
513 write (iout,'(a)') "Stochastic forces"
515 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(stochforc(j,i),j=1,3),&
516 (stochforc(j,i+nres),j=1,3)
518 write (iout,'(a)') "Velocities"
520 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
521 (d_t(j,i+nres),j=1,3)
526 write (iout,*) "After correction for rotational lengthening"
527 write (iout,*) "New coordinates",&
528 " and differences between actual and standard bond lengths"
533 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
537 if (itype(i,1).ne.10) then
539 xx=vbld(i+nres)-vbldsc0(1,itype(i,1))
540 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
541 i,(dC(j,i+nres),j=1,3),xx
546 ! write (iout,*) "Too many attempts at correcting the bonds"
554 ! Calculate energy and forces
556 call etotal(potEcomp)
557 potE=potEcomp(0)-potEcomp(20)
561 ! Calculate the kinetic and total energy and the kinetic temperature
564 t_enegrad=t_enegrad+MPI_Wtime()-tt0
566 t_enegrad=t_enegrad+tcpu()-tt0
569 kinetic_T=2.0d0/(dimen*Rb)*EK
571 end subroutine brown_step
572 !-----------------------------------------------------------------------------
574 !-----------------------------------------------------------------------------
575 subroutine gauss(RO,AP,MT,M,N,*)
577 ! CALCULATES (RO**(-1))*AP BY GAUSS ELIMINATION
578 ! RO IS A SQUARE MATRIX
579 ! THE CALCULATED PRODUCT IS STORED IN AP
580 ! ABNORMAL EXIT IF RO IS SINGULAR
582 integer :: MT, M, N, M1,I,J,IM,&
584 real(kind=8) :: RO(MT,M),AP(MT,N),X,RM,PR,Y
590 if(dabs(X).le.1.0D-13) return 1
602 if(DABS(RO(J,I)).LE.RM) goto 2
616 if(dabs(X).le.1.0E-13) return 1
625 8 AP(J,K)=AP(J,K)-Y*AP(I,K)
627 9 RO(J,K)=RO(J,K)-Y*RO(I,K)
631 if(dabs(X).le.1.0E-13) return 1
641 15 X=X-AP(K,J)*RO(MI,K)
646 !-----------------------------------------------------------------------------
648 !-----------------------------------------------------------------------------
649 subroutine kinetic(KE_total)
650 !----------------------------------------------------------------
651 ! This subroutine calculates the total kinetic energy of the chain
652 !-----------------------------------------------------------------
654 ! implicit real*8 (a-h,o-z)
655 ! include 'DIMENSIONS'
656 ! include 'COMMON.VAR'
657 ! include 'COMMON.CHAIN'
658 ! include 'COMMON.DERIV'
659 ! include 'COMMON.GEO'
660 ! include 'COMMON.LOCAL'
661 ! include 'COMMON.INTERACT'
662 ! include 'COMMON.MD'
663 ! include 'COMMON.IOUNITS'
664 real(kind=8) :: KE_total,mscab
666 integer :: i,j,k,iti,mnum
667 real(kind=8) :: KEt_p,KEt_sc,KEr_p,KEr_sc,incr(3),&
670 write (iout,*) "Velocities, kietic"
672 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
673 (d_t(j,i+nres),j=1,3)
678 ! write (iout,*) "ISC",(isc(itype(i,1)),i=1,nres)
679 ! The translational part for peptide virtual bonds
685 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
686 ! write (iout,*) "Kinetic trp:",i,(incr(j),j=1,3)
688 v(j)=incr(j)+0.5d0*d_t(j,i)
690 vtot(i)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3)
691 KEt_p=KEt_p+mp(mnum)*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))
693 incr(j)=incr(j)+d_t(j,i)
696 ! write(iout,*) 'KEt_p', KEt_p
697 ! The translational part for the side chain virtual bond
698 ! Only now we can initialize incr with zeros. It must be equal
699 ! to the velocities of the first Calpha.
705 iti=iabs(itype(i,mnum))
711 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
712 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
713 .or.(mnum.eq.5)) then
719 v(j)=incr(j)+d_t(j,nres+i)
722 ! write (iout,*) "Kinetic trsc:",i,(incr(j),j=1,3)
723 ! write (iout,*) "i",i," msc",msc(iti)," v",(v(j),j=1,3)
724 KEt_sc=KEt_sc+mscab*(v(1)*v(1)+v(2)*v(2)+v(3)*v(3))
725 vtot(i+nres)=v(1)*v(1)+v(2)*v(2)+v(3)*v(3)
727 incr(j)=incr(j)+d_t(j,i)
731 ! write(iout,*) 'KEt_sc', KEt_sc
732 ! The part due to stretching and rotation of the peptide groups
736 ! write (iout,*) "i",i
737 ! write (iout,*) "i",i," mag1",mag1," mag2",mag2
741 ! write (iout,*) "Kinetic rotp:",i,(incr(j),j=1,3)
742 KEr_p=KEr_p+Ip(mnum)*(incr(1)*incr(1)+incr(2)*incr(2) &
746 ! write(iout,*) 'KEr_p', KEr_p
747 ! The rotational part of the side chain virtual bond
751 iti=iabs(itype(i,mnum))
752 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
753 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
754 .and.(mnum.ne.5)) then
756 incr(j)=d_t(j,nres+i)
758 ! write (iout,*) "Kinetic rotsc:",i,(incr(j),j=1,3)
759 KEr_sc=KEr_sc+Isc(iti,mnum)*(incr(1)*incr(1)+incr(2)*incr(2)+ &
763 ! The total kinetic energy
765 ! write(iout,*) 'KEr_sc', KEr_sc
766 KE_total=0.5d0*(KEt_p+KEt_sc+0.25d0*KEr_p+KEr_sc)
767 ! write (iout,*) "KE_total",KE_total
769 end subroutine kinetic
770 !-----------------------------------------------------------------------------
772 !-----------------------------------------------------------------------------
774 !------------------------------------------------
775 ! The driver for molecular dynamics subroutines
776 !------------------------------------------------
779 use control, only:tcpu,ovrtim
780 ! use io_comm, only:ilen
782 use compare, only:secondary2,hairpin
783 use io, only:cartout,statout
784 ! implicit real*8 (a-h,o-z)
785 ! include 'DIMENSIONS'
788 integer :: IERROR,ERRCODE
790 ! include 'COMMON.SETUP'
791 ! include 'COMMON.CONTROL'
792 ! include 'COMMON.VAR'
793 ! include 'COMMON.MD'
795 ! include 'COMMON.LANGEVIN'
797 ! include 'COMMON.LANGEVIN.lang0'
799 ! include 'COMMON.CHAIN'
800 ! include 'COMMON.DERIV'
801 ! include 'COMMON.GEO'
802 ! include 'COMMON.LOCAL'
803 ! include 'COMMON.INTERACT'
804 ! include 'COMMON.IOUNITS'
805 ! include 'COMMON.NAMES'
806 ! include 'COMMON.TIME1'
807 ! include 'COMMON.HAIRPIN'
808 real(kind=8),dimension(3) :: L,vcm
810 real(kind=8),dimension(6*nres) :: v_work,v_transf !(maxres6) maxres6=6*maxres
812 integer :: rstcount !ilen,
814 character(len=50) :: tytul
815 !el common /gucio/ cm
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(20)
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
1753 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1755 t_enegrad=t_enegrad+tcpu()-tt0
1757 ! Compute accelerations from long-range forces
1759 if (large.and. mod(itime,ntwe).eq.0) then
1760 write (iout,*) "energia_long",energia_long(0)
1761 write (iout,*) "Cartesian and internal coordinates: step 2"
1763 call pdbout(0.0d0,"cipiszcze",iout)
1765 write (iout,*) "Accelerations from long-range forces"
1767 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
1768 (d_a(j,i+nres),j=1,3)
1770 write (iout,*) "Velocities, step 2"
1772 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1773 (d_t(j,i+nres),j=1,3)
1777 ! Compute the final RESPA step (increment velocities)
1778 ! write (iout,*) "*********************** RESPA fin"
1780 ! Compute the complete potential energy
1782 potEcomp(i)=energia_short(i)+energia_long(i)
1784 potE=potEcomp(0)-potEcomp(20)
1785 ! potE=energia_short(0)+energia_long(0)
1788 ! Calculate the kinetic and the total energy and the kinetic temperature
1791 ! Couple the system to Berendsen bath if needed
1792 if (tbf .and. lang.eq.0) then
1795 kinetic_T=2.0d0/(dimen3*Rb)*EK
1796 ! Backup the coordinates, velocities, and accelerations
1798 if (mod(itime,ntwe).eq.0 .and. large) then
1799 write (iout,*) "Velocities, end"
1801 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
1802 (d_t(j,i+nres),j=1,3)
1807 end subroutine RESPA_step
1808 !-----------------------------------------------------------------------------
1809 subroutine RESPA_vel
1810 ! First and last RESPA step (incrementing velocities using long-range
1813 ! implicit real*8 (a-h,o-z)
1814 ! include 'DIMENSIONS'
1815 ! include 'COMMON.CONTROL'
1816 ! include 'COMMON.VAR'
1817 ! include 'COMMON.MD'
1818 ! include 'COMMON.CHAIN'
1819 ! include 'COMMON.DERIV'
1820 ! include 'COMMON.GEO'
1821 ! include 'COMMON.LOCAL'
1822 ! include 'COMMON.INTERACT'
1823 ! include 'COMMON.IOUNITS'
1824 ! include 'COMMON.NAMES'
1825 integer :: i,j,inres,mnum
1828 d_t(j,0)=d_t(j,0)+0.5d0*d_a(j,0)*d_time
1832 d_t(j,i)=d_t(j,i)+0.5d0*d_a(j,i)*d_time
1837 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1838 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1839 .and.(mnum.ne.5)) then
1842 d_t(j,inres)=d_t(j,inres)+0.5d0*d_a(j,inres)*d_time
1847 end subroutine RESPA_vel
1848 !-----------------------------------------------------------------------------
1850 ! Applying velocity Verlet algorithm - step 1 to coordinates
1852 ! implicit real*8 (a-h,o-z)
1853 ! include 'DIMENSIONS'
1854 ! include 'COMMON.CONTROL'
1855 ! include 'COMMON.VAR'
1856 ! include 'COMMON.MD'
1857 ! include 'COMMON.CHAIN'
1858 ! include 'COMMON.DERIV'
1859 ! include 'COMMON.GEO'
1860 ! include 'COMMON.LOCAL'
1861 ! include 'COMMON.INTERACT'
1862 ! include 'COMMON.IOUNITS'
1863 ! include 'COMMON.NAMES'
1864 real(kind=8) :: adt,adt2
1865 integer :: i,j,inres,mnum
1868 write (iout,*) "VELVERLET1 START: DC"
1870 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
1871 (dc(j,i+nres),j=1,3)
1875 adt=d_a_old(j,0)*d_time
1877 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
1878 d_t_new(j,0)=d_t_old(j,0)+adt2
1879 d_t(j,0)=d_t_old(j,0)+adt
1883 adt=d_a_old(j,i)*d_time
1885 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
1886 d_t_new(j,i)=d_t_old(j,i)+adt2
1887 d_t(j,i)=d_t_old(j,i)+adt
1892 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1893 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1894 .and.(mnum.ne.5)) then
1897 adt=d_a_old(j,inres)*d_time
1899 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
1900 d_t_new(j,inres)=d_t_old(j,inres)+adt2
1901 d_t(j,inres)=d_t_old(j,inres)+adt
1906 write (iout,*) "VELVERLET1 END: DC"
1908 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),&
1909 (dc(j,i+nres),j=1,3)
1913 end subroutine verlet1
1914 !-----------------------------------------------------------------------------
1916 ! Step 2 of the velocity Verlet algorithm: update velocities
1918 ! implicit real*8 (a-h,o-z)
1919 ! include 'DIMENSIONS'
1920 ! include 'COMMON.CONTROL'
1921 ! include 'COMMON.VAR'
1922 ! include 'COMMON.MD'
1923 ! include 'COMMON.CHAIN'
1924 ! include 'COMMON.DERIV'
1925 ! include 'COMMON.GEO'
1926 ! include 'COMMON.LOCAL'
1927 ! include 'COMMON.INTERACT'
1928 ! include 'COMMON.IOUNITS'
1929 ! include 'COMMON.NAMES'
1930 integer :: i,j,inres,mnum
1933 d_t(j,0)=d_t_new(j,0)+0.5d0*d_a(j,0)*d_time
1937 d_t(j,i)=d_t_new(j,i)+0.5d0*d_a(j,i)*d_time
1942 ! iti=iabs(itype(i,mnum))
1943 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
1944 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
1945 .and.(mnum.ne.5)) then
1948 d_t(j,inres)=d_t_new(j,inres)+0.5d0*d_a(j,inres)*d_time
1953 end subroutine verlet2
1954 !-----------------------------------------------------------------------------
1955 subroutine sddir_precalc
1956 ! Applying velocity Verlet algorithm - step 1 to coordinates
1957 ! implicit real*8 (a-h,o-z)
1958 ! include 'DIMENSIONS'
1964 ! include 'COMMON.CONTROL'
1965 ! include 'COMMON.VAR'
1966 ! include 'COMMON.MD'
1968 ! include 'COMMON.LANGEVIN'
1970 ! include 'COMMON.LANGEVIN.lang0'
1972 ! include 'COMMON.CHAIN'
1973 ! include 'COMMON.DERIV'
1974 ! include 'COMMON.GEO'
1975 ! include 'COMMON.LOCAL'
1976 ! include 'COMMON.INTERACT'
1977 ! include 'COMMON.IOUNITS'
1978 ! include 'COMMON.NAMES'
1979 ! include 'COMMON.TIME1'
1980 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
1981 !el common /stochcalc/ stochforcvec
1982 real(kind=8) :: time00
1984 ! Compute friction and stochastic forces
1989 time_fric=time_fric+MPI_Wtime()-time00
1991 call stochastic_force(stochforcvec)
1992 time_stoch=time_stoch+MPI_Wtime()-time00
1995 ! Compute the acceleration due to friction forces (d_af_work) and stochastic
1996 ! forces (d_as_work)
1998 call ginv_mult(fric_work, d_af_work)
1999 call ginv_mult(stochforcvec, d_as_work)
2001 end subroutine sddir_precalc
2002 !-----------------------------------------------------------------------------
2003 subroutine sddir_verlet1
2004 ! Applying velocity Verlet algorithm - step 1 to velocities
2007 ! implicit real*8 (a-h,o-z)
2008 ! include 'DIMENSIONS'
2009 ! include 'COMMON.CONTROL'
2010 ! include 'COMMON.VAR'
2011 ! include 'COMMON.MD'
2013 ! include 'COMMON.LANGEVIN'
2015 ! include 'COMMON.LANGEVIN.lang0'
2017 ! include 'COMMON.CHAIN'
2018 ! include 'COMMON.DERIV'
2019 ! include 'COMMON.GEO'
2020 ! include 'COMMON.LOCAL'
2021 ! include 'COMMON.INTERACT'
2022 ! include 'COMMON.IOUNITS'
2023 ! include 'COMMON.NAMES'
2024 ! Revised 3/31/05 AL: correlation between random contributions to
2025 ! position and velocity increments included.
2026 real(kind=8) :: sqrt13 = 0.57735026918962576451d0 ! 1/sqrt(3)
2027 real(kind=8) :: adt,adt2
2028 integer :: i,j,ind,inres,mnum
2030 ! Add the contribution from BOTH friction and stochastic force to the
2031 ! coordinates, but ONLY the contribution from the friction forces to velocities
2034 adt=(d_a_old(j,0)+d_af_work(j))*d_time
2035 adt2=0.5d0*adt+sqrt13*d_as_work(j)*d_time
2036 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
2037 d_t_new(j,0)=d_t_old(j,0)+0.5d0*adt
2038 d_t(j,0)=d_t_old(j,0)+adt
2043 adt=(d_a_old(j,i)+d_af_work(ind+j))*d_time
2044 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
2045 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
2046 d_t_new(j,i)=d_t_old(j,i)+0.5d0*adt
2047 d_t(j,i)=d_t_old(j,i)+adt
2053 ! iti=iabs(itype(i,mnum))
2054 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2055 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2056 .and.(mnum.ne.5)) then
2059 adt=(d_a_old(j,inres)+d_af_work(ind+j))*d_time
2060 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
2061 ! write(iout,*) "adt",adt,"ads",adt2
2062 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
2063 d_t_new(j,inres)=d_t_old(j,inres)+0.5d0*adt
2064 d_t(j,inres)=d_t_old(j,inres)+adt
2070 end subroutine sddir_verlet1
2071 !-----------------------------------------------------------------------------
2072 subroutine sddir_verlet2
2073 ! Calculating the adjusted velocities for accelerations
2076 ! implicit real*8 (a-h,o-z)
2077 ! include 'DIMENSIONS'
2078 ! include 'COMMON.CONTROL'
2079 ! include 'COMMON.VAR'
2080 ! include 'COMMON.MD'
2082 ! include 'COMMON.LANGEVIN'
2084 ! include 'COMMON.LANGEVIN.lang0'
2086 ! include 'COMMON.CHAIN'
2087 ! include 'COMMON.DERIV'
2088 ! include 'COMMON.GEO'
2089 ! include 'COMMON.LOCAL'
2090 ! include 'COMMON.INTERACT'
2091 ! include 'COMMON.IOUNITS'
2092 ! include 'COMMON.NAMES'
2093 real(kind=8),dimension(6*nres) :: stochforcvec,d_as_work1 !(MAXRES6) maxres6=6*maxres
2094 real(kind=8) :: cos60 = 0.5d0, sin60 = 0.86602540378443864676d0
2095 integer :: i,j,ind,inres,mnum
2096 ! Revised 3/31/05 AL: correlation between random contributions to
2097 ! position and velocity increments included.
2098 ! The correlation coefficients are calculated at low-friction limit.
2099 ! Also, friction forces are now not calculated with new velocities.
2101 ! call friction_force
2102 call stochastic_force(stochforcvec)
2104 ! Compute the acceleration due to friction forces (d_af_work) and stochastic
2105 ! forces (d_as_work)
2107 call ginv_mult(stochforcvec, d_as_work1)
2113 d_t(j,0)=d_t_new(j,0)+(0.5d0*(d_a(j,0)+d_af_work(j)) &
2114 +sin60*d_as_work(j)+cos60*d_as_work1(j))*d_time
2119 d_t(j,i)=d_t_new(j,i)+(0.5d0*(d_a(j,i)+d_af_work(ind+j)) &
2120 +sin60*d_as_work(ind+j)+cos60*d_as_work1(ind+j))*d_time
2126 ! iti=iabs(itype(i,mnum))
2127 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2128 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2129 .and.(mnum.ne.5)) then
2132 d_t(j,inres)=d_t_new(j,inres)+(0.5d0*(d_a(j,inres) &
2133 +d_af_work(ind+j))+sin60*d_as_work(ind+j) &
2134 +cos60*d_as_work1(ind+j))*d_time
2140 end subroutine sddir_verlet2
2141 !-----------------------------------------------------------------------------
2142 subroutine max_accel
2144 ! Find the maximum difference in the accelerations of the the sites
2145 ! at the beginning and the end of the time step.
2148 ! implicit real*8 (a-h,o-z)
2149 ! include 'DIMENSIONS'
2150 ! include 'COMMON.CONTROL'
2151 ! include 'COMMON.VAR'
2152 ! include 'COMMON.MD'
2153 ! include 'COMMON.CHAIN'
2154 ! include 'COMMON.DERIV'
2155 ! include 'COMMON.GEO'
2156 ! include 'COMMON.LOCAL'
2157 ! include 'COMMON.INTERACT'
2158 ! include 'COMMON.IOUNITS'
2159 real(kind=8),dimension(3) :: aux,accel,accel_old
2160 real(kind=8) :: dacc
2164 ! aux(j)=d_a(j,0)-d_a_old(j,0)
2165 accel_old(j)=d_a_old(j,0)
2172 ! 7/3/08 changed to asymmetric difference
2174 ! accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i))
2175 accel_old(j)=accel_old(j)+0.5d0*d_a_old(j,i)
2176 accel(j)=accel(j)+0.5d0*d_a(j,i)
2177 ! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
2178 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
2179 dacc=dabs(accel(j)-accel_old(j))
2180 ! write (iout,*) i,dacc
2181 if (dacc.gt.amax) amax=dacc
2189 accel_old(j)=d_a_old(j,0)
2194 accel_old(j)=accel_old(j)+d_a_old(j,1)
2195 accel(j)=accel(j)+d_a(j,1)
2200 ! iti=iabs(itype(i,mnum))
2201 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2202 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2203 .and.(mnum.ne.5)) then
2205 ! accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres)
2206 accel_old(j)=accel_old(j)+d_a_old(j,i+nres)
2207 accel(j)=accel(j)+d_a(j,i+nres)
2211 ! if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
2212 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
2213 dacc=dabs(accel(j)-accel_old(j))
2214 ! write (iout,*) "side-chain",i,dacc
2215 if (dacc.gt.amax) amax=dacc
2219 accel_old(j)=accel_old(j)+d_a_old(j,i)
2220 accel(j)=accel(j)+d_a(j,i)
2221 ! aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i)
2225 end subroutine max_accel
2226 !-----------------------------------------------------------------------------
2227 subroutine predict_edrift(epdrift)
2229 ! Predict the drift of the potential energy
2232 use control_data, only: lmuca
2233 ! implicit real*8 (a-h,o-z)
2234 ! include 'DIMENSIONS'
2235 ! include 'COMMON.CONTROL'
2236 ! include 'COMMON.VAR'
2237 ! include 'COMMON.MD'
2238 ! include 'COMMON.CHAIN'
2239 ! include 'COMMON.DERIV'
2240 ! include 'COMMON.GEO'
2241 ! include 'COMMON.LOCAL'
2242 ! include 'COMMON.INTERACT'
2243 ! include 'COMMON.IOUNITS'
2244 ! include 'COMMON.MUCA'
2245 real(kind=8) :: epdrift,epdriftij
2247 ! Drift of the potential energy
2253 epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i))
2254 if (lmuca) epdriftij=epdriftij*factor
2255 ! write (iout,*) "back",i,j,epdriftij
2256 if (epdriftij.gt.epdrift) epdrift=epdriftij
2260 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1.and.&
2261 molnum(i).ne.5) then
2264 dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
2265 if (lmuca) epdriftij=epdriftij*factor
2266 ! write (iout,*) "side",i,j,epdriftij
2267 if (epdriftij.gt.epdrift) epdrift=epdriftij
2271 epdrift=0.5d0*epdrift*d_time*d_time
2272 ! write (iout,*) "epdrift",epdrift
2274 end subroutine predict_edrift
2275 !-----------------------------------------------------------------------------
2276 subroutine verlet_bath
2278 ! Coupling to the thermostat by using the Berendsen algorithm
2281 ! implicit real*8 (a-h,o-z)
2282 ! include 'DIMENSIONS'
2283 ! include 'COMMON.CONTROL'
2284 ! include 'COMMON.VAR'
2285 ! include 'COMMON.MD'
2286 ! include 'COMMON.CHAIN'
2287 ! include 'COMMON.DERIV'
2288 ! include 'COMMON.GEO'
2289 ! include 'COMMON.LOCAL'
2290 ! include 'COMMON.INTERACT'
2291 ! include 'COMMON.IOUNITS'
2292 ! include 'COMMON.NAMES'
2293 real(kind=8) :: T_half,fact
2294 integer :: i,j,inres,mnum
2296 T_half=2.0d0/(dimen3*Rb)*EK
2297 fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0))
2298 ! write(iout,*) "T_half", T_half
2299 ! write(iout,*) "EK", EK
2300 ! write(iout,*) "fact", fact
2302 d_t(j,0)=fact*d_t(j,0)
2306 d_t(j,i)=fact*d_t(j,i)
2311 ! iti=iabs(itype(i,mnum))
2312 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
2313 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
2314 .and.(mnum.ne.5)) then
2317 d_t(j,inres)=fact*d_t(j,inres)
2322 end subroutine verlet_bath
2323 !-----------------------------------------------------------------------------
2325 ! Set up the initial conditions of a MD simulation
2328 use control, only:tcpu
2329 !el use io_basic, only:ilen
2332 use minimm, only:minim_dc,minimize,sc_move
2333 use io_config, only:readrst
2334 use io, only:statout
2335 use random, only: iran_num
2336 ! implicit real*8 (a-h,o-z)
2337 ! include 'DIMENSIONS'
2340 character(len=16) :: form
2341 integer :: IERROR,ERRCODE
2343 integer :: iranmin,itrial,itmp,n_model_try,k, &
2345 integer, dimension(:),allocatable :: list_model_try
2346 integer, dimension(0:nodes-1) :: i_start_models
2347 ! include 'COMMON.SETUP'
2348 ! include 'COMMON.CONTROL'
2349 ! include 'COMMON.VAR'
2350 ! include 'COMMON.MD'
2352 ! include 'COMMON.LANGEVIN'
2354 ! include 'COMMON.LANGEVIN.lang0'
2356 ! include 'COMMON.CHAIN'
2357 ! include 'COMMON.DERIV'
2358 ! include 'COMMON.GEO'
2359 ! include 'COMMON.LOCAL'
2360 ! include 'COMMON.INTERACT'
2361 ! include 'COMMON.IOUNITS'
2362 ! include 'COMMON.NAMES'
2363 ! include 'COMMON.REMD'
2364 real(kind=8),dimension(0:n_ene) :: energia_long,energia_short,energia
2365 real(kind=8),dimension(3) :: vcm,incr,L
2366 real(kind=8) :: xv,sigv,lowb,highb
2367 real(kind=8),dimension(6*nres) :: varia !(maxvar) (maxvar=6*maxres)
2368 character(len=256) :: qstr
2371 character(len=50) :: tytul
2372 logical :: file_exist
2373 !el common /gucio/ cm
2374 integer :: i,j,ipos,iq,iw,nft_sc,iretcode,nfun,ierr,mnum,itime
2375 real(kind=8) :: etot,tt0
2379 ! write(iout,*) "d_time", d_time
2380 ! Compute the standard deviations of stochastic forces for Langevin dynamics
2381 ! if the friction coefficients do not depend on surface area
2382 if (lang.gt.0 .and. .not.surfarea) then
2385 stdforcp(i)=stdfp(mnum)*dsqrt(gamp(mnum))
2389 stdforcsc(i)=stdfsc(iabs(itype(i,mnum)),mnum) &
2390 *dsqrt(gamsc(iabs(itype(i,mnum)),mnum))
2394 ! Open the pdb file for snapshotshots
2397 if (ilen(tmpdir).gt.0) &
2398 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2399 liczba(:ilen(liczba))//".pdb")
2401 file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2405 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
2406 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2407 liczba(:ilen(liczba))//".x")
2408 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2411 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file)) &
2412 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"// &
2413 liczba(:ilen(liczba))//".cx")
2414 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba)) &
2420 if (ilen(tmpdir).gt.0) &
2421 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb")
2422 open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb")
2424 if (ilen(tmpdir).gt.0) &
2425 call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx")
2426 cartname=prefix(:ilen(prefix))//"_MD.cx"
2430 write (qstr,'(256(1h ))')
2433 iq = qinfrag(i,iset)*10
2434 iw = wfrag(i,iset)/100
2436 if(me.eq.king.or..not.out1file) &
2437 write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw
2438 write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw
2443 iq = qinpair(i,iset)*10
2444 iw = wpair(i,iset)/100
2446 if(me.eq.king.or..not.out1file) &
2447 write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw
2448 write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw
2452 ! pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb'
2454 ! cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x'
2456 ! cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx'
2458 ! statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat'
2462 if (restart1file) then
2464 inquire(file=mremd_rst_name,exist=file_exist)
2465 write (*,*) me," Before broadcast: file_exist",file_exist
2467 call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM,&
2470 write (*,*) me," After broadcast: file_exist",file_exist
2471 ! inquire(file=mremd_rst_name,exist=file_exist)
2472 if(me.eq.king.or..not.out1file) &
2473 write(iout,*) "Initial state read by master and distributed"
2475 if (ilen(tmpdir).gt.0) &
2476 call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_' &
2477 //liczba(:ilen(liczba))//'.rst')
2478 inquire(file=rest2name,exist=file_exist)
2481 if(.not.restart1file) then
2482 if(me.eq.king.or..not.out1file) &
2483 write(iout,*) "Initial state will be read from file ",&
2484 rest2name(:ilen(rest2name))
2487 call rescale_weights(t_bath)
2489 if(me.eq.king.or..not.out1file)then
2490 if (restart1file) then
2491 write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)),&
2494 write(iout,*) "File ",rest2name(:ilen(rest2name)),&
2497 write(iout,*) "Initial velocities randomly generated"
2504 ! Generate initial velocities
2505 if(me.eq.king.or..not.out1file) &
2506 write(iout,*) "Initial velocities randomly generated"
2511 ! rest2name = prefix(:ilen(prefix))//'.rst'
2512 if(me.eq.king.or..not.out1file)then
2513 write (iout,*) "Initial velocities"
2515 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
2516 (d_t(j,i+nres),j=1,3)
2518 ! Zeroing the total angular momentum of the system
2519 write(iout,*) "Calling the zero-angular momentum subroutine"
2522 ! Getting the potential energy and forces and velocities and accelerations
2524 ! write (iout,*) "velocity of the center of the mass:"
2525 ! write (iout,*) (vcm(j),j=1,3)
2527 d_t(j,0)=d_t(j,0)-vcm(j)
2529 ! Removing the velocity of the center of mass
2531 if(me.eq.king.or..not.out1file)then
2532 write (iout,*) "vcm right after adjustment:"
2533 write (iout,*) (vcm(j),j=1,3)
2540 if ((.not.rest).or.(forceminim)) then
2541 if (forceminim) call chainbuild_cart
2543 if(iranconf.ne.0 .or.indpdb.gt.0.and..not.unres_pdb .or.preminim) then
2545 print *, 'Calling OVERLAP_SC'
2546 call overlap_sc(fail)
2547 print *,'after OVERLAP'
2550 print *,'call SC_MOVE'
2551 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
2552 print *,'SC_move',nft_sc,etot
2553 if(me.eq.king.or..not.out1file) &
2554 write(iout,*) 'SC_move',nft_sc,etot
2558 print *, 'Calling MINIM_DC'
2559 call minim_dc(etot,iretcode,nfun)
2561 call geom_to_var(nvar,varia)
2562 print *,'Calling MINIMIZE.'
2563 call minimize(etot,varia,iretcode,nfun)
2564 call var_to_geom(nvar,varia)
2566 if(me.eq.king.or..not.out1file) &
2567 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2569 if(iranconf.ne.0) then
2570 !c 8/22/17 AL Loop to produce a low-energy random conformation
2573 if(me.eq.king.or..not.out1file) &
2574 write (iout,*) 'Calling OVERLAP_SC'
2575 call overlap_sc(fail)
2576 endif !endif overlap
2579 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
2580 print *,'SC_move',nft_sc,etot
2581 if(me.eq.king.or..not.out1file) &
2582 write(iout,*) 'SC_move',nft_sc,etot
2586 print *, 'Calling MINIM_DC'
2587 call minim_dc(etot,iretcode,nfun)
2588 call int_from_cart1(.false.)
2590 call geom_to_var(nvar,varia)
2591 print *,'Calling MINIMIZE.'
2592 call minimize(etot,varia,iretcode,nfun)
2593 call var_to_geom(nvar,varia)
2595 if(me.eq.king.or..not.out1file) &
2596 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2598 if (isnan(etot) .or. etot.gt.4.0d6) then
2599 write (iout,*) "Energy too large",etot, &
2600 " trying another random conformation"
2603 call gen_rand_conf(itmp,*30)
2605 30 write (iout,*) 'Failed to generate random conformation', &
2607 write (*,*) 'Processor:',me, &
2608 ' Failed to generate random conformation',&
2617 write (iout,'(a,i3,a)') 'Processor:',me, &
2618 ' error in generating random conformation.'
2619 write (*,'(a,i3,a)') 'Processor:',me, &
2620 ' error in generating random conformation.'
2623 ! call MPI_Abort(mpi_comm_world,error_msg,ierrcode)
2624 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
2634 write (iout,'(a,i3,a)') 'Processor:',me, &
2635 ' failed to generate a low-energy random conformation.'
2636 write (*,'(a,i3,a,f10.3)') 'Processor:',me, &
2637 ' failed to generate a low-energy random conformation.',etot
2641 ! call MPI_Abort(mpi_comm_world,error_msg,ierrcode)
2642 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
2647 else if (preminim) then
2648 if (start_from_model) then
2652 do while (fail .and. n_model_try.lt.nmodel_start)
2653 write (iout,*) "n_model_try",n_model_try
2655 i_model=iran_num(1,nmodel_start)
2657 if (i_model.eq.list_model_try(k)) exit
2659 if (k.gt.n_model_try) exit
2661 n_model_try=n_model_try+1
2662 list_model_try(n_model_try)=i_model
2663 if (me.eq.king .or. .not. out1file) &
2664 write (iout,*) 'Trying to start from model ',&
2665 pdbfiles_chomo(i_model)(:ilen(pdbfiles_chomo(i_model)))
2668 c(j,i)=chomo(j,i,i_model)
2671 call int_from_cart(.true.,.false.)
2672 call sc_loc_geom(.false.)
2676 dc(j,i)=c(j,i+1)-c(j,i)
2677 dc_norm(j,i)=dc(j,i)*vbld_inv(i+1)
2682 dc(j,i+nres)=c(j,i+nres)-c(j,i)
2683 dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres)
2686 if (me.eq.king.or..not.out1file) then
2687 write (iout,*) "Energies before removing overlaps"
2688 call etotal(energia(0))
2689 call enerprint(energia(0))
2691 ! Remove SC overlaps if requested
2693 write (iout,*) 'Calling OVERLAP_SC'
2694 call overlap_sc(fail)
2697 "Failed to remove overlap from model",i_model
2701 if (me.eq.king.or..not.out1file) then
2702 write (iout,*) "Energies after removing overlaps"
2703 call etotal(energia(0))
2704 call enerprint(energia(0))
2707 ! Search for better SC rotamers if requested
2709 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
2710 print *,'SC_move',nft_sc,etot
2711 if (me.eq.king.or..not.out1file)&
2712 write(iout,*) 'SC_move',nft_sc,etot
2714 call etotal(energia(0))
2717 call MPI_Gather(i_model,1,MPI_INTEGER,i_start_models(0),&
2718 1,MPI_INTEGER,king,CG_COMM,IERROR)
2719 if (n_model_try.gt.nmodel_start .and.&
2720 (me.eq.king .or. out1file)) then
2722 "All models have irreparable overlaps. Trying randoms starts."
2724 i_model=nmodel_start+1
2728 ! Remove SC overlaps if requested
2730 write (iout,*) 'Calling OVERLAP_SC'
2731 call overlap_sc(fail)
2734 "Failed to remove overlap"
2737 if (me.eq.king.or..not.out1file) then
2738 write (iout,*) "Energies after removing overlaps"
2739 call etotal(energia(0))
2740 call enerprint(energia(0))
2743 ! 8/22/17 AL Minimize initial structure
2745 if (me.eq.king.or..not.out1file) write(iout,*)&
2746 'Minimizing initial PDB structure: Calling MINIM_DC'
2747 call minim_dc(etot,iretcode,nfun)
2749 call geom_to_var(nvar,varia)
2750 if(me.eq.king.or..not.out1file) write (iout,*)&
2751 'Minimizing initial PDB structure: Calling MINIMIZE.'
2752 call minimize(etot,varia,iretcode,nfun)
2753 call var_to_geom(nvar,varia)
2755 if (me.eq.king.or..not.out1file)&
2756 write(iout,*) 'LBFGS return code is ',status,' eval ',nfun
2757 if(me.eq.king.or..not.out1file)&
2758 write(iout,*) 'LBFGS return code is ',status,' eval ',nfun
2760 if (me.eq.king.or..not.out1file)&
2761 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2762 if(me.eq.king.or..not.out1file)&
2763 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
2767 if (nmodel_start.gt.0 .and. me.eq.king) then
2768 write (iout,'(a)') "Task Starting model"
2770 if (i_start_models(i).gt.nmodel_start) then
2771 write (iout,'(i4,2x,a)') i,"RANDOM STRUCTURE"
2773 write(iout,'(i4,2x,a)')i,pdbfiles_chomo(i_start_models(i)) &
2774 (:ilen(pdbfiles_chomo(i_start_models(i))))
2779 call chainbuild_cart
2784 kinetic_T=2.0d0/(dimen3*Rb)*EK
2785 if(me.eq.king.or..not.out1file)then
2795 write(iout,*) "before ETOTAL"
2796 call etotal(potEcomp)
2797 if (large) call enerprint(potEcomp)
2800 t_etotal=t_etotal+MPI_Wtime()-tt0
2802 t_etotal=t_etotal+tcpu()-tt0
2809 if (amax*d_time .gt. dvmax) then
2810 d_time=d_time*dvmax/amax
2811 if(me.eq.king.or..not.out1file) write (iout,*) &
2812 "Time step reduced to",d_time,&
2813 " because of too large initial acceleration."
2815 if(me.eq.king.or..not.out1file)then
2816 write(iout,*) "Potential energy and its components"
2817 call enerprint(potEcomp)
2818 ! write(iout,*) (potEcomp(i),i=0,n_ene)
2820 potE=potEcomp(0)-potEcomp(20)
2824 if (ntwe.ne.0) call statout(itime)
2825 if(me.eq.king.or..not.out1file) &
2826 write (iout,'(/a/3(a25,1pe14.5/))') "Initial:", &
2827 " Kinetic energy",EK," Potential energy",potE, &
2828 " Total energy",totE," Maximum acceleration ", &
2831 write (iout,*) "Initial coordinates"
2833 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3),&
2836 write (iout,*) "Initial dC"
2838 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),&
2839 (dc(j,i+nres),j=1,3)
2841 write (iout,*) "Initial velocities"
2842 write (iout,"(13x,' backbone ',23x,' side chain')")
2844 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),&
2845 (d_t(j,i+nres),j=1,3)
2847 write (iout,*) "Initial accelerations"
2849 ! write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
2850 write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3),&
2851 (d_a(j,i+nres),j=1,3)
2857 d_t_old(j,i)=d_t(j,i)
2858 d_a_old(j,i)=d_a(j,i)
2860 ! write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3)
2869 call etotal_short(energia_short)
2870 if (large) call enerprint(potEcomp)
2873 t_eshort=t_eshort+MPI_Wtime()-tt0
2875 t_eshort=t_eshort+tcpu()-tt0
2880 if(.not.out1file .and. large) then
2881 write (iout,*) "energia_long",energia_long(0),&
2882 " energia_short",energia_short(0),&
2883 " total",energia_long(0)+energia_short(0)
2884 write (iout,*) "Initial fast-force accelerations"
2886 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
2887 (d_a(j,i+nres),j=1,3)
2890 ! 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
2893 d_a_short(j,i)=d_a(j,i)
2902 call etotal_long(energia_long)
2903 if (large) call enerprint(potEcomp)
2906 t_elong=t_elong+MPI_Wtime()-tt0
2908 t_elong=t_elong+tcpu()-tt0
2913 if(.not.out1file .and. large) then
2914 write (iout,*) "energia_long",energia_long(0)
2915 write (iout,*) "Initial slow-force accelerations"
2917 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),&
2918 (d_a(j,i+nres),j=1,3)
2922 t_enegrad=t_enegrad+MPI_Wtime()-tt0
2924 t_enegrad=t_enegrad+tcpu()-tt0
2928 end subroutine init_MD
2929 !-----------------------------------------------------------------------------
2930 subroutine random_vel
2932 ! implicit real*8 (a-h,o-z)
2934 use random, only:anorm_distr
2936 ! include 'DIMENSIONS'
2937 ! include 'COMMON.CONTROL'
2938 ! include 'COMMON.VAR'
2939 ! include 'COMMON.MD'
2941 ! include 'COMMON.LANGEVIN'
2943 ! include 'COMMON.LANGEVIN.lang0'
2945 ! include 'COMMON.CHAIN'
2946 ! include 'COMMON.DERIV'
2947 ! include 'COMMON.GEO'
2948 ! include 'COMMON.LOCAL'
2949 ! include 'COMMON.INTERACT'
2950 ! include 'COMMON.IOUNITS'
2951 ! include 'COMMON.NAMES'
2952 ! include 'COMMON.TIME1'
2953 real(kind=8) :: xv,sigv,lowb,highb ,Ek1
2956 real(kind=8) ,allocatable, dimension(:) :: DDU1,DDU2,DL2,DL1,xsolv,DML,rs
2957 real(kind=8) :: sumx
2959 real(kind=8) ,allocatable, dimension(:) :: rsold
2960 real (kind=8),allocatable,dimension(:,:) :: matold
2964 integer :: i,j,ii,k,ind,mark,imark,mnum
2965 ! Generate random velocities from Gaussian distribution of mean 0 and std of KT/m
2966 ! First generate velocities in the eigenspace of the G matrix
2967 ! write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3
2974 sigv=dsqrt((Rb*t_bath)/geigen(i))
2977 d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb)
2979 write (iout,*) "i",i," ii",ii," geigen",geigen(i),&
2980 " d_t_work_new",d_t_work_new(ii)
2991 Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2
2994 write (iout,*) "Ek from eigenvectors",Ek1
2995 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
2999 ! Transform velocities to UNRES coordinate space
3000 allocate (DL1(2*nres))
3001 allocate (DDU1(2*nres))
3002 allocate (DL2(2*nres))
3003 allocate (DDU2(2*nres))
3004 allocate (xsolv(2*nres))
3005 allocate (DML(2*nres))
3006 allocate (rs(2*nres))
3008 allocate (rsold(2*nres))
3009 allocate (matold(2*nres,2*nres))
3011 matold(1,1)=DMorig(1)
3012 matold(1,2)=DU1orig(1)
3013 matold(1,3)=DU2orig(1)
3014 write (*,*) DMorig(1),DU1orig(1),DU2orig(1)
3019 matold(i,j)=DMorig(i)
3020 matold(i,j-1)=DU1orig(i-1)
3022 matold(i,j-2)=DU2orig(i-2)
3030 matold(i,j+1)=DU1orig(i)
3036 matold(i,j+2)=DU2orig(i)
3040 matold(dimen,dimen)=DMorig(dimen)
3041 matold(dimen,dimen-1)=DU1orig(dimen-1)
3042 matold(dimen,dimen-2)=DU2orig(dimen-2)
3043 write(iout,*) "old gmatrix"
3044 call matout(dimen,dimen,2*nres,2*nres,matold)
3048 ! Find the ith eigenvector of the pentadiagonal inertiq matrix
3052 DML(j)=DMorig(j)-geigen(i)
3055 DML(j-1)=DMorig(j)-geigen(i)
3060 DDU1(imark-1)=DU2orig(imark-1)
3061 do j=imark+1,dimen-1
3062 DDU1(j-1)=DU1orig(j)
3070 DDU2(j)=DU2orig(j+1)
3079 write (iout,*) "DL2,DL1,DML,DDU1,DDU2"
3080 write(iout,'(10f10.5)') (DL2(k),k=3,dimen-1)
3081 write(iout,'(10f10.5)') (DL1(k),k=2,dimen-1)
3082 write(iout,'(10f10.5)') (DML(k),k=1,dimen-1)
3083 write(iout,'(10f10.5)') (DDU1(k),k=1,dimen-2)
3084 write(iout,'(10f10.5)') (DDU2(k),k=1,dimen-3)
3087 if (imark.gt.2) rs(imark-2)=-DU2orig(imark-2)
3088 if (imark.gt.1) rs(imark-1)=-DU1orig(imark-1)
3089 if (imark.lt.dimen) rs(imark)=-DU1orig(imark)
3090 if (imark.lt.dimen-1) rs(imark+1)=-DU2orig(imark)
3094 ! write (iout,*) "Vector rs"
3096 ! write (iout,*) j,rs(j)
3099 call FDIAG(dimen-1,DL2,DL1,DML,DDU1,DDU2,rs,xsolv,mark)
3106 sumx=-geigen(i)*xsolv(j)
3108 sumx=sumx+matold(j,k)*xsolv(k)
3111 sumx=sumx+matold(j,k)*xsolv(k-1)
3113 write(iout,'(i5,3f10.5)') j,sumx,rsold(j),sumx-rsold(j)
3116 sumx=-geigen(i)*xsolv(j-1)
3118 sumx=sumx+matold(j,k)*xsolv(k)
3121 sumx=sumx+matold(j,k)*xsolv(k-1)
3123 write(iout,'(i5,3f10.5)') j-1,sumx,rsold(j-1),sumx-rsold(j-1)
3127 "Solution of equations system",i," for eigenvalue",geigen(i)
3129 write(iout,'(i5,f10.5)') j,xsolv(j)
3132 do j=dimen-1,imark,-1
3137 write (iout,*) "Un-normalized eigenvector",i," for eigenvalue",geigen(i)
3139 write(iout,'(i5,f10.5)') j,xsolv(j)
3142 ! Normalize ith eigenvector
3145 sumx=sumx+xsolv(j)**2
3149 xsolv(j)=xsolv(j)/sumx
3152 write (iout,*) "Eigenvector",i," for eigenvalue",geigen(i)
3154 write(iout,'(i5,3f10.5)') j,xsolv(j)
3157 ! All done at this point for eigenvector i, exit loop
3165 write (iout,*) "Unable to find eigenvector",i
3168 ! write (iout,*) "i=",i
3170 ! write (iout,*) "k=",k
3173 ! write(iout,*) "ind",ind," ind1",3*(i-1)+k
3174 d_t_work(ind)=d_t_work(ind) &
3175 +xsolv(j)*d_t_work_new(3*(i-1)+k)
3178 enddo ! i (loop over the eigenvectors)
3181 write (iout,*) "d_t_work"
3183 write (iout,"(i5,f10.5)") i,d_t_work(i)
3188 ! if (itype(i,1).eq.10) then
3190 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
3191 iti=iabs(itype(i,mnum))
3192 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3193 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
3194 .or.(mnum.eq.5)) then
3201 ! write (iout,*) "k",k," ii+k",ii+k," ii+j+k",ii+j+k,"EK1",Ek1
3202 Ek1=Ek1+0.5d0*mp(mnum)*((d_t_work(ii+j+k)+d_t_work_new(ii+k))/2)**2+&
3203 0.5d0*0.25d0*IP(mnum)*(d_t_work(ii+j+k)-d_t_work_new(ii+k))**2
3206 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3207 .and.(mnum.ne.5)) ii=ii+3
3208 write (iout,*) "i",i," itype",itype(i,mnum)," mass",msc(itype(i,mnum),mnum)
3209 write (iout,*) "ii",ii
3212 write (iout,*) "k",k," ii",ii,"EK1",EK1
3213 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3215 Ek1=Ek1+0.5d0*Isc(iabs(itype(i,mnum)),mnum)*(d_t_work(ii)-d_t_work(ii-3))**2
3216 Ek1=Ek1+0.5d0*msc(iabs(itype(i,mnum)),mnum)*d_t_work(ii)**2
3218 write (iout,*) "i",i," ii",ii
3220 write (iout,*) "Ek from d_t_work",Ek1
3221 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
3223 if(allocated(DDU1)) deallocate(DDU1)
3224 if(allocated(DDU2)) deallocate(DDU2)
3225 if(allocated(DL2)) deallocate(DL2)
3226 if(allocated(DL1)) deallocate(DL1)
3227 if(allocated(xsolv)) deallocate(xsolv)
3228 if(allocated(DML)) deallocate(DML)
3229 if(allocated(rs)) deallocate(rs)
3231 if(allocated(matold)) deallocate(matold)
3232 if(allocated(rsold)) deallocate(rsold)
3237 d_t(k,j)=d_t_work(ind)
3241 if (itype(j,1).ne.10 .and. itype(j,mnum).ne.ntyp1_molec(mnum)&
3242 .and.(mnum.ne.5)) then
3244 d_t(k,j+nres)=d_t_work(ind)
3250 write (iout,*) "Random velocities in the Calpha,SC space"
3252 write (iout,'(i3,3f10.5)') i,(d_t(j,i),j=1,3)
3255 write (iout,'(i3,3f10.5)') i,(d_t(j,i+nres),j=1,3)
3262 ! if (itype(i,1).eq.10) then
3264 if (itype(i,1).eq.10 .or. itype(i,mnum).eq.ntyp1_molec(mnum)&
3265 .or.(mnum.eq.5)) then
3267 d_t(j,i)=d_t(j,i+1)-d_t(j,i)
3271 d_t(j,i+nres)=d_t(j,i+nres)-d_t(j,i)
3272 d_t(j,i)=d_t(j,i+1)-d_t(j,i)
3277 write (iout,*)"Random velocities in the virtual-bond-vector space"
3279 write (iout,'(i3,3f10.5)') i,(d_t(j,i),j=1,3)
3282 write (iout,'(i3,3f10.5)') i,(d_t(j,i+nres),j=1,3)
3285 write (iout,*) "Ek from d_t_work",Ek1
3286 write (iout,*) "Kinetic temperatures",2*Ek1/(3*dimen*Rb)
3294 d_t_work(ind)=d_t_work(ind) &
3295 +Gvec(i,j)*d_t_work_new((j-1)*3+k+1)
3297 ! write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind)
3301 ! Transfer to the d_t vector
3303 d_t(j,0)=d_t_work(j)
3309 d_t(j,i)=d_t_work(ind)
3314 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3315 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3316 .and.(mnum.ne.5)) then
3319 d_t(j,i+nres)=d_t_work(ind)
3325 ! write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",&
3326 ! 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
3328 ! write(iout,*) "end init MD"
3330 end subroutine random_vel
3331 !-----------------------------------------------------------------------------
3333 subroutine sd_verlet_p_setup
3334 ! Sets up the parameters of stochastic Verlet algorithm
3335 ! implicit real*8 (a-h,o-z)
3336 ! include 'DIMENSIONS'
3337 use control, only: tcpu
3342 ! include 'COMMON.CONTROL'
3343 ! include 'COMMON.VAR'
3344 ! include 'COMMON.MD'
3346 ! include 'COMMON.LANGEVIN'
3348 ! include 'COMMON.LANGEVIN.lang0'
3350 ! include 'COMMON.CHAIN'
3351 ! include 'COMMON.DERIV'
3352 ! include 'COMMON.GEO'
3353 ! include 'COMMON.LOCAL'
3354 ! include 'COMMON.INTERACT'
3355 ! include 'COMMON.IOUNITS'
3356 ! include 'COMMON.NAMES'
3357 ! include 'COMMON.TIME1'
3358 real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
3359 real(kind=8) :: pterm,vterm,rho,rhoc,vsig
3360 real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
3361 prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
3362 logical :: lprn = .false.
3363 real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
3364 real(kind=8) :: ktm,gdt,egdt,gdt2,gdt3,gdt4,gdt5,gdt6,gdt7,gdt8,&
3366 integer :: i,maxres2
3373 ! AL 8/17/04 Code adapted from tinker
3375 ! Get the frictional and random terms for stochastic dynamics in the
3376 ! eigenspace of mass-scaled UNRES friction matrix
3380 gdt = fricgam(i) * d_time
3382 ! Stochastic dynamics reduces to simple MD for zero friction
3384 if (gdt .le. zero) then
3385 pfric_vec(i) = 1.0d0
3386 vfric_vec(i) = d_time
3387 afric_vec(i) = 0.5d0 * d_time * d_time
3388 prand_vec(i) = 0.0d0
3389 vrand_vec1(i) = 0.0d0
3390 vrand_vec2(i) = 0.0d0
3392 ! Analytical expressions when friction coefficient is large
3395 if (gdt .ge. gdt_radius) then
3398 vfric_vec(i) = (1.0d0-egdt) / fricgam(i)
3399 afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i)
3400 pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt
3401 vterm = 1.0d0 - egdt**2
3402 rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm)
3404 ! Use series expansions when friction coefficient is small
3415 afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0 &
3416 - gdt5/120.0d0 + gdt6/720.0d0 &
3417 - gdt7/5040.0d0 + gdt8/40320.0d0 &
3418 - gdt9/362880.0d0) / fricgam(i)**2
3419 vfric_vec(i) = d_time - fricgam(i)*afric_vec(i)
3420 pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i)
3421 pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0 &
3422 + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0 &
3423 + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0 &
3424 + 127.0d0*gdt9/90720.0d0
3425 vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0 &
3426 - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0 &
3427 - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0 &
3428 - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0
3429 rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0 &
3430 - 17.0d0*gdt2/1280.0d0 &
3431 + 17.0d0*gdt3/6144.0d0 &
3432 + 40967.0d0*gdt4/34406400.0d0 &
3433 - 57203.0d0*gdt5/275251200.0d0 &
3434 - 1429487.0d0*gdt6/13212057600.0d0)
3437 ! Compute the scaling factors of random terms for the nonzero friction case
3439 ktm = 0.5d0*d_time/fricgam(i)
3440 psig = dsqrt(ktm*pterm) / fricgam(i)
3441 vsig = dsqrt(ktm*vterm)
3442 rhoc = dsqrt(1.0d0 - rho*rho)
3444 vrand_vec1(i) = vsig * rho
3445 vrand_vec2(i) = vsig * rhoc
3450 "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
3453 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
3454 afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
3458 ! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
3461 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
3462 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
3463 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
3464 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
3465 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1)
3466 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
3469 t_sdsetup=t_sdsetup+MPI_Wtime()
3471 t_sdsetup=t_sdsetup+tcpu()-tt0
3474 end subroutine sd_verlet_p_setup
3475 !-----------------------------------------------------------------------------
3476 subroutine eigtransf1(n,ndim,ab,d,c)
3480 real(kind=8) :: ab(ndim,ndim,n),c(ndim,n),d(ndim)
3486 c(i,j)=c(i,j)+ab(k,j,i)*d(k)
3491 end subroutine eigtransf1
3492 !-----------------------------------------------------------------------------
3493 subroutine eigtransf(n,ndim,a,b,d,c)
3497 real(kind=8) :: a(ndim,n),b(ndim,n),c(ndim,n),d(ndim)
3503 c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k)
3508 end subroutine eigtransf
3509 !-----------------------------------------------------------------------------
3510 subroutine sd_verlet1
3512 ! Applying stochastic velocity Verlet algorithm - step 1 to velocities
3514 ! implicit real*8 (a-h,o-z)
3515 ! include 'DIMENSIONS'
3516 ! include 'COMMON.CONTROL'
3517 ! include 'COMMON.VAR'
3518 ! include 'COMMON.MD'
3520 ! include 'COMMON.LANGEVIN'
3522 ! include 'COMMON.LANGEVIN.lang0'
3524 ! include 'COMMON.CHAIN'
3525 ! include 'COMMON.DERIV'
3526 ! include 'COMMON.GEO'
3527 ! include 'COMMON.LOCAL'
3528 ! include 'COMMON.INTERACT'
3529 ! include 'COMMON.IOUNITS'
3530 ! include 'COMMON.NAMES'
3531 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
3532 !el common /stochcalc/ stochforcvec
3533 logical :: lprn = .false.
3534 real(kind=8) :: ddt1,ddt2
3535 integer :: i,j,ind,inres
3537 ! write (iout,*) "dc_old"
3539 ! write (iout,'(i5,3f10.5,5x,3f10.5)')
3540 ! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
3543 dc_work(j)=dc_old(j,0)
3544 d_t_work(j)=d_t_old(j,0)
3545 d_a_work(j)=d_a_old(j,0)
3550 dc_work(ind+j)=dc_old(j,i)
3551 d_t_work(ind+j)=d_t_old(j,i)
3552 d_a_work(ind+j)=d_a_old(j,i)
3558 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3559 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3560 .and.(mnum.ne.5)) then
3562 dc_work(ind+j)=dc_old(j,i+nres)
3563 d_t_work(ind+j)=d_t_old(j,i+nres)
3564 d_a_work(ind+j)=d_a_old(j,i+nres)
3572 "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
3576 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
3577 vfric_mat(i,j),afric_mat(i,j),&
3578 prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
3586 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
3587 +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
3588 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
3589 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
3591 d_t_work_new(i)=ddt1+0.5d0*ddt2
3592 d_t_work(i)=ddt1+ddt2
3597 d_t(j,0)=d_t_work(j)
3602 dc(j,i)=dc_work(ind+j)
3603 d_t(j,i)=d_t_work(ind+j)
3609 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3610 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3611 .and.(mnum.ne.5)) then
3614 dc(j,inres)=dc_work(ind+j)
3615 d_t(j,inres)=d_t_work(ind+j)
3621 end subroutine sd_verlet1
3622 !-----------------------------------------------------------------------------
3623 subroutine sd_verlet2
3625 ! Calculating the adjusted velocities for accelerations
3627 ! implicit real*8 (a-h,o-z)
3628 ! include 'DIMENSIONS'
3629 ! include 'COMMON.CONTROL'
3630 ! include 'COMMON.VAR'
3631 ! include 'COMMON.MD'
3633 ! include 'COMMON.LANGEVIN'
3635 ! include 'COMMON.LANGEVIN.lang0'
3637 ! include 'COMMON.CHAIN'
3638 ! include 'COMMON.DERIV'
3639 ! include 'COMMON.GEO'
3640 ! include 'COMMON.LOCAL'
3641 ! include 'COMMON.INTERACT'
3642 ! include 'COMMON.IOUNITS'
3643 ! include 'COMMON.NAMES'
3644 !el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
3645 real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
3646 !el common /stochcalc/ stochforcvec
3648 real(kind=8) :: ddt1,ddt2
3649 integer :: i,j,ind,inres
3650 ! Compute the stochastic forces which contribute to velocity change
3652 call stochastic_force(stochforcvecV)
3659 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
3660 ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+ &
3661 vrand_mat2(i,j)*stochforcvecV(j)
3663 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
3667 d_t(j,0)=d_t_work(j)
3672 d_t(j,i)=d_t_work(ind+j)
3678 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3679 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3680 .and.(mnum.ne.5)) then
3683 d_t(j,inres)=d_t_work(ind+j)
3689 end subroutine sd_verlet2
3690 !-----------------------------------------------------------------------------
3691 subroutine sd_verlet_ciccotti_setup
3693 ! Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's
3695 ! implicit real*8 (a-h,o-z)
3696 ! include 'DIMENSIONS'
3697 use control, only: tcpu
3702 ! include 'COMMON.CONTROL'
3703 ! include 'COMMON.VAR'
3704 ! include 'COMMON.MD'
3706 ! include 'COMMON.LANGEVIN'
3708 ! include 'COMMON.LANGEVIN.lang0'
3710 ! include 'COMMON.CHAIN'
3711 ! include 'COMMON.DERIV'
3712 ! include 'COMMON.GEO'
3713 ! include 'COMMON.LOCAL'
3714 ! include 'COMMON.INTERACT'
3715 ! include 'COMMON.IOUNITS'
3716 ! include 'COMMON.NAMES'
3717 ! include 'COMMON.TIME1'
3718 real(kind=8),dimension(6*nres) :: emgdt !(MAXRES6) maxres6=6*maxres
3719 real(kind=8) :: pterm,vterm,rho,rhoc,vsig
3720 real(kind=8),dimension(6*nres) :: pfric_vec,vfric_vec,afric_vec,&
3721 prand_vec,vrand_vec1,vrand_vec2 !(MAXRES6) maxres6=6*maxres
3722 logical :: lprn = .false.
3723 real(kind=8) :: zero = 1.0d-8, gdt_radius = 0.05d0
3724 real(kind=8) :: ktm,gdt,egdt,tt0
3725 integer :: i,maxres2
3732 ! AL 8/17/04 Code adapted from tinker
3734 ! Get the frictional and random terms for stochastic dynamics in the
3735 ! eigenspace of mass-scaled UNRES friction matrix
3739 write (iout,*) "i",i," fricgam",fricgam(i)
3740 gdt = fricgam(i) * d_time
3742 ! Stochastic dynamics reduces to simple MD for zero friction
3744 if (gdt .le. zero) then
3745 pfric_vec(i) = 1.0d0
3746 vfric_vec(i) = d_time
3747 afric_vec(i) = 0.5d0*d_time*d_time
3748 prand_vec(i) = afric_vec(i)
3749 vrand_vec2(i) = vfric_vec(i)
3751 ! Analytical expressions when friction coefficient is large
3756 vfric_vec(i) = dexp(-0.5d0*gdt)*d_time
3757 afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time
3758 prand_vec(i) = afric_vec(i)
3759 vrand_vec2(i) = vfric_vec(i)
3761 ! Compute the scaling factors of random terms for the nonzero friction case
3763 ! ktm = 0.5d0*d_time/fricgam(i)
3764 ! psig = dsqrt(ktm*pterm) / fricgam(i)
3765 ! vsig = dsqrt(ktm*vterm)
3766 ! prand_vec(i) = psig*afric_vec(i)
3767 ! vrand_vec2(i) = vsig*vfric_vec(i)
3772 "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",&
3775 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),&
3776 afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
3780 ! Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
3782 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
3783 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
3784 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
3785 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
3786 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
3788 t_sdsetup=t_sdsetup+MPI_Wtime()
3790 t_sdsetup=t_sdsetup+tcpu()-tt0
3793 end subroutine sd_verlet_ciccotti_setup
3794 !-----------------------------------------------------------------------------
3795 subroutine sd_verlet1_ciccotti
3797 ! Applying stochastic velocity Verlet algorithm - step 1 to velocities
3798 ! implicit real*8 (a-h,o-z)
3800 ! include 'DIMENSIONS'
3804 ! include 'COMMON.CONTROL'
3805 ! include 'COMMON.VAR'
3806 ! include 'COMMON.MD'
3808 ! include 'COMMON.LANGEVIN'
3810 ! include 'COMMON.LANGEVIN.lang0'
3812 ! include 'COMMON.CHAIN'
3813 ! include 'COMMON.DERIV'
3814 ! include 'COMMON.GEO'
3815 ! include 'COMMON.LOCAL'
3816 ! include 'COMMON.INTERACT'
3817 ! include 'COMMON.IOUNITS'
3818 ! include 'COMMON.NAMES'
3819 !el real(kind=8),dimension(6*nres) :: stochforcvec !(MAXRES6) maxres6=6*maxres
3820 !el common /stochcalc/ stochforcvec
3821 logical :: lprn = .false.
3822 real(kind=8) :: ddt1,ddt2
3823 integer :: i,j,ind,inres
3824 ! write (iout,*) "dc_old"
3826 ! write (iout,'(i5,3f10.5,5x,3f10.5)')
3827 ! & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
3830 dc_work(j)=dc_old(j,0)
3831 d_t_work(j)=d_t_old(j,0)
3832 d_a_work(j)=d_a_old(j,0)
3837 dc_work(ind+j)=dc_old(j,i)
3838 d_t_work(ind+j)=d_t_old(j,i)
3839 d_a_work(ind+j)=d_a_old(j,i)
3844 if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3846 dc_work(ind+j)=dc_old(j,i+nres)
3847 d_t_work(ind+j)=d_t_old(j,i+nres)
3848 d_a_work(ind+j)=d_a_old(j,i+nres)
3857 "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",&
3861 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),&
3862 vfric_mat(i,j),afric_mat(i,j),&
3863 prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
3871 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j) &
3872 +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
3873 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
3874 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
3876 d_t_work_new(i)=ddt1+0.5d0*ddt2
3877 d_t_work(i)=ddt1+ddt2
3882 d_t(j,0)=d_t_work(j)
3887 dc(j,i)=dc_work(ind+j)
3888 d_t(j,i)=d_t_work(ind+j)
3894 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3895 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3896 .and.(mnum.ne.5)) then
3899 dc(j,inres)=dc_work(ind+j)
3900 d_t(j,inres)=d_t_work(ind+j)
3906 end subroutine sd_verlet1_ciccotti
3907 !-----------------------------------------------------------------------------
3908 subroutine sd_verlet2_ciccotti
3910 ! Calculating the adjusted velocities for accelerations
3912 ! implicit real*8 (a-h,o-z)
3913 ! include 'DIMENSIONS'
3914 ! include 'COMMON.CONTROL'
3915 ! include 'COMMON.VAR'
3916 ! include 'COMMON.MD'
3918 ! include 'COMMON.LANGEVIN'
3920 ! include 'COMMON.LANGEVIN.lang0'
3922 ! include 'COMMON.CHAIN'
3923 ! include 'COMMON.DERIV'
3924 ! include 'COMMON.GEO'
3925 ! include 'COMMON.LOCAL'
3926 ! include 'COMMON.INTERACT'
3927 ! include 'COMMON.IOUNITS'
3928 ! include 'COMMON.NAMES'
3929 !el real(kind=8),dimension(6*nres) :: stochforcvec,stochforcvecV !(MAXRES6) maxres6=6*maxres
3930 real(kind=8),dimension(6*nres) :: stochforcvecV !(MAXRES6) maxres6=6*maxres
3931 !el common /stochcalc/ stochforcvec
3932 real(kind=8) :: ddt1,ddt2
3933 integer :: i,j,ind,inres
3935 ! Compute the stochastic forces which contribute to velocity change
3937 call stochastic_force(stochforcvecV)
3944 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
3945 ! ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j)
3946 ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j)
3948 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
3952 d_t(j,0)=d_t_work(j)
3957 d_t(j,i)=d_t_work(ind+j)
3963 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
3965 ! if (itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
3968 d_t(j,inres)=d_t_work(ind+j)
3974 end subroutine sd_verlet2_ciccotti
3976 !-----------------------------------------------------------------------------
3978 !-----------------------------------------------------------------------------
3979 subroutine inertia_tensor
3981 ! Calculating the intertia tensor for the entire protein in order to
3982 ! remove the perpendicular components of velocity matrix which cause
3983 ! the molecule to rotate.
3986 ! implicit real*8 (a-h,o-z)
3987 ! include 'DIMENSIONS'
3988 ! include 'COMMON.CONTROL'
3989 ! include 'COMMON.VAR'
3990 ! include 'COMMON.MD'
3991 ! include 'COMMON.CHAIN'
3992 ! include 'COMMON.DERIV'
3993 ! include 'COMMON.GEO'
3994 ! include 'COMMON.LOCAL'
3995 ! include 'COMMON.INTERACT'
3996 ! include 'COMMON.IOUNITS'
3997 ! include 'COMMON.NAMES'
3999 real(kind=8),dimension(3,3) :: Im,Imcp,eigvec,Id
4000 real(kind=8),dimension(3) :: pr,eigval,L,vp,vrot
4001 real(kind=8) :: M_SC,mag,mag2,M_PEP
4002 real(kind=8),dimension(3,0:nres) :: vpp !(3,0:MAXRES)
4003 real(kind=8),dimension(3) :: vs_p,pp,incr,v
4004 real(kind=8),dimension(3,3) :: pr1,pr2
4006 !el common /gucio/ cm
4007 integer :: iti,inres,i,j,k,mnum
4018 ! calculating the center of the mass of the protein
4022 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4023 if (itype(i,mnum).eq.ntyp1_molec(mnum)) cycle
4024 M_PEP=M_PEP+mp(mnum)
4026 cm(j)=cm(j)+(c(j,i)+0.5d0*dc(j,i))*mp(mnum)
4035 if (mnum.eq.5) cycle
4036 iti=iabs(itype(i,mnum))
4037 M_SC=M_SC+msc(iabs(iti),mnum)
4040 cm(j)=cm(j)+msc(iabs(iti),mnum)*c(j,inres)
4044 cm(j)=cm(j)/(M_SC+M_PEP)
4049 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4051 pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
4053 Im(1,1)=Im(1,1)+mp(mnum)*(pr(2)*pr(2)+pr(3)*pr(3))
4054 Im(1,2)=Im(1,2)-mp(mnum)*pr(1)*pr(2)
4055 Im(1,3)=Im(1,3)-mp(mnum)*pr(1)*pr(3)
4056 Im(2,3)=Im(2,3)-mp(mnum)*pr(2)*pr(3)
4057 Im(2,2)=Im(2,2)+mp(mnum)*(pr(3)*pr(3)+pr(1)*pr(1))
4058 Im(3,3)=Im(3,3)+mp(mnum)*(pr(1)*pr(1)+pr(2)*pr(2))
4063 iti=iabs(itype(i,mnum))
4064 if (mnum.eq.5) cycle
4067 pr(j)=c(j,inres)-cm(j)
4069 Im(1,1)=Im(1,1)+msc(iabs(iti),mnum)*(pr(2)*pr(2)+pr(3)*pr(3))
4070 Im(1,2)=Im(1,2)-msc(iabs(iti),mnum)*pr(1)*pr(2)
4071 Im(1,3)=Im(1,3)-msc(iabs(iti),mnum)*pr(1)*pr(3)
4072 Im(2,3)=Im(2,3)-msc(iabs(iti),mnum)*pr(2)*pr(3)
4073 Im(2,2)=Im(2,2)+msc(iabs(iti),mnum)*(pr(3)*pr(3)+pr(1)*pr(1))
4074 Im(3,3)=Im(3,3)+msc(iabs(iti),mnum)*(pr(1)*pr(1)+pr(2)*pr(2))
4079 Im(1,1)=Im(1,1)+Ip(mnum)*(1-dc_norm(1,i)*dc_norm(1,i))* &
4080 vbld(i+1)*vbld(i+1)*0.25d0
4081 Im(1,2)=Im(1,2)+Ip(mnum)*(-dc_norm(1,i)*dc_norm(2,i))* &
4082 vbld(i+1)*vbld(i+1)*0.25d0
4083 Im(1,3)=Im(1,3)+Ip(mnum)*(-dc_norm(1,i)*dc_norm(3,i))* &
4084 vbld(i+1)*vbld(i+1)*0.25d0
4085 Im(2,3)=Im(2,3)+Ip(mnum)*(-dc_norm(2,i)*dc_norm(3,i))* &
4086 vbld(i+1)*vbld(i+1)*0.25d0
4087 Im(2,2)=Im(2,2)+Ip(mnum)*(1-dc_norm(2,i)*dc_norm(2,i))* &
4088 vbld(i+1)*vbld(i+1)*0.25d0
4089 Im(3,3)=Im(3,3)+Ip(mnum)*(1-dc_norm(3,i)*dc_norm(3,i))* &
4090 vbld(i+1)*vbld(i+1)*0.25d0
4096 ! if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)) then
4097 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4098 .and.(mnum.ne.5)) then
4099 iti=iabs(itype(i,mnum))
4101 Im(1,1)=Im(1,1)+Isc(iti,mnum)*(1-dc_norm(1,inres)* &
4102 dc_norm(1,inres))*vbld(inres)*vbld(inres)
4103 Im(1,2)=Im(1,2)-Isc(iti,mnum)*(dc_norm(1,inres)* &
4104 dc_norm(2,inres))*vbld(inres)*vbld(inres)
4105 Im(1,3)=Im(1,3)-Isc(iti,mnum)*(dc_norm(1,inres)* &
4106 dc_norm(3,inres))*vbld(inres)*vbld(inres)
4107 Im(2,3)=Im(2,3)-Isc(iti,mnum)*(dc_norm(2,inres)* &
4108 dc_norm(3,inres))*vbld(inres)*vbld(inres)
4109 Im(2,2)=Im(2,2)+Isc(iti,mnum)*(1-dc_norm(2,inres)* &
4110 dc_norm(2,inres))*vbld(inres)*vbld(inres)
4111 Im(3,3)=Im(3,3)+Isc(iti,mnum)*(1-dc_norm(3,inres)* &
4112 dc_norm(3,inres))*vbld(inres)*vbld(inres)
4117 ! write(iout,*) "The angular momentum before adjustment:"
4118 ! write(iout,*) (L(j),j=1,3)
4124 ! Copying the Im matrix for the djacob subroutine
4132 ! Finding the eigenvectors and eignvalues of the inertia tensor
4133 call djacob(3,3,10000,1.0d-10,Imcp,eigvec,eigval)
4134 ! write (iout,*) "Eigenvalues & Eigenvectors"
4135 ! write (iout,'(5x,3f10.5)') (eigval(i),i=1,3)
4138 ! write (iout,'(i5,3f10.5)') i,(eigvec(i,j),j=1,3)
4140 ! Constructing the diagonalized matrix
4142 if (dabs(eigval(i)).gt.1.0d-15) then
4143 Id(i,i)=1.0d0/eigval(i)
4150 Imcp(i,j)=eigvec(j,i)
4156 pr1(i,j)=pr1(i,j)+Id(i,k)*Imcp(k,j)
4163 pr2(i,j)=pr2(i,j)+eigvec(i,k)*pr1(k,j)
4167 ! Calculating the total rotational velocity of the molecule
4170 vrot(i)=vrot(i)+pr2(i,j)*L(j)
4173 ! Resetting the velocities
4175 call vecpr(vrot(1),dc(1,i),vp)
4177 d_t(j,i)=d_t(j,i)-vp(j)
4182 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4183 .and.(mnum.ne.5)) then
4184 ! if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)) then
4185 ! if(itype(i,1).ne.10 .and. itype(i,1).ne.ntyp1) then
4187 call vecpr(vrot(1),dc(1,inres),vp)
4189 d_t(j,inres)=d_t(j,inres)-vp(j)
4194 ! write(iout,*) "The angular momentum after adjustment:"
4195 ! write(iout,*) (L(j),j=1,3)
4198 end subroutine inertia_tensor
4199 !-----------------------------------------------------------------------------
4200 subroutine angmom(cm,L)
4203 ! implicit real*8 (a-h,o-z)
4204 ! include 'DIMENSIONS'
4205 ! include 'COMMON.CONTROL'
4206 ! include 'COMMON.VAR'
4207 ! include 'COMMON.MD'
4208 ! include 'COMMON.CHAIN'
4209 ! include 'COMMON.DERIV'
4210 ! include 'COMMON.GEO'
4211 ! include 'COMMON.LOCAL'
4212 ! include 'COMMON.INTERACT'
4213 ! include 'COMMON.IOUNITS'
4214 ! include 'COMMON.NAMES'
4215 real(kind=8) :: mscab
4216 real(kind=8),dimension(3) :: L,cm,pr,vp,vrot,incr,v,pp
4217 integer :: iti,inres,i,j,mnum
4218 ! Calculate the angular momentum
4227 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4229 pr(j)=c(j,i)+0.5d0*dc(j,i)-cm(j)
4232 v(j)=incr(j)+0.5d0*d_t(j,i)
4235 incr(j)=incr(j)+d_t(j,i)
4237 call vecpr(pr(1),v(1),vp)
4239 L(j)=L(j)+mp(mnum)*vp(j)
4243 pp(j)=0.5d0*d_t(j,i)
4245 call vecpr(pr(1),pp(1),vp)
4247 L(j)=L(j)+Ip(mnum)*vp(j)
4255 iti=iabs(itype(i,mnum))
4263 pr(j)=c(j,inres)-cm(j)
4265 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4266 .and.(mnum.ne.5)) then
4268 v(j)=incr(j)+d_t(j,inres)
4275 call vecpr(pr(1),v(1),vp)
4276 ! write (iout,*) "i",i," iti",iti," pr",(pr(j),j=1,3),&
4277 ! " v",(v(j),j=1,3)," vp",(vp(j),j=1,3)
4279 L(j)=L(j)+mscab*vp(j)
4281 ! write (iout,*) "L",(l(j),j=1,3)
4282 if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4283 .and.(mnum.ne.5)) then
4285 v(j)=incr(j)+d_t(j,inres)
4287 call vecpr(dc(1,inres),d_t(1,inres),vp)
4289 L(j)=L(j)+Isc(iti,mnum)*vp(j)
4293 incr(j)=incr(j)+d_t(j,i)
4297 end subroutine angmom
4298 !-----------------------------------------------------------------------------
4299 subroutine vcm_vel(vcm)
4302 ! implicit real*8 (a-h,o-z)
4303 ! include 'DIMENSIONS'
4304 ! include 'COMMON.VAR'
4305 ! include 'COMMON.MD'
4306 ! include 'COMMON.CHAIN'
4307 ! include 'COMMON.DERIV'
4308 ! include 'COMMON.GEO'
4309 ! include 'COMMON.LOCAL'
4310 ! include 'COMMON.INTERACT'
4311 ! include 'COMMON.IOUNITS'
4312 real(kind=8),dimension(3) :: vcm,vv
4313 real(kind=8) :: summas,amas
4323 if (mnum.eq.5) mp(mnum)=msc(itype(i,mnum),mnum)
4325 summas=summas+mp(mnum)
4327 vcm(j)=vcm(j)+mp(mnum)*(vv(j)+0.5d0*d_t(j,i))
4331 amas=msc(iabs(itype(i,mnum)),mnum)
4336 if (itype(i,mnum).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4337 .and.(mnum.ne.5)) then
4339 vcm(j)=vcm(j)+amas*(vv(j)+d_t(j,i+nres))
4343 vcm(j)=vcm(j)+amas*vv(j)
4347 vv(j)=vv(j)+d_t(j,i)
4350 ! write (iout,*) "vcm",(vcm(j),j=1,3)," summas",summas
4352 vcm(j)=vcm(j)/summas
4355 end subroutine vcm_vel
4356 !-----------------------------------------------------------------------------
4358 !-----------------------------------------------------------------------------
4360 ! RATTLE algorithm for velocity Verlet - step 1, UNRES
4364 ! implicit real*8 (a-h,o-z)
4365 ! include 'DIMENSIONS'
4367 ! include 'COMMON.CONTROL'
4368 ! include 'COMMON.VAR'
4369 ! include 'COMMON.MD'
4371 ! include 'COMMON.LANGEVIN'
4373 ! include 'COMMON.LANGEVIN.lang0'
4375 ! include 'COMMON.CHAIN'
4376 ! include 'COMMON.DERIV'
4377 ! include 'COMMON.GEO'
4378 ! include 'COMMON.LOCAL'
4379 ! include 'COMMON.INTERACT'
4380 ! include 'COMMON.IOUNITS'
4381 ! include 'COMMON.NAMES'
4382 ! include 'COMMON.TIME1'
4383 !el real(kind=8) :: gginv(2*nres,2*nres),&
4384 !el gdc(3,2*nres,2*nres)
4385 real(kind=8) :: dC_uncor(3,2*nres) !,&
4386 !el real(kind=8) :: Cmat(2*nres,2*nres)
4387 real(kind=8) :: x(2*nres),xcorr(3,2*nres) !maxres2=2*maxres
4388 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4389 !el common /przechowalnia/ nbond
4390 integer :: max_rattle = 5
4391 logical :: lprn = .false., lprn1 = .false., not_done
4392 real(kind=8) :: tol_rattle = 1.0d-5
4394 integer :: ii,i,j,jj,l,ind,ind1,nres2
4397 !el /common/ przechowalnia
4399 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4400 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4401 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4403 if (lprn) write (iout,*) "RATTLE1"
4407 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4408 .and.(mnum.ne.5)) nbond=nbond+1
4410 ! Make a folded form of the Ginv-matrix
4423 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4428 if (itype(k,1).ne.10 .and. itype(k,mnum).ne.ntyp1_molec(mnum)&
4429 .and.(mnum.ne.5)) then
4433 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4441 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4452 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4456 if (itype(k,1).ne.10) then
4460 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=Ginv(ind,ind1)
4468 write (iout,*) "Matrix GGinv"
4469 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
4475 if (iter.gt.max_rattle) then
4476 write (iout,*) "Error - too many iterations in RATTLE."
4479 ! Calculate the matrix C = GG**(-1) dC_old o dC
4484 dC_uncor(j,ind1)=dC(j,i)
4488 if (itype(i,1).ne.10) then
4491 dC_uncor(j,ind1)=dC(j,i+nres)
4500 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
4504 if (itype(k,1).ne.10) then
4507 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
4512 ! Calculate deviations from standard virtual-bond lengths
4516 x(ind)=vbld(i+1)**2-vbl**2
4519 if (itype(i,1).ne.10) then
4521 x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4525 write (iout,*) "Coordinates and violations"
4527 write(iout,'(i5,3f10.5,5x,e15.5)') &
4528 i,(dC_uncor(j,i),j=1,3),x(i)
4530 write (iout,*) "Velocities and violations"
4534 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4535 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
4539 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4540 .and.(mnum.ne.5)) then
4543 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4544 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
4545 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
4548 ! write (iout,*) "gdc"
4550 ! write (iout,*) "i",i
4552 ! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
4558 if (dabs(x(i)).gt.xmax) then
4562 if (xmax.lt.tol_rattle) then
4566 ! Calculate the matrix of the system of equations
4571 Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
4576 write (iout,*) "Matrix Cmat"
4577 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
4579 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
4580 ! Add constraint term to positions
4587 xx = xx+x(ii)*gdc(j,ind,ii)
4591 d_t_new(j,i)=d_t_new(j,i)-xx/d_time
4595 if (itype(i,1).ne.10) then
4600 xx = xx+x(ii)*gdc(j,ind,ii)
4603 dC(j,i+nres)=dC(j,i+nres)-xx
4604 d_t_new(j,i+nres)=d_t_new(j,i+nres)-xx/d_time
4608 ! Rebuild the chain using the new coordinates
4609 call chainbuild_cart
4611 write (iout,*) "New coordinates, Lagrange multipliers,",&
4612 " and differences between actual and standard bond lengths"
4616 xx=vbld(i+1)**2-vbl**2
4617 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4618 i,(dC(j,i),j=1,3),x(ind),xx
4622 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4625 xx=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
4626 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
4627 i,(dC(j,i+nres),j=1,3),x(ind),xx
4630 write (iout,*) "Velocities and violations"
4634 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4635 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
4638 if (itype(i,1).ne.10) then
4640 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4641 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
4642 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
4649 10 write (iout,*) "Error - singularity in solving the system",&
4650 " of equations for Lagrange multipliers."
4654 "RATTLE inactive; use -DRATTLE switch at compile time."
4657 end subroutine rattle1
4658 !-----------------------------------------------------------------------------
4660 ! RATTLE algorithm for velocity Verlet - step 2, UNRES
4664 ! implicit real*8 (a-h,o-z)
4665 ! include 'DIMENSIONS'
4667 ! include 'COMMON.CONTROL'
4668 ! include 'COMMON.VAR'
4669 ! include 'COMMON.MD'
4671 ! include 'COMMON.LANGEVIN'
4673 ! include 'COMMON.LANGEVIN.lang0'
4675 ! include 'COMMON.CHAIN'
4676 ! include 'COMMON.DERIV'
4677 ! include 'COMMON.GEO'
4678 ! include 'COMMON.LOCAL'
4679 ! include 'COMMON.INTERACT'
4680 ! include 'COMMON.IOUNITS'
4681 ! include 'COMMON.NAMES'
4682 ! include 'COMMON.TIME1'
4683 !el real(kind=8) :: gginv(2*nres,2*nres),&
4684 !el gdc(3,2*nres,2*nres)
4685 real(kind=8) :: dC_uncor(3,2*nres) !,&
4686 !el Cmat(2*nres,2*nres)
4687 real(kind=8) :: x(2*nres) !maxres2=2*maxres
4688 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4689 !el common /przechowalnia/ nbond
4690 integer :: max_rattle = 5
4691 logical :: lprn = .false., lprn1 = .false., not_done
4692 real(kind=8) :: tol_rattle = 1.0d-5
4696 !el /common/ przechowalnia
4697 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4698 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4699 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4701 if (lprn) write (iout,*) "RATTLE2"
4702 if (lprn) write (iout,*) "Velocity correction"
4703 ! Calculate the matrix G dC
4709 gdc(j,i,ind)=GGinv(i,ind)*dC(j,k)
4714 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4715 .and.(mnum.ne.5)) then
4718 gdc(j,i,ind)=GGinv(i,ind)*dC(j,k+nres)
4724 ! write (iout,*) "gdc"
4726 ! write (iout,*) "i",i
4728 ! write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
4732 ! Calculate the matrix of the system of equations
4739 Cmat(ind,j)=Cmat(ind,j)+dC(k,i)*gdc(k,ind,j)
4745 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4746 .and.(mnum.ne.5)) then
4751 Cmat(ind,j)=Cmat(ind,j)+dC(k,i+nres)*gdc(k,ind,j)
4756 ! Calculate the scalar product dC o d_t_new
4760 x(ind)=scalar(d_t(1,i),dC(1,i))
4764 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4765 .and.(mnum.ne.5)) then
4767 x(ind)=scalar(d_t(1,i+nres),dC(1,i+nres))
4771 write (iout,*) "Velocities and violations"
4775 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4776 i,ind,(d_t(j,i),j=1,3),x(ind)
4780 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4781 .and.(mnum.ne.5)) then
4783 write (iout,'(2i5,3f10.5,5x,e15.5)') &
4784 i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind)
4790 if (dabs(x(i)).gt.xmax) then
4794 if (xmax.lt.tol_rattle) then
4799 write (iout,*) "Matrix Cmat"
4800 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
4802 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
4803 ! Add constraint term to velocities
4810 xx = xx+x(ii)*gdc(j,ind,ii)
4812 d_t(j,i)=d_t(j,i)-xx
4817 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4818 .and.(mnum.ne.5)) then
4823 xx = xx+x(ii)*gdc(j,ind,ii)
4825 d_t(j,i+nres)=d_t(j,i+nres)-xx
4831 "New velocities, Lagrange multipliers violations"
4835 if (lprn) write (iout,'(2i5,3f10.5,5x,2e15.5)') &
4836 i,ind,(d_t(j,i),j=1,3),x(ind),scalar(d_t(1,i),dC(1,i))
4840 if (itype(i,1).ne.10 .and. itype(i,mnum).ne.ntyp1_molec(mnum)&
4843 write (iout,'(2i5,3f10.5,5x,2e15.5)') &
4844 i+nres,ind,(d_t(j,i+nres),j=1,3),x(ind),&
4845 scalar(d_t(1,i+nres),dC(1,i+nres))
4851 10 write (iout,*) "Error - singularity in solving the system",&
4852 " of equations for Lagrange multipliers."
4856 "RATTLE inactive; use -DRATTLE option at compile time."
4859 end subroutine rattle2
4860 !-----------------------------------------------------------------------------
4861 subroutine rattle_brown
4862 ! RATTLE/LINCS algorithm for Brownian dynamics, UNRES
4866 ! implicit real*8 (a-h,o-z)
4867 ! include 'DIMENSIONS'
4869 ! include 'COMMON.CONTROL'
4870 ! include 'COMMON.VAR'
4871 ! include 'COMMON.MD'
4873 ! include 'COMMON.LANGEVIN'
4875 ! include 'COMMON.LANGEVIN.lang0'
4877 ! include 'COMMON.CHAIN'
4878 ! include 'COMMON.DERIV'
4879 ! include 'COMMON.GEO'
4880 ! include 'COMMON.LOCAL'
4881 ! include 'COMMON.INTERACT'
4882 ! include 'COMMON.IOUNITS'
4883 ! include 'COMMON.NAMES'
4884 ! include 'COMMON.TIME1'
4885 !el real(kind=8) :: gginv(2*nres,2*nres),&
4886 !el gdc(3,2*nres,2*nres)
4887 real(kind=8) :: dC_uncor(3,2*nres) !,&
4888 !el real(kind=8) :: Cmat(2*nres,2*nres)
4889 real(kind=8) :: x(2*nres) !maxres2=2*maxres
4890 !el common /przechowalnia/ GGinv,gdc,Cmat,nbond
4891 !el common /przechowalnia/ nbond
4892 integer :: max_rattle = 5
4893 logical :: lprn = .false., lprn1 = .false., not_done
4894 real(kind=8) :: tol_rattle = 1.0d-5
4898 !el /common/ przechowalnia
4899 if(.not.allocated(GGinv)) allocate(GGinv(nres2,nres2))
4900 if(.not.allocated(gdc)) allocate(gdc(3,nres2,nres2))
4901 if(.not.allocated(Cmat)) allocate(Cmat(nres2,nres2))
4904 if (lprn) write (iout,*) "RATTLE_BROWN"
4907 if (itype(i,1).ne.10) nbond=nbond+1
4909 ! Make a folded form of the Ginv-matrix
4922 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4926 if (itype(k,1).ne.10) then
4930 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4937 if (itype(i,1).ne.10) then
4947 if (j.eq.1 .and. l.eq.1) GGinv(ii,jj)=fricmat(ind,ind1)
4951 if (itype(k,1).ne.10) then
4955 if (j.eq.1 .and. l.eq.1)GGinv(ii,jj)=fricmat(ind,ind1)
4963 write (iout,*) "Matrix GGinv"
4964 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,GGinv)
4970 if (iter.gt.max_rattle) then
4971 write (iout,*) "Error - too many iterations in RATTLE."
4974 ! Calculate the matrix C = GG**(-1) dC_old o dC
4979 dC_uncor(j,ind1)=dC(j,i)
4983 if (itype(i,1).ne.10) then
4986 dC_uncor(j,ind1)=dC(j,i+nres)
4995 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k)
4999 if (itype(k,1).ne.10) then
5002 gdc(j,i,ind)=GGinv(i,ind)*dC_old(j,k+nres)
5007 ! Calculate deviations from standard virtual-bond lengths
5011 x(ind)=vbld(i+1)**2-vbl**2
5014 if (itype(i,1).ne.10) then
5016 x(ind)=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
5020 write (iout,*) "Coordinates and violations"
5022 write(iout,'(i5,3f10.5,5x,e15.5)') &
5023 i,(dC_uncor(j,i),j=1,3),x(i)
5025 write (iout,*) "Velocities and violations"
5029 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5030 i,ind,(d_t(j,i),j=1,3),scalar(d_t(1,i),dC_old(1,i))
5033 if (itype(i,1).ne.10) then
5035 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5036 i+nres,ind,(d_t(j,i+nres),j=1,3),&
5037 scalar(d_t(1,i+nres),dC_old(1,i+nres))
5040 write (iout,*) "gdc"
5042 write (iout,*) "i",i
5044 write (iout,'(i5,3f10.5)') j,(gdc(k,j,i),k=1,3)
5050 if (dabs(x(i)).gt.xmax) then
5054 if (xmax.lt.tol_rattle) then
5058 ! Calculate the matrix of the system of equations
5063 Cmat(i,j)=Cmat(i,j)+dC_uncor(k,i)*gdc(k,i,j)
5068 write (iout,*) "Matrix Cmat"
5069 call MATOUT(nbond,nbond,MAXRES2,MAXRES2,Cmat)
5071 call gauss(Cmat,X,MAXRES2,nbond,1,*10)
5072 ! Add constraint term to positions
5079 xx = xx+x(ii)*gdc(j,ind,ii)
5082 d_t(j,i)=d_t(j,i)+xx/d_time
5087 if (itype(i,1).ne.10) then
5092 xx = xx+x(ii)*gdc(j,ind,ii)
5095 d_t(j,i+nres)=d_t(j,i+nres)+xx/d_time
5096 dC(j,i+nres)=dC(j,i+nres)+xx
5100 ! Rebuild the chain using the new coordinates
5101 call chainbuild_cart
5103 write (iout,*) "New coordinates, Lagrange multipliers,",&
5104 " and differences between actual and standard bond lengths"
5108 xx=vbld(i+1)**2-vbl**2
5109 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
5110 i,(dC(j,i),j=1,3),x(ind),xx
5113 if (itype(i,1).ne.10) then
5115 xx=vbld(i+nres)**2-vbldsc0(1,itype(i,1))**2
5116 write (iout,'(i5,3f10.5,5x,f10.5,e15.5)') &
5117 i,(dC(j,i+nres),j=1,3),x(ind),xx
5120 write (iout,*) "Velocities and violations"
5124 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5125 i,ind,(d_t_new(j,i),j=1,3),scalar(d_t_new(1,i),dC_old(1,i))
5128 if (itype(i,1).ne.10) then
5130 write (iout,'(2i5,3f10.5,5x,e15.5)') &
5131 i+nres,ind,(d_t_new(j,i+nres),j=1,3),&
5132 scalar(d_t_new(1,i+nres),dC_old(1,i+nres))
5139 10 write (iout,*) "Error - singularity in solving the system",&
5140 " of equations for Lagrange multipliers."
5144 "RATTLE inactive; use -DRATTLE option at compile time"
5147 end subroutine rattle_brown
5148 !-----------------------------------------------------------------------------
5150 !-----------------------------------------------------------------------------
5151 subroutine friction_force
5156 ! implicit real*8 (a-h,o-z)
5157 ! include 'DIMENSIONS'
5158 ! include 'COMMON.VAR'
5159 ! include 'COMMON.CHAIN'
5160 ! include 'COMMON.DERIV'
5161 ! include 'COMMON.GEO'
5162 ! include 'COMMON.LOCAL'
5163 ! include 'COMMON.INTERACT'
5164 ! include 'COMMON.MD'
5166 ! include 'COMMON.LANGEVIN'
5168 ! include 'COMMON.LANGEVIN.lang0'
5170 ! include 'COMMON.IOUNITS'
5171 !el real(kind=8),dimension(6*nres) :: gamvec !(MAXRES6) maxres6=6*maxres
5172 !el common /syfek/ gamvec
5173 real(kind=8) :: vv(3),vvtot(3,nres),v_work(6*nres) !,&
5174 !el ginvfric(2*nres,2*nres) !maxres2=2*maxres
5175 !el common /przechowalnia/ ginvfric
5177 logical :: lprn, checkmode
5178 integer :: i,j,ind,k,nres2,nres6,mnum
5183 ! if (large) lprn=.true.
5184 ! if (large) checkmode=.true.
5185 if(.not.allocated(gamvec)) allocate(gamvec(nres6)) !(MAXRES6)
5186 if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
5194 d_t_work(j)=d_t(j,0)
5199 d_t_work(ind+j)=d_t(j,i)
5205 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5206 .and.(mnum.ne.5)) then
5208 d_t_work(ind+j)=d_t(j,i+nres)
5214 call fricmat_mult(d_t_work,fric_work)
5216 if (.not.checkmode) return
5219 write (iout,*) "d_t_work and fric_work"
5221 write (iout,'(i3,2e15.5)') i,d_t_work(i),fric_work(i)
5225 friction(j,0)=fric_work(j)
5230 friction(j,i)=fric_work(ind+j)
5236 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5237 .and.(mnum.ne.5)) then
5238 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5240 friction(j,i+nres)=fric_work(ind+j)
5246 write(iout,*) "Friction backbone"
5248 write(iout,'(i5,3e15.5,5x,3e15.5)') &
5249 i,(friction(j,i),j=1,3),(d_t(j,i),j=1,3)
5251 write(iout,*) "Friction side chain"
5253 write(iout,'(i5,3e15.5,5x,3e15.5)') &
5254 i,(friction(j,i+nres),j=1,3),(d_t(j,i+nres),j=1,3)
5263 vvtot(j,i)=vv(j)+0.5d0*d_t(j,i)
5264 vvtot(j,i+nres)=vv(j)+d_t(j,i+nres)
5265 vv(j)=vv(j)+d_t(j,i)
5268 write (iout,*) "vvtot backbone and sidechain"
5270 write (iout,'(i5,3e15.5,5x,3e15.5)') i,(vvtot(j,i),j=1,3),&
5271 (vvtot(j,i+nres),j=1,3)
5276 v_work(ind+j)=vvtot(j,i)
5282 v_work(ind+j)=vvtot(j,i+nres)
5286 write (iout,*) "v_work gamvec and site-based friction forces"
5288 write (iout,'(i5,3e15.5)') i,v_work(i),gamvec(i),&
5292 ! fric_work1(i)=0.0d0
5294 ! fric_work1(i)=fric_work1(i)-A(j,i)*gamvec(j)*v_work(j)
5297 ! write (iout,*) "fric_work and fric_work1"
5299 ! write (iout,'(i5,2e15.5)') i,fric_work(i),fric_work1(i)
5305 ginvfric(i,j)=ginvfric(i,j)+ginv(i,k)*fricmat(k,j)
5309 write (iout,*) "ginvfric"
5311 write (iout,'(i5,100f8.3)') i,(ginvfric(i,j),j=1,dimen)
5313 write (iout,*) "symmetry check"
5316 write (iout,*) i,j,ginvfric(i,j)-ginvfric(j,i)
5321 end subroutine friction_force
5322 !-----------------------------------------------------------------------------
5323 subroutine setup_fricmat
5327 use control_data, only:time_Bcast
5328 use control, only:tcpu
5330 ! implicit real*8 (a-h,o-z)
5334 real(kind=8) :: time00
5336 ! include 'DIMENSIONS'
5337 ! include 'COMMON.VAR'
5338 ! include 'COMMON.CHAIN'
5339 ! include 'COMMON.DERIV'
5340 ! include 'COMMON.GEO'
5341 ! include 'COMMON.LOCAL'
5342 ! include 'COMMON.INTERACT'
5343 ! include 'COMMON.MD'
5344 ! include 'COMMON.SETUP'
5345 ! include 'COMMON.TIME1'
5346 ! integer licznik /0/
5349 ! include 'COMMON.LANGEVIN'
5351 ! include 'COMMON.LANGEVIN.lang0'
5353 ! include 'COMMON.IOUNITS'
5355 integer :: i,j,ind,ind1,m
5356 logical :: lprn = .false.
5357 real(kind=8) :: dtdi !el ,gamvec(2*nres)
5358 !el real(kind=8),dimension(2*nres,2*nres) :: ginvfric,fcopy
5359 ! real(kind=8),allocatable,dimension(:,:) :: fcopy
5360 !el real(kind=8),dimension(2*nres*(2*nres+1)/2) :: Ghalf !(mmaxres2) (mmaxres2=(maxres2*(maxres2+1)/2))
5361 !el common /syfek/ gamvec
5362 real(kind=8) :: work(8*2*nres)
5363 integer :: iwork(2*nres)
5364 !el common /przechowalnia/ ginvfric,Ghalf,fcopy
5365 integer :: ii,iti,k,l,nzero,nres2,nres6,ierr,mnum
5369 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
5370 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5371 if (fg_rank.ne.king) goto 10
5376 if(.not.allocated(gamvec)) allocate(gamvec(nres2)) !(MAXRES2)
5377 if(.not.allocated(ginvfric)) allocate(ginvfric(nres2,nres2)) !maxres2=2*maxres
5378 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5379 !el allocate(fcopy(nres2,nres2)) !maxres2=2*maxres
5380 if(.not.allocated(Ghalf)) allocate(Ghalf(nres2*(nres2+1)/2)) !maxres2=2*maxres
5382 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
5383 ! Zeroing out fricmat
5389 ! Load the friction coefficients corresponding to peptide groups
5394 gamvec(ind1)=gamp(mnum)
5396 ! Load the friction coefficients corresponding to side chains
5400 gamsc(ntyp1_molec(j),j)=1.0d0
5407 gamvec(ii)=gamsc(iabs(iti),mnum)
5409 if (surfarea) call sdarea(gamvec)
5411 ! write (iout,*) "Matrix A and vector gamma"
5413 ! write (iout,'(i2,$)') i
5415 ! write (iout,'(f4.1,$)') A(i,j)
5417 ! write (iout,'(f8.3)') gamvec(i)
5421 write (iout,*) "Vector gamvec"
5423 write (iout,'(i5,f10.5)') i, gamvec(i)
5427 ! The friction matrix
5432 dtdi=dtdi+A(j,k)*A(j,i)*gamvec(j)
5439 write (iout,'(//a)') "Matrix fricmat"
5440 call matout2(dimen,dimen,nres2,nres2,fricmat)
5442 if (lang.eq.2 .or. lang.eq.3) then
5443 ! Mass-scale the friction matrix if non-direct integration will be performed
5449 Ginvfric(i,j)=Ginvfric(i,j)+ &
5450 Gsqrm(i,k)*Gsqrm(l,j)*fricmat(k,l)
5455 ! Diagonalize the friction matrix
5460 Ghalf(ind)=Ginvfric(i,j)
5463 call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
5466 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
5467 " mass-scaled friction matrix"
5468 call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
5470 ! Precompute matrices for tinker stochastic integrator
5477 mt1(i,j)=mt1(i,j)+fricvec(k,i)*gsqrm(k,j)
5478 mt2(i,j)=mt2(i,j)+fricvec(k,i)*gsqrp(k,j)
5484 else if (lang.eq.4) then
5485 ! Diagonalize the friction matrix
5490 Ghalf(ind)=fricmat(i,j)
5493 call gldiag(nres2,dimen,dimen,Ghalf,work,fricgam,fricvec,&
5496 write (iout,'(//2a)') "Eigenvectors and eigenvalues of the",&
5498 call eigout(dimen,dimen,nres2,nres2,fricvec,fricgam)
5500 ! Determine the number of zero eigenvalues of the friction matrix
5501 nzero=max0(dimen-dimen1,0)
5502 ! do while (fricgam(nzero+1).le.1.0d-5 .and. nzero.lt.dimen)
5505 write (iout,*) "Number of zero eigenvalues:",nzero
5510 fricmat(i,j)=fricmat(i,j) &
5511 +fricvec(i,k)*fricvec(j,k)/fricgam(k)
5516 write (iout,'(//a)') "Generalized inverse of fricmat"
5517 call matout(dimen,dimen,nres6,nres6,fricmat)
5522 if (nfgtasks.gt.1) then
5523 if (fg_rank.eq.0) then
5524 ! The matching BROADCAST for fg processors is called in ERGASTULUM
5530 call MPI_Bcast(10,1,MPI_INTEGER,king,FG_COMM,IERROR)
5532 time_Bcast=time_Bcast+MPI_Wtime()-time00
5534 time_Bcast=time_Bcast+tcpu()-time00
5536 ! print *,"Processor",myrank,
5537 ! & " BROADCAST iorder in SETUP_FRICMAT"
5540 write (iout,*) "setup_fricmat licznik"!,licznik !sp
5546 ! Scatter the friction matrix
5547 call MPI_Scatterv(fricmat(1,1),nginv_counts(0),&
5548 nginv_start(0),MPI_DOUBLE_PRECISION,fcopy(1,1),&
5549 myginv_ng_count,MPI_DOUBLE_PRECISION,king,FG_COMM,IERROR)
5552 time_scatter=time_scatter+MPI_Wtime()-time00
5553 time_scatter_fmat=time_scatter_fmat+MPI_Wtime()-time00
5555 time_scatter=time_scatter+tcpu()-time00
5556 time_scatter_fmat=time_scatter_fmat+tcpu()-time00
5560 do j=1,2*my_ng_count
5561 fricmat(j,i)=fcopy(i,j)
5564 ! write (iout,*) "My chunk of fricmat"
5565 ! call MATOUT2(my_ng_count,dimen,maxres2,maxres2,fcopy)
5569 end subroutine setup_fricmat
5570 !-----------------------------------------------------------------------------
5571 subroutine stochastic_force(stochforcvec)
5574 use random, only:anorm_distr
5575 ! implicit real*8 (a-h,o-z)
5576 ! include 'DIMENSIONS'
5577 use control, only: tcpu
5582 ! include 'COMMON.VAR'
5583 ! include 'COMMON.CHAIN'
5584 ! include 'COMMON.DERIV'
5585 ! include 'COMMON.GEO'
5586 ! include 'COMMON.LOCAL'
5587 ! include 'COMMON.INTERACT'
5588 ! include 'COMMON.MD'
5589 ! include 'COMMON.TIME1'
5591 ! include 'COMMON.LANGEVIN'
5593 ! include 'COMMON.LANGEVIN.lang0'
5595 ! include 'COMMON.IOUNITS'
5597 real(kind=8) :: x,sig,lowb,highb
5598 real(kind=8) :: ff(3),force(3,0:2*nres),zeta2,lowb2
5599 real(kind=8) :: highb2,sig2,forcvec(6*nres),stochforcvec(6*nres)
5600 real(kind=8) :: time00
5601 logical :: lprn = .false.
5602 integer :: i,j,ind,mnum
5606 stochforc(j,i)=0.0d0
5616 ! Compute the stochastic forces acting on bodies. Store in force.
5622 force(j,i)=anorm_distr(x,sig,lowb,highb)
5630 force(j,i+nres)=anorm_distr(x,sig2,lowb2,highb2)
5634 time_fsample=time_fsample+MPI_Wtime()-time00
5636 time_fsample=time_fsample+tcpu()-time00
5638 ! Compute the stochastic forces acting on virtual-bond vectors.
5644 stochforc(j,i)=ff(j)+0.5d0*force(j,i)
5647 ff(j)=ff(j)+force(j,i)
5649 ! if (itype(i+1,1).ne.ntyp1) then
5651 if (itype(i+1,mnum).ne.ntyp1_molec(mnum)) then
5653 stochforc(j,i)=stochforc(j,i)+force(j,i+nres+1)
5654 ff(j)=ff(j)+force(j,i+nres+1)
5659 stochforc(j,0)=ff(j)+force(j,nnt+nres)
5663 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5664 .and.(mnum.ne.5)) then
5665 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5667 stochforc(j,i+nres)=force(j,i+nres)
5673 stochforcvec(j)=stochforc(j,0)
5678 stochforcvec(ind+j)=stochforc(j,i)
5684 if ((itype(i,1).ne.10).and.(itype(i,mnum).ne.ntyp1_molec(mnum))&
5685 .and.(mnum.ne.5)) then
5686 ! if ((itype(i,1).ne.10).and.(itype(i,1).ne.ntyp1)) then
5688 stochforcvec(ind+j)=stochforc(j,i+nres)
5694 write (iout,*) "stochforcvec"
5696 write(iout,'(i5,e15.5)') i,stochforcvec(i)
5698 write(iout,*) "Stochastic forces backbone"
5700 write(iout,'(i5,3e15.5)') i,(stochforc(j,i),j=1,3)
5702 write(iout,*) "Stochastic forces side chain"
5704 write(iout,'(i5,3e15.5)') &
5705 i,(stochforc(j,i+nres),j=1,3)
5713 write (iout,*) i,ind
5715 forcvec(ind+j)=force(j,i)
5720 write (iout,*) i,ind
5722 forcvec(j+ind)=force(j,i+nres)
5727 write (iout,*) "forcvec"
5731 write (iout,'(2i3,2f10.5)') i,j,force(j,i),&
5738 write (iout,'(2i3,2f10.5)') i,j,force(j,i+nres),&
5747 end subroutine stochastic_force
5748 !-----------------------------------------------------------------------------
5749 subroutine sdarea(gamvec)
5751 ! Scale the friction coefficients according to solvent accessible surface areas
5752 ! Code adapted from TINKER
5756 ! implicit real*8 (a-h,o-z)
5757 ! include 'DIMENSIONS'
5758 ! include 'COMMON.CONTROL'
5759 ! include 'COMMON.VAR'
5760 ! include 'COMMON.MD'
5762 ! include 'COMMON.LANGEVIN'
5764 ! include 'COMMON.LANGEVIN.lang0'
5766 ! include 'COMMON.CHAIN'
5767 ! include 'COMMON.DERIV'
5768 ! include 'COMMON.GEO'
5769 ! include 'COMMON.LOCAL'
5770 ! include 'COMMON.INTERACT'
5771 ! include 'COMMON.IOUNITS'
5772 ! include 'COMMON.NAMES'
5773 real(kind=8),dimension(2*nres) :: radius,gamvec !(maxres2)
5774 real(kind=8),parameter :: twosix = 1.122462048309372981d0
5775 logical :: lprn = .false.
5776 real(kind=8) :: probe,area,ratio
5777 integer :: i,j,ind,iti,mnum
5779 ! determine new friction coefficients every few SD steps
5781 ! set the atomic radii to estimates of sigma values
5783 ! print *,"Entered sdarea"
5789 ! Load peptide group radii
5792 radius(i)=pstok(mnum)
5794 ! Load side chain radii
5798 radius(i+nres)=restok(iti,mnum)
5801 ! write (iout,*) "i",i," radius",radius(i)
5804 radius(i) = radius(i) / twosix
5805 if (radius(i) .ne. 0.0d0) radius(i) = radius(i) + probe
5808 ! scale atomic friction coefficients by accessible area
5810 if (lprn) write (iout,*) &
5811 "Original gammas, surface areas, scaling factors, new gammas, ",&
5812 "std's of stochastic forces"
5815 if (radius(i).gt.0.0d0) then
5816 call surfatom (i,area,radius)
5817 ratio = dmax1(area/(4.0d0*pi*radius(i)**2),1.0d-1)
5818 if (lprn) write (iout,'(i5,3f10.5,$)') &
5819 i,gamvec(ind+1),area,ratio
5822 gamvec(ind) = ratio * gamvec(ind)
5825 stdforcp(i)=stdfp(mnum)*dsqrt(gamvec(ind))
5826 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcp(i)
5830 if (radius(i+nres).gt.0.0d0) then
5831 call surfatom (i+nres,area,radius)
5832 ratio = dmax1(area/(4.0d0*pi*radius(i+nres)**2),1.0d-1)
5833 if (lprn) write (iout,'(i5,3f10.5,$)') &
5834 i,gamvec(ind+1),area,ratio
5837 gamvec(ind) = ratio * gamvec(ind)
5840 stdforcsc(i)=stdfsc(itype(i,mnum),mnum)*dsqrt(gamvec(ind))
5841 if (lprn) write (iout,'(2f10.5)') gamvec(ind),stdforcsc(i)
5846 end subroutine sdarea
5847 !-----------------------------------------------------------------------------
5849 !-----------------------------------------------------------------------------
5852 ! ###################################################
5853 ! ## COPYRIGHT (C) 1996 by Jay William Ponder ##
5854 ! ## All Rights Reserved ##
5855 ! ###################################################
5857 ! ################################################################
5859 ! ## subroutine surfatom -- exposed surface area of an atom ##
5861 ! ################################################################
5864 ! "surfatom" performs an analytical computation of the surface
5865 ! area of a specified atom; a simplified version of "surface"
5867 ! literature references:
5869 ! T. J. Richmond, "Solvent Accessible Surface Area and
5870 ! Excluded Volume in Proteins", Journal of Molecular Biology,
5873 ! L. Wesson and D. Eisenberg, "Atomic Solvation Parameters
5874 ! Applied to Molecular Dynamics of Proteins in Solution",
5875 ! Protein Science, 1, 227-235 (1992)
5877 ! variables and parameters:
5879 ! ir number of atom for which area is desired
5880 ! area accessible surface area of the atom
5881 ! radius radii of each of the individual atoms
5884 subroutine surfatom(ir,area,radius)
5886 ! implicit real*8 (a-h,o-z)
5887 ! include 'DIMENSIONS'
5889 ! include 'COMMON.GEO'
5890 ! include 'COMMON.IOUNITS'
5892 integer :: nsup,nstart_sup
5893 ! double precision c,dc,dc_old,d_c_work,xloc,xrot,dc_norm
5894 ! common /chain/ c(3,maxres2+2),dc(3,0:maxres2),dc_old(3,0:maxres2),
5895 ! & xloc(3,maxres),xrot(3,maxres),dc_norm(3,0:maxres2),
5896 ! & dc_work(MAXRES6),nres,nres0
5897 integer,parameter :: maxarc=300
5901 integer :: mi,ni,narc
5902 integer :: key(maxarc)
5903 integer :: intag(maxarc)
5904 integer :: intag1(maxarc)
5905 real(kind=8) :: area,arcsum
5906 real(kind=8) :: arclen,exang
5907 real(kind=8) :: delta,delta2
5908 real(kind=8) :: eps,rmove
5909 real(kind=8) :: xr,yr,zr
5910 real(kind=8) :: rr,rrsq
5911 real(kind=8) :: rplus,rminus
5912 real(kind=8) :: axx,axy,axz
5913 real(kind=8) :: ayx,ayy
5914 real(kind=8) :: azx,azy,azz
5915 real(kind=8) :: uxj,uyj,uzj
5916 real(kind=8) :: tx,ty,tz
5917 real(kind=8) :: txb,tyb,td
5918 real(kind=8) :: tr2,tr,txr,tyr
5919 real(kind=8) :: tk1,tk2
5920 real(kind=8) :: thec,the,t,tb
5921 real(kind=8) :: txk,tyk,tzk
5922 real(kind=8) :: t1,ti,tf,tt
5923 real(kind=8) :: txj,tyj,tzj
5924 real(kind=8) :: ccsq,cc,xysq
5925 real(kind=8) :: bsqk,bk,cosine
5926 real(kind=8) :: dsqj,gi,pix2
5927 real(kind=8) :: therk,dk,gk
5928 real(kind=8) :: risqk,rik
5929 real(kind=8) :: radius(2*nres) !(maxatm) (maxatm=maxres2)
5930 real(kind=8) :: ri(maxarc),risq(maxarc)
5931 real(kind=8) :: ux(maxarc),uy(maxarc),uz(maxarc)
5932 real(kind=8) :: xc(maxarc),yc(maxarc),zc(maxarc)
5933 real(kind=8) :: xc1(maxarc),yc1(maxarc),zc1(maxarc)
5934 real(kind=8) :: dsq(maxarc),bsq(maxarc)
5935 real(kind=8) :: dsq1(maxarc),bsq1(maxarc)
5936 real(kind=8) :: arci(maxarc),arcf(maxarc)
5937 real(kind=8) :: ex(maxarc),lt(maxarc),gr(maxarc)
5938 real(kind=8) :: b(maxarc),b1(maxarc),bg(maxarc)
5939 real(kind=8) :: kent(maxarc),kout(maxarc)
5940 real(kind=8) :: ther(maxarc)
5941 logical :: moved,top
5942 logical :: omit(maxarc)
5945 ! maxatm = 2*nres !maxres2 maxres2=2*maxres
5946 ! maxlight = 8*maxatm
5949 ! maxtors = 4*maxatm
5951 ! zero out the surface area for the sphere of interest
5954 ! write (2,*) "ir",ir," radius",radius(ir)
5955 if (radius(ir) .eq. 0.0d0) return
5957 ! set the overlap significance and connectivity shift
5961 delta2 = delta * delta
5966 ! store coordinates and radius of the sphere of interest
5974 ! initialize values of some counters and summations
5983 ! test each sphere to see if it overlaps the sphere of interest
5986 if (i.eq.ir .or. radius(i).eq.0.0d0) goto 30
5987 rplus = rr + radius(i)
5989 if (abs(tx) .ge. rplus) goto 30
5991 if (abs(ty) .ge. rplus) goto 30
5993 if (abs(tz) .ge. rplus) goto 30
5995 ! check for sphere overlap by testing distance against radii
5997 xysq = tx*tx + ty*ty
5998 if (xysq .lt. delta2) then
6005 if (rplus-cc .le. delta) goto 30
6006 rminus = rr - radius(i)
6008 ! check to see if sphere of interest is completely buried
6010 if (cc-abs(rminus) .le. delta) then
6011 if (rminus .le. 0.0d0) goto 170
6015 ! check for too many overlaps with sphere of interest
6017 if (io .ge. maxarc) then
6019 20 format (/,' SURFATOM -- Increase the Value of MAXARC')
6023 ! get overlap between current sphere and sphere of interest
6032 gr(io) = (ccsq+rplus*rminus) / (2.0d0*rr*b1(io))
6038 ! case where no other spheres overlap the sphere of interest
6041 area = 4.0d0 * pi * rrsq
6045 ! case where only one sphere overlaps the sphere of interest
6048 area = pix2 * (1.0d0 + gr(1))
6049 area = mod(area,4.0d0*pi) * rrsq
6053 ! case where many spheres intersect the sphere of interest;
6054 ! sort the intersecting spheres by their degree of overlap
6056 call sort2 (io,gr,key)
6059 intag(i) = intag1(k)
6068 ! get radius of each overlap circle on surface of the sphere
6073 risq(i) = rrsq - gi*gi
6074 ri(i) = sqrt(risq(i))
6075 ther(i) = 0.5d0*pi - asin(min(1.0d0,max(-1.0d0,gr(i))))
6078 ! find boundary of inaccessible area on sphere of interest
6081 if (.not. omit(k)) then
6088 ! check to see if J circle is intersecting K circle;
6089 ! get distance between circle centers and sum of radii
6092 if (omit(j)) goto 60
6093 cc = (txk*xc(j)+tyk*yc(j)+tzk*zc(j))/(bk*b(j))
6094 cc = acos(min(1.0d0,max(-1.0d0,cc)))
6095 td = therk + ther(j)
6097 ! check to see if circles enclose separate regions
6099 if (cc .ge. td) goto 60
6101 ! check for circle J completely inside circle K
6103 if (cc+ther(j) .lt. therk) goto 40
6105 ! check for circles that are essentially parallel
6107 if (cc .gt. delta) goto 50
6112 ! check to see if sphere of interest is completely buried
6115 if (pix2-cc .le. td) goto 170
6121 ! find T value of circle intersections
6124 if (omit(k)) goto 110
6139 ! rotation matrix elements
6151 if (.not. omit(j)) then
6156 ! rotate spheres so K vector colinear with z-axis
6158 uxj = txj*axx + tyj*axy - tzj*axz
6159 uyj = tyj*ayy - txj*ayx
6160 uzj = txj*azx + tyj*azy + tzj*azz
6161 cosine = min(1.0d0,max(-1.0d0,uzj/b(j)))
6162 if (acos(cosine) .lt. therk+ther(j)) then
6163 dsqj = uxj*uxj + uyj*uyj
6168 tr2 = risqk*dsqj - tb*tb
6174 ! get T values of intersection for K circle
6177 tb = min(1.0d0,max(-1.0d0,tb))
6179 if (tyb-txr .lt. 0.0d0) tk1 = pix2 - tk1
6181 tb = min(1.0d0,max(-1.0d0,tb))
6183 if (tyb+txr .lt. 0.0d0) tk2 = pix2 - tk2
6184 thec = (rrsq*uzj-gk*bg(j)) / (rik*ri(j)*b(j))
6185 if (abs(thec) .lt. 1.0d0) then
6187 else if (thec .ge. 1.0d0) then
6189 else if (thec .le. -1.0d0) then
6193 ! see if "tk1" is entry or exit point; check t=0 point;
6194 ! "ti" is exit point, "tf" is entry point
6196 cosine = min(1.0d0,max(-1.0d0, &
6197 (uzj*gk-uxj*rik)/(b(j)*rr)))
6198 if ((acos(cosine)-ther(j))*(tk2-tk1) .le. 0.0d0) then
6206 if (narc .ge. maxarc) then
6208 70 format (/,' SURFATOM -- Increase the Value',&
6212 if (tf .le. ti) then
6233 ! special case; K circle without intersections
6235 if (narc .le. 0) goto 90
6237 ! general case; sum up arclength and set connectivity code
6239 call sort2 (narc,arci,key)
6244 if (narc .gt. 1) then
6247 if (t .lt. arci(j)) then
6248 arcsum = arcsum + arci(j) - t
6249 exang = exang + ex(ni)
6251 if (jb .ge. maxarc) then
6253 80 format (/,' SURFATOM -- Increase the Value',&
6258 kent(jb) = maxarc*i + k
6260 kout(jb) = maxarc*k + i
6269 arcsum = arcsum + pix2 - t
6271 exang = exang + ex(ni)
6274 kent(jb) = maxarc*i + k
6276 kout(jb) = maxarc*k + i
6283 arclen = arclen + gr(k)*arcsum
6286 if (arclen .eq. 0.0d0) goto 170
6287 if (jb .eq. 0) goto 150
6289 ! find number of independent boundaries and check connectivity
6293 if (kout(k) .ne. 0) then
6300 if (m .eq. kent(ii)) then
6303 if (j .eq. jb) goto 150
6315 ! attempt to fix connectivity error by moving atom slightly
6319 140 format (/,' SURFATOM -- Connectivity Error at Atom',i6)
6328 ! compute the exposed surface area for the sphere of interest
6331 area = ib*pix2 + exang + arclen
6332 area = mod(area,4.0d0*pi) * rrsq
6334 ! attempt to fix negative area by moving atom slightly
6336 if (area .lt. 0.0d0) then
6339 160 format (/,' SURFATOM -- Negative Area at Atom',i6)
6350 end subroutine surfatom
6351 !----------------------------------------------------------------
6352 !----------------------------------------------------------------
6353 subroutine alloc_MD_arrays
6354 !EL Allocation of arrays used by MD module
6356 integer :: nres2,nres6
6359 !----------------------
6363 allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
6364 allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
6365 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
6366 allocate(fricvec(nres2,nres2))
6367 allocate(pfric_mat(nres2,nres2),vfric_mat(nres2,nres2))
6368 allocate(afric_mat(nres2,nres2),prand_mat(nres2,nres2))
6369 allocate(vrand_mat1(nres2,nres2),vrand_mat2(nres2,nres2)) !(MAXRES2,MAXRES2)
6370 allocate(pfric0_mat(nres2,nres2,0:maxflag_stoch))
6371 allocate(afric0_mat(nres2,nres2,0:maxflag_stoch))
6372 allocate(vfric0_mat(nres2,nres2,0:maxflag_stoch))
6373 allocate(prand0_mat(nres2,nres2,0:maxflag_stoch))
6374 allocate(vrand0_mat1(nres2,nres2,0:maxflag_stoch))
6375 allocate(vrand0_mat2(nres2,nres2,0:maxflag_stoch)) !(MAXRES2,MAXRES2,0:maxflag_stoch)
6376 allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
6378 allocate(mt1(nres2,nres2),mt2(nres2,nres2),mt3(nres2,nres2)) !(maxres2,maxres2)
6379 !----------------------
6381 ! commom.langevin.lang0
6383 allocate(friction(3,0:nres2),stochforc(3,0:nres2)) !(3,0:MAXRES2)
6384 if(.not.allocated(fricmat)) allocate(fricmat(nres2,nres2))
6385 allocate(fricvec(nres2,nres2)) !(MAXRES2,MAXRES2)
6386 allocate(fric_work(nres6),stoch_work(nres6),fricgam(nres6)) !(MAXRES6)
6387 allocate(flag_stoch(0:maxflag_stoch)) !(0:maxflag_stoch)
6390 if(.not.allocated(fcopy)) allocate(fcopy(nres2,nres2))
6391 !----------------------
6392 ! commom.hairpin in CSA module
6393 !----------------------
6394 ! common.mce in MCM_MD module
6395 !----------------------
6397 ! common /mdgrad/ in module.energy
6398 ! common /back_constr/ in module.energy
6399 ! common /qmeas/ in module.energy
6402 allocate(potEcomp(0:n_ene+4)) !(0:n_ene+4)
6404 allocate(d_t(3,0:nres2),d_a(3,0:nres2),d_t_old(3,0:nres2)) !(3,0:MAXRES2)
6405 allocate(d_a_work(nres6)) !(6*MAXRES)
6407 allocate(DM(nres2),DU1(nres2),DU2(nres2))
6408 allocate(DMorig(nres2),DU1orig(nres2),DU2orig(nres2))
6410 write (iout,*) "Before A Allocation",nfgtasks-1
6412 allocate(Gmat(nres2,nres2),A(nres2,nres2))
6413 if(.not.allocated(Ginv)) allocate(Ginv(nres2,nres2)) !in control: ergastulum
6414 allocate(Gsqrp(nres2,nres2),Gsqrm(nres2,nres2),Gvec(nres2,nres2)) !(maxres2,maxres2)
6416 allocate(Geigen(nres2)) !(maxres2)
6417 if(.not.allocated(vtot)) allocate(vtot(nres2)) !(maxres2)
6418 ! common /inertia/ in io_conf: parmread
6419 ! real(kind=8),dimension(:),allocatable :: ISC,msc !(ntyp+1)
6420 ! common /langevin/in io read_MDpar
6421 ! real(kind=8),dimension(:),allocatable :: gamsc !(ntyp1)
6422 ! real(kind=8),dimension(:),allocatable :: stdfsc !(ntyp)
6423 ! in io_conf: parmread
6424 ! real(kind=8),dimension(:),allocatable :: restok !(ntyp+1)
6425 ! common /mdpmpi/ in control: ergastulum
6426 if(.not.allocated(ng_start)) allocate(ng_start(0:nfgtasks-1))
6427 if(.not.allocated(ng_counts)) allocate(ng_counts(0:nfgtasks-1))
6428 if(.not.allocated(nginv_counts)) allocate(nginv_counts(0:nfgtasks-1)) !(0:MaxProcs-1)
6429 if(.not.allocated(nginv_start)) allocate(nginv_start(0:nfgtasks)) !(0:MaxProcs)
6430 !----------------------
6431 ! common.muca in read_muca
6432 ! common /double_muca/
6433 ! real(kind=8) :: elow,ehigh,factor,hbin,factor_min
6434 ! real(kind=8),dimension(:),allocatable :: emuca,nemuca,&
6435 ! nemuca2,hist !(4*maxres)
6436 ! common /integer_muca/
6437 ! integer :: nmuca,imtime,muca_smooth
6439 ! real(kind=8),dimension(:),allocatable :: elowi,ehighi !(maxprocs)
6440 !----------------------
6442 ! common /mdgrad/ in module.energy
6443 ! common /back_constr/ in module.energy
6444 ! common /qmeas/ in module.energy
6448 allocate(d_t_work(nres6),d_t_work_new(nres6),d_af_work(nres6))
6449 allocate(d_as_work(nres6),kinetic_force(nres6)) !(MAXRES6)
6450 allocate(d_t_new(3,0:nres2),d_a_old(3,0:nres2),d_a_short(3,0:nres2)) !,d_a !(3,0:MAXRES2)
6451 allocate(stdforcp(nres),stdforcsc(nres)) !(MAXRES)
6452 !----------------------
6454 allocate(D_ban(nres6)) !(MAXRES6) maxres6=6*maxres
6455 ! common /stochcalc/ stochforcvec
6456 allocate(stochforcvec(nres6)) !(MAXRES6) maxres6=6*maxres
6457 !----------------------
6459 end subroutine alloc_MD_arrays
6460 !-----------------------------------------------------------------------------
6461 !-----------------------------------------------------------------------------