2 c------------------------------------------------
3 c The driver for molecular dynamics subroutines
4 c------------------------------------------------
5 implicit real*8 (a-h,o-z)
11 include 'COMMON.SETUP'
12 include 'COMMON.CONTROL'
16 include 'COMMON.LANGEVIN'
18 include 'COMMON.LANGEVIN.lang0'
20 include 'COMMON.CHAIN'
21 include 'COMMON.DERIV'
23 include 'COMMON.LOCAL'
24 include 'COMMON.INTERACT'
25 include 'COMMON.IOUNITS'
26 include 'COMMON.NAMES'
27 include 'COMMON.TIME1'
28 include 'COMMON.HAIRPIN'
29 double precision cm(3),L(3),vcm(3)
31 double precision v_work(maxres6),v_transf(maxres6)
41 if (ilen(tmpdir).gt.0)
42 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_"
43 & //liczba(:ilen(liczba))//'.rst')
45 if (ilen(tmpdir).gt.0)
46 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_"//'.rst')
53 write (iout,'(20(1h=),a20,20(1h=))') "MD calculation started"
59 c Determine the inverse of the inertia matrix.
60 call setup_MD_matrices
64 t_MDsetup = MPI_Wtime()-tt0
66 t_MDsetup = tcpu()-tt0
69 c Entering the MD loop
75 if (lang.eq.2 .or. lang.eq.3) then
79 call sd_verlet_p_setup
81 call sd_verlet_ciccotti_setup
85 pfric0_mat(i,j,0)=pfric_mat(i,j)
86 afric0_mat(i,j,0)=afric_mat(i,j)
87 vfric0_mat(i,j,0)=vfric_mat(i,j)
88 prand0_mat(i,j,0)=prand_mat(i,j)
89 vrand0_mat1(i,j,0)=vrand_mat1(i,j)
90 vrand0_mat2(i,j,0)=vrand_mat2(i,j)
99 & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
101 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
105 else if (lang.eq.1 .or. lang.eq.4) then
109 t_langsetup=MPI_Wtime()-tt0
112 t_langsetup=tcpu()-tt0
115 do itime=1,n_timestep
117 if (large.and. mod(itime,ntwe).eq.0)
118 & write (iout,*) "itime",itime
120 if (lang.gt.0 .and. surfarea .and.
121 & mod(itime,reset_fricmat).eq.0) then
122 if (lang.eq.2 .or. lang.eq.3) then
126 call sd_verlet_p_setup
128 call sd_verlet_ciccotti_setup
132 pfric0_mat(i,j,0)=pfric_mat(i,j)
133 afric0_mat(i,j,0)=afric_mat(i,j)
134 vfric0_mat(i,j,0)=vfric_mat(i,j)
135 prand0_mat(i,j,0)=prand_mat(i,j)
136 vrand0_mat1(i,j,0)=vrand_mat1(i,j)
137 vrand0_mat2(i,j,0)=vrand_mat2(i,j)
142 flag_stoch(i)=.false.
145 else if (lang.eq.1 .or. lang.eq.4) then
148 write (iout,'(a,i10)')
149 & "Friction matrix reset based on surface area, itime",itime
151 if (reset_vel .and. tbf .and. lang.eq.0
152 & .and. mod(itime,count_reset_vel).eq.0) then
154 write(iout,'(a,f20.2)')
155 & "Velocities reset to random values, time",totT
158 d_t_old(j,i)=d_t(j,i)
162 if (reset_moment .and. mod(itime,count_reset_moment).eq.0) then
166 d_t(j,0)=d_t(j,0)-vcm(j)
169 kinetic_T=2.0d0/(dimen3*Rb)*EK
170 scalfac=dsqrt(T_bath/kinetic_T)
171 write(iout,'(a,f20.2)') "Momenta zeroed out, time",totT
174 d_t_old(j,i)=scalfac*d_t(j,i)
180 c Time-reversible RESPA algorithm
181 c (Tuckerman et al., J. Chem. Phys., 97, 1990, 1992)
182 call RESPA_step(itime)
184 c Variable time step algorithm.
185 call velverlet_step(itime)
189 call brown_step(itime)
191 print *,"Brown dynamics not here!"
193 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
199 if (mod(itime,ntwe).eq.0) call statout(itime)
212 if (itype(i).ne.10 .and. itype(i).ne.21) then
215 v_work(ind)=d_t(j,i+nres)
220 write (66,'(80f10.5)')
221 & ((d_t(j,i),j=1,3),i=0,nres-1),((d_t(j,i+nres),j=1,3),i=1,nres)
225 v_transf(i)=v_transf(i)+gvec(j,i)*v_work(j)
227 v_transf(i)= v_transf(i)*dsqrt(geigen(i))
229 write (67,'(80f10.5)') (v_transf(i),i=1,ind)
232 if (mod(itime,ntwx).eq.0) then
233 write (tytul,'("time",f8.2)') totT
235 call hairpin(.true.,nharp,iharp)
236 call secondary2(.true.)
237 call pdbout(potE,tytul,ipdb)
242 if (rstcount.eq.1000.or.itime.eq.n_timestep) then
243 open(irest2,file=rest2name,status='unknown')
244 write(irest2,*) totT,EK,potE,totE,t_bath
246 write (irest2,'(3e15.5)') (d_t(j,i),j=1,3)
249 write (irest2,'(3e15.5)') (dc(j,i),j=1,3)
260 write (iout,'(//35(1h=),a10,35(1h=)/10(/a40,1pe15.5))')
262 & 'MD calculations setup:',t_MDsetup,
263 & 'Energy & gradient evaluation:',t_enegrad,
264 & 'Stochastic MD setup:',t_langsetup,
265 & 'Stochastic MD step setup:',t_sdsetup,
267 write (iout,'(/28(1h=),a25,27(1h=))')
268 & ' End of MD calculation '
270 write (iout,*) "time for etotal",t_etotal," elong",t_elong,
272 write (iout,*) "time_fric",time_fric," time_stoch",time_stoch,
273 & " time_fricmatmult",time_fricmatmult," time_fsample ",
278 c-------------------------------------------------------------------------------
279 subroutine velverlet_step(itime)
280 c-------------------------------------------------------------------------------
281 c Perform a single velocity Verlet step; the time step can be rescaled if
282 c increments in accelerations exceed the threshold
283 c-------------------------------------------------------------------------------
284 implicit real*8 (a-h,o-z)
288 integer ierror,ierrcode
290 include 'COMMON.SETUP'
291 include 'COMMON.CONTROL'
295 include 'COMMON.LANGEVIN'
297 include 'COMMON.LANGEVIN.lang0'
299 include 'COMMON.CHAIN'
300 include 'COMMON.DERIV'
302 include 'COMMON.LOCAL'
303 include 'COMMON.INTERACT'
304 include 'COMMON.IOUNITS'
305 include 'COMMON.NAMES'
306 include 'COMMON.TIME1'
307 include 'COMMON.MUCA'
308 double precision vcm(3),incr(3)
309 double precision cm(3),L(3)
310 integer ilen,count,rstcount
313 integer maxcount_scale /20/
315 double precision stochforcvec(MAXRES6)
316 common /stochcalc/ stochforcvec
324 else if (lang.eq.2 .or. lang.eq.3) then
326 call stochastic_force(stochforcvec)
329 & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
331 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
338 icount_scale=icount_scale+1
339 if (icount_scale.gt.maxcount_scale) then
341 & "ERROR: too many attempts at scaling down the time step. ",
342 & "amax=",amax,"epdrift=",epdrift,
343 & "damax=",damax,"edriftmax=",edriftmax,
347 call MPI_Abort(MPI_COMM_WORLD,IERROR,IERRCODE)
351 c First step of the velocity Verlet algorithm
356 else if (lang.eq.3) then
358 call sd_verlet1_ciccotti
360 else if (lang.eq.1) then
365 c Build the chain from the newly calculated coordinates
367 if (rattle) call rattle1
369 if (large.and. mod(itime,ntwe).eq.0) then
370 write (iout,*) "Cartesian and internal coordinates: step 1"
375 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),
376 & (dc(j,i+nres),j=1,3)
378 write (iout,*) "Accelerations"
380 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
381 & (d_a(j,i+nres),j=1,3)
383 write (iout,*) "Velocities, step 1"
385 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
386 & (d_t(j,i+nres),j=1,3)
395 c Calculate energy and forces
397 call etotal(potEcomp)
398 if (large.and. mod(itime,ntwe).eq.0)
399 & call enerprint(potEcomp)
402 t_etotal=t_etotal+MPI_Wtime()-tt0
404 t_etotal=t_etotal+tcpu()-tt0
407 potE=potEcomp(0)-potEcomp(20)
409 c Get the new accelerations
412 t_enegrad=t_enegrad+MPI_Wtime()-tt0
414 t_enegrad=t_enegrad+tcpu()-tt0
416 c Determine maximum acceleration and scale down the timestep if needed
418 amax=amax/(itime_scal+1)**2
419 call predict_edrift(epdrift)
420 if (amax/(itime_scal+1).gt.damax .or. epdrift.gt.edriftmax) then
421 c Maximum acceleration or maximum predicted energy drift exceeded, rescale the time step
423 ifac_time=dmax1(dlog(amax/damax),dlog(epdrift/edriftmax))
425 itime_scal=itime_scal+ifac_time
426 c fac_time=dmin1(damax/amax,0.5d0)
427 fac_time=0.5d0**ifac_time
428 d_time=d_time*fac_time
429 if (lang.eq.2 .or. lang.eq.3) then
431 c write (iout,*) "Calling sd_verlet_setup: 1"
432 c Rescale the stochastic forces and recalculate or restore
433 c the matrices of tinker integrator
434 if (itime_scal.gt.maxflag_stoch) then
435 if (large) write (iout,'(a,i5,a)')
436 & "Calculate matrices for stochastic step;",
437 & " itime_scal ",itime_scal
439 call sd_verlet_p_setup
441 call sd_verlet_ciccotti_setup
443 write (iout,'(2a,i3,a,i3,1h.)')
444 & "Warning: cannot store matrices for stochastic",
445 & " integration because the index",itime_scal,
446 & " is greater than",maxflag_stoch
447 write (iout,'(2a)')"Increase MAXFLAG_STOCH or use direct",
448 & " integration Langevin algorithm for better efficiency."
449 else if (flag_stoch(itime_scal)) then
450 if (large) write (iout,'(a,i5,a,l1)')
451 & "Restore matrices for stochastic step; itime_scal ",
452 & itime_scal," flag ",flag_stoch(itime_scal)
455 pfric_mat(i,j)=pfric0_mat(i,j,itime_scal)
456 afric_mat(i,j)=afric0_mat(i,j,itime_scal)
457 vfric_mat(i,j)=vfric0_mat(i,j,itime_scal)
458 prand_mat(i,j)=prand0_mat(i,j,itime_scal)
459 vrand_mat1(i,j)=vrand0_mat1(i,j,itime_scal)
460 vrand_mat2(i,j)=vrand0_mat2(i,j,itime_scal)
464 if (large) write (iout,'(2a,i5,a,l1)')
465 & "Calculate & store matrices for stochastic step;",
466 & " itime_scal ",itime_scal," flag ",flag_stoch(itime_scal)
468 call sd_verlet_p_setup
470 call sd_verlet_ciccotti_setup
472 flag_stoch(ifac_time)=.true.
475 pfric0_mat(i,j,itime_scal)=pfric_mat(i,j)
476 afric0_mat(i,j,itime_scal)=afric_mat(i,j)
477 vfric0_mat(i,j,itime_scal)=vfric_mat(i,j)
478 prand0_mat(i,j,itime_scal)=prand_mat(i,j)
479 vrand0_mat1(i,j,itime_scal)=vrand_mat1(i,j)
480 vrand0_mat2(i,j,itime_scal)=vrand_mat2(i,j)
484 fac_time=1.0d0/dsqrt(fac_time)
486 stochforcvec(i)=fac_time*stochforcvec(i)
489 else if (lang.eq.1) then
490 c Rescale the accelerations due to stochastic forces
491 fac_time=1.0d0/dsqrt(fac_time)
493 d_as_work(i)=d_as_work(i)*fac_time
496 if (large) write (iout,'(a,i10,a,f8.6,a,i3,a,i3)')
497 & "itime",itime," Timestep scaled down to ",
498 & d_time," ifac_time",ifac_time," itime_scal",itime_scal
500 c Second step of the velocity Verlet algorithm
505 else if (lang.eq.3) then
507 call sd_verlet2_ciccotti
509 else if (lang.eq.1) then
514 if (rattle) call rattle2
516 if (d_time.ne.d_time0) then
519 if (lang.eq.2 .or. lang.eq.3) then
520 if (large) write (iout,'(a)')
521 & "Restore original matrices for stochastic step"
522 c write (iout,*) "Calling sd_verlet_setup: 2"
523 c Restore the matrices of tinker integrator if the time step has been restored
526 pfric_mat(i,j)=pfric0_mat(i,j,0)
527 afric_mat(i,j)=afric0_mat(i,j,0)
528 vfric_mat(i,j)=vfric0_mat(i,j,0)
529 prand_mat(i,j)=prand0_mat(i,j,0)
530 vrand_mat1(i,j)=vrand0_mat1(i,j,0)
531 vrand_mat2(i,j)=vrand0_mat2(i,j,0)
540 c Calculate the kinetic and the total energy and the kinetic temperature
545 c write (iout,*) "step",itime," EK",EK," EK1",EK1
547 c Couple the system to Berendsen bath if needed
548 if (tbf .and. lang.eq.0) then
551 kinetic_T=2.0d0/(dimen3*Rb)*EK
552 c Backup the coordinates, velocities, and accelerations
556 d_t_old(j,i)=d_t(j,i)
557 d_a_old(j,i)=d_a(j,i)
561 if (mod(itime,ntwe).eq.0 .and. large) then
562 write (iout,*) "Velocities, step 2"
564 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
565 & (d_t(j,i+nres),j=1,3)
571 c-------------------------------------------------------------------------------
572 subroutine RESPA_step(itime)
573 c-------------------------------------------------------------------------------
574 c Perform a single RESPA step.
575 c-------------------------------------------------------------------------------
576 implicit real*8 (a-h,o-z)
580 integer IERROR,ERRCODE
582 include 'COMMON.SETUP'
583 include 'COMMON.CONTROL'
587 include 'COMMON.LANGEVIN'
589 include 'COMMON.LANGEVIN.lang0'
591 include 'COMMON.CHAIN'
592 include 'COMMON.DERIV'
594 include 'COMMON.LOCAL'
595 include 'COMMON.INTERACT'
596 include 'COMMON.IOUNITS'
597 include 'COMMON.NAMES'
598 include 'COMMON.TIME1'
599 double precision energia_short(0:n_ene),
600 & energia_long(0:n_ene)
601 double precision cm(3),L(3),vcm(3),incr(3)
602 double precision dc_old0(3,0:maxres2),d_t_old0(3,0:maxres2),
603 & d_a_old0(3,0:maxres2)
604 logical PRINT_AMTS_MSG /.false./
605 integer ilen,count,rstcount
608 integer maxcount_scale /10/
610 double precision stochforcvec(MAXRES6)
611 common /stochcalc/ stochforcvec
614 common /cipiszcze/ itt
617 if (large.and. mod(itime,ntwe).eq.0) then
618 write (iout,*) "***************** RESPA itime",itime
619 write (iout,*) "Cartesian and internal coordinates: step 0"
621 call pdbout(0.0d0,"cipiszcze",iout)
623 write (iout,*) "Accelerations from long-range forces"
625 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
626 & (d_a(j,i+nres),j=1,3)
628 write (iout,*) "Velocities, step 0"
630 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
631 & (d_t(j,i+nres),j=1,3)
636 c Perform the initial RESPA step (increment velocities)
637 c write (iout,*) "*********************** RESPA ini"
640 if (mod(itime,ntwe).eq.0 .and. large) then
641 write (iout,*) "Velocities, end"
643 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
644 & (d_t(j,i+nres),j=1,3)
648 c Compute the short-range forces
654 C 7/2/2009 commented out
656 c call etotal_short(energia_short)
659 C 7/2/2009 Copy accelerations due to short-lange forces from previous MD step
662 d_a(j,i)=d_a_short(j,i)
666 if (large.and. mod(itime,ntwe).eq.0) then
667 write (iout,*) "energia_short",energia_short(0)
668 write (iout,*) "Accelerations from short-range forces"
670 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
671 & (d_a(j,i+nres),j=1,3)
676 t_enegrad=t_enegrad+MPI_Wtime()-tt0
678 t_enegrad=t_enegrad+tcpu()-tt0
683 d_t_old(j,i)=d_t(j,i)
684 d_a_old(j,i)=d_a(j,i)
687 c 6/30/08 A-MTS: attempt at increasing the split number
690 dc_old0(j,i)=dc_old(j,i)
691 d_t_old0(j,i)=d_t_old(j,i)
692 d_a_old0(j,i)=d_a_old(j,i)
695 if (ntime_split.gt.ntime_split0) ntime_split=ntime_split/2
696 if (ntime_split.lt.ntime_split0) ntime_split=ntime_split0
703 c write (iout,*) "itime",itime," ntime_split",ntime_split
704 c Split the time step
705 d_time=d_time0/ntime_split
706 c Perform the short-range RESPA steps (velocity Verlet increments of
707 c positions and velocities using short-range forces)
708 c write (iout,*) "*********************** RESPA split"
709 do itsplit=1,ntime_split
712 else if (lang.eq.2 .or. lang.eq.3) then
714 call stochastic_force(stochforcvec)
717 & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
719 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
724 c First step of the velocity Verlet algorithm
729 else if (lang.eq.3) then
731 call sd_verlet1_ciccotti
733 else if (lang.eq.1) then
738 c Build the chain from the newly calculated coordinates
740 if (rattle) call rattle1
742 if (large.and. mod(itime,ntwe).eq.0) then
743 write (iout,*) "***** ITSPLIT",itsplit
744 write (iout,*) "Cartesian and internal coordinates: step 1"
745 call pdbout(0.0d0,"cipiszcze",iout)
748 write (iout,*) "Velocities, step 1"
750 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
751 & (d_t(j,i+nres),j=1,3)
760 c Calculate energy and forces
762 call etotal_short(energia_short)
763 if (large.and. mod(itime,ntwe).eq.0)
764 & call enerprint(energia_short)
767 t_eshort=t_eshort+MPI_Wtime()-tt0
769 t_eshort=t_eshort+tcpu()-tt0
773 c Get the new accelerations
775 C 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
778 d_a_short(j,i)=d_a(j,i)
782 if (large.and. mod(itime,ntwe).eq.0) then
783 write (iout,*)"energia_short",energia_short(0)
784 write (iout,*) "Accelerations from short-range forces"
786 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
787 & (d_a(j,i+nres),j=1,3)
792 c Determine maximum acceleration and scale down the timestep if needed
794 amax=amax/ntime_split**2
795 call predict_edrift(epdrift)
796 if (ntwe.gt.0 .and. large .and. mod(itime,ntwe).eq.0)
797 & write (iout,*) "amax",amax," damax",damax,
798 & " epdrift",epdrift," epdriftmax",epdriftmax
799 c Exit loop and try with increased split number if the change of
800 c acceleration is too big
801 if (amax.gt.damax .or. epdrift.gt.edriftmax) then
802 if (ntime_split.lt.maxtime_split) then
804 ntime_split=ntime_split*2
807 dc_old(j,i)=dc_old0(j,i)
808 d_t_old(j,i)=d_t_old0(j,i)
809 d_a_old(j,i)=d_a_old0(j,i)
812 if (PRINT_AMTS_MSG) then
813 write (iout,*) "acceleration/energy drift too large",amax,
814 & epdrift," split increased to ",ntime_split," itime",itime,
820 & "Uh-hu. Bumpy landscape. Maximum splitting number",
822 & " already reached!!! Trying to carry on!"
826 t_enegrad=t_enegrad+MPI_Wtime()-tt0
828 t_enegrad=t_enegrad+tcpu()-tt0
830 c Second step of the velocity Verlet algorithm
835 else if (lang.eq.3) then
837 call sd_verlet2_ciccotti
839 else if (lang.eq.1) then
844 if (rattle) call rattle2
845 c Backup the coordinates, velocities, and accelerations
849 d_t_old(j,i)=d_t(j,i)
850 d_a_old(j,i)=d_a(j,i)
857 c Restore the time step
859 c Compute long-range forces
866 call etotal_long(energia_long)
867 if (large.and. mod(itime,ntwe).eq.0)
868 & call enerprint(energia_long)
871 t_elong=t_elong+MPI_Wtime()-tt0
873 t_elong=t_elong+tcpu()-tt0
879 t_enegrad=t_enegrad+MPI_Wtime()-tt0
881 t_enegrad=t_enegrad+tcpu()-tt0
883 c Compute accelerations from long-range forces
885 if (large.and. mod(itime,ntwe).eq.0) then
886 write (iout,*) "energia_long",energia_long(0)
887 write (iout,*) "Cartesian and internal coordinates: step 2"
889 call pdbout(0.0d0,"cipiszcze",iout)
891 write (iout,*) "Accelerations from long-range forces"
893 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
894 & (d_a(j,i+nres),j=1,3)
896 write (iout,*) "Velocities, step 2"
898 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
899 & (d_t(j,i+nres),j=1,3)
903 c Compute the final RESPA step (increment velocities)
904 c write (iout,*) "*********************** RESPA fin"
906 c Compute the complete potential energy
908 potEcomp(i)=energia_short(i)+energia_long(i)
910 potE=potEcomp(0)-potEcomp(20)
911 c potE=energia_short(0)+energia_long(0)
913 c Calculate the kinetic and the total energy and the kinetic temperature
916 c Couple the system to Berendsen bath if needed
917 if (tbf .and. lang.eq.0) then
920 kinetic_T=2.0d0/(dimen3*Rb)*EK
921 c Backup the coordinates, velocities, and accelerations
923 if (mod(itime,ntwe).eq.0 .and. large) then
924 write (iout,*) "Velocities, end"
926 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
927 & (d_t(j,i+nres),j=1,3)
933 c---------------------------------------------------------------------
935 c First and last RESPA step (incrementing velocities using long-range
937 implicit real*8 (a-h,o-z)
939 include 'COMMON.CONTROL'
942 include 'COMMON.CHAIN'
943 include 'COMMON.DERIV'
945 include 'COMMON.LOCAL'
946 include 'COMMON.INTERACT'
947 include 'COMMON.IOUNITS'
948 include 'COMMON.NAMES'
950 d_t(j,0)=d_t(j,0)+0.5d0*d_a(j,0)*d_time
954 d_t(j,i)=d_t(j,i)+0.5d0*d_a(j,i)*d_time
958 if (itype(i).ne.10 .and. itype(i).ne.21) then
961 d_t(j,inres)=d_t(j,inres)+0.5d0*d_a(j,inres)*d_time
967 c-----------------------------------------------------------------
969 c Applying velocity Verlet algorithm - step 1 to coordinates
970 implicit real*8 (a-h,o-z)
972 include 'COMMON.CONTROL'
975 include 'COMMON.CHAIN'
976 include 'COMMON.DERIV'
978 include 'COMMON.LOCAL'
979 include 'COMMON.INTERACT'
980 include 'COMMON.IOUNITS'
981 include 'COMMON.NAMES'
982 double precision adt,adt2
985 write (iout,*) "VELVERLET1 START: DC"
987 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),
988 & (dc(j,i+nres),j=1,3)
992 adt=d_a_old(j,0)*d_time
994 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
995 d_t_new(j,0)=d_t_old(j,0)+adt2
996 d_t(j,0)=d_t_old(j,0)+adt
1000 adt=d_a_old(j,i)*d_time
1002 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
1003 d_t_new(j,i)=d_t_old(j,i)+adt2
1004 d_t(j,i)=d_t_old(j,i)+adt
1008 if (itype(i).ne.10 .and. itype(i).ne.21) then
1011 adt=d_a_old(j,inres)*d_time
1013 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
1014 d_t_new(j,inres)=d_t_old(j,inres)+adt2
1015 d_t(j,inres)=d_t_old(j,inres)+adt
1020 write (iout,*) "VELVERLET1 END: DC"
1022 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),
1023 & (dc(j,i+nres),j=1,3)
1028 c---------------------------------------------------------------------
1030 c Step 2 of the velocity Verlet algorithm: update velocities
1031 implicit real*8 (a-h,o-z)
1032 include 'DIMENSIONS'
1033 include 'COMMON.CONTROL'
1034 include 'COMMON.VAR'
1036 include 'COMMON.CHAIN'
1037 include 'COMMON.DERIV'
1038 include 'COMMON.GEO'
1039 include 'COMMON.LOCAL'
1040 include 'COMMON.INTERACT'
1041 include 'COMMON.IOUNITS'
1042 include 'COMMON.NAMES'
1044 d_t(j,0)=d_t_new(j,0)+0.5d0*d_a(j,0)*d_time
1048 d_t(j,i)=d_t_new(j,i)+0.5d0*d_a(j,i)*d_time
1052 if (itype(i).ne.10 .and. itype(i).ne.21) then
1055 d_t(j,inres)=d_t_new(j,inres)+0.5d0*d_a(j,inres)*d_time
1061 c-----------------------------------------------------------------
1062 subroutine sddir_precalc
1063 c Applying velocity Verlet algorithm - step 1 to coordinates
1064 implicit real*8 (a-h,o-z)
1065 include 'DIMENSIONS'
1069 include 'COMMON.CONTROL'
1070 include 'COMMON.VAR'
1073 include 'COMMON.LANGEVIN'
1075 include 'COMMON.LANGEVIN.lang0'
1077 include 'COMMON.CHAIN'
1078 include 'COMMON.DERIV'
1079 include 'COMMON.GEO'
1080 include 'COMMON.LOCAL'
1081 include 'COMMON.INTERACT'
1082 include 'COMMON.IOUNITS'
1083 include 'COMMON.NAMES'
1084 include 'COMMON.TIME1'
1085 double precision stochforcvec(MAXRES6)
1086 common /stochcalc/ stochforcvec
1088 c Compute friction and stochastic forces
1097 time_fric=time_fric+MPI_Wtime()-time00
1100 time_fric=time_fric+tcpu()-time00
1103 call stochastic_force(stochforcvec)
1105 time_stoch=time_stoch+MPI_Wtime()-time00
1107 time_stoch=time_stoch+tcpu()-time00
1110 c Compute the acceleration due to friction forces (d_af_work) and stochastic
1111 c forces (d_as_work)
1113 call ginv_mult(fric_work, d_af_work)
1114 call ginv_mult(stochforcvec, d_as_work)
1117 c---------------------------------------------------------------------
1118 subroutine sddir_verlet1
1119 c Applying velocity Verlet algorithm - step 1 to velocities
1120 implicit real*8 (a-h,o-z)
1121 include 'DIMENSIONS'
1122 include 'COMMON.CONTROL'
1123 include 'COMMON.VAR'
1126 include 'COMMON.LANGEVIN'
1128 include 'COMMON.LANGEVIN.lang0'
1130 include 'COMMON.CHAIN'
1131 include 'COMMON.DERIV'
1132 include 'COMMON.GEO'
1133 include 'COMMON.LOCAL'
1134 include 'COMMON.INTERACT'
1135 include 'COMMON.IOUNITS'
1136 include 'COMMON.NAMES'
1137 c Revised 3/31/05 AL: correlation between random contributions to
1138 c position and velocity increments included.
1139 double precision sqrt13 /0.57735026918962576451d0/ ! 1/sqrt(3)
1140 double precision adt,adt2
1142 c Add the contribution from BOTH friction and stochastic force to the
1143 c coordinates, but ONLY the contribution from the friction forces to velocities
1146 adt=(d_a_old(j,0)+d_af_work(j))*d_time
1147 adt2=0.5d0*adt+sqrt13*d_as_work(j)*d_time
1148 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
1149 d_t_new(j,0)=d_t_old(j,0)+0.5d0*adt
1150 d_t(j,0)=d_t_old(j,0)+adt
1155 adt=(d_a_old(j,i)+d_af_work(ind+j))*d_time
1156 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
1157 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
1158 d_t_new(j,i)=d_t_old(j,i)+0.5d0*adt
1159 d_t(j,i)=d_t_old(j,i)+adt
1164 if (itype(i).ne.10 .and. itype(i).ne.21) then
1167 adt=(d_a_old(j,inres)+d_af_work(ind+j))*d_time
1168 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
1169 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
1170 d_t_new(j,inres)=d_t_old(j,inres)+0.5d0*adt
1171 d_t(j,inres)=d_t_old(j,inres)+adt
1178 c---------------------------------------------------------------------
1179 subroutine sddir_verlet2
1180 c Calculating the adjusted velocities for accelerations
1181 implicit real*8 (a-h,o-z)
1182 include 'DIMENSIONS'
1183 include 'COMMON.CONTROL'
1184 include 'COMMON.VAR'
1187 include 'COMMON.LANGEVIN'
1189 include 'COMMON.LANGEVIN.lang0'
1191 include 'COMMON.CHAIN'
1192 include 'COMMON.DERIV'
1193 include 'COMMON.GEO'
1194 include 'COMMON.LOCAL'
1195 include 'COMMON.INTERACT'
1196 include 'COMMON.IOUNITS'
1197 include 'COMMON.NAMES'
1198 double precision stochforcvec(MAXRES6),d_as_work1(MAXRES6)
1199 double precision cos60 /0.5d0/, sin60 /0.86602540378443864676d0/
1200 c Revised 3/31/05 AL: correlation between random contributions to
1201 c position and velocity increments included.
1202 c The correlation coefficients are calculated at low-friction limit.
1203 c Also, friction forces are now not calculated with new velocities.
1205 c call friction_force
1206 call stochastic_force(stochforcvec)
1208 c Compute the acceleration due to friction forces (d_af_work) and stochastic
1209 c forces (d_as_work)
1211 call ginv_mult(stochforcvec, d_as_work1)
1217 d_t(j,0)=d_t_new(j,0)+(0.5d0*(d_a(j,0)+d_af_work(j))
1218 & +sin60*d_as_work(j)+cos60*d_as_work1(j))*d_time
1223 d_t(j,i)=d_t_new(j,i)+(0.5d0*(d_a(j,i)+d_af_work(ind+j))
1224 & +sin60*d_as_work(ind+j)+cos60*d_as_work1(ind+j))*d_time
1229 if (itype(i).ne.10 .and. itype(i).ne.21) then
1232 d_t(j,inres)=d_t_new(j,inres)+(0.5d0*(d_a(j,inres)
1233 & +d_af_work(ind+j))+sin60*d_as_work(ind+j)
1234 & +cos60*d_as_work1(ind+j))*d_time
1241 c---------------------------------------------------------------------
1242 subroutine max_accel
1244 c Find the maximum difference in the accelerations of the the sites
1245 c at the beginning and the end of the time step.
1247 implicit real*8 (a-h,o-z)
1248 include 'DIMENSIONS'
1249 include 'COMMON.CONTROL'
1250 include 'COMMON.VAR'
1252 include 'COMMON.CHAIN'
1253 include 'COMMON.DERIV'
1254 include 'COMMON.GEO'
1255 include 'COMMON.LOCAL'
1256 include 'COMMON.INTERACT'
1257 include 'COMMON.IOUNITS'
1258 double precision aux(3),accel(3),accel_old(3),dacc
1260 c aux(j)=d_a(j,0)-d_a_old(j,0)
1261 accel_old(j)=d_a_old(j,0)
1268 c 7/3/08 changed to asymmetric difference
1270 c accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i))
1271 accel_old(j)=accel_old(j)+0.5d0*d_a_old(j,i)
1272 accel(j)=accel(j)+0.5d0*d_a(j,i)
1273 c if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
1274 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
1275 dacc=dabs(accel(j)-accel_old(j))
1276 if (dacc.gt.amax) amax=dacc
1284 accel_old(j)=d_a_old(j,0)
1289 accel_old(j)=accel_old(j)+d_a_old(j,1)
1290 accel(j)=accel(j)+d_a(j,1)
1294 if (itype(i).ne.10 .and. itype(i).ne.21) then
1296 c accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres)
1297 accel_old(j)=accel_old(j)+d_a_old(j,i+nres)
1298 accel(j)=accel(j)+d_a(j,i+nres)
1302 c if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
1303 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
1304 dacc=dabs(accel(j)-accel_old(j))
1305 if (dacc.gt.amax) amax=dacc
1309 accel_old(j)=accel_old(j)+d_a_old(j,i)
1310 accel(j)=accel(j)+d_a(j,i)
1311 c aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i)
1316 c---------------------------------------------------------------------
1317 subroutine predict_edrift(epdrift)
1319 c Predict the drift of the potential energy
1321 implicit real*8 (a-h,o-z)
1322 include 'DIMENSIONS'
1323 include 'COMMON.CONTROL'
1324 include 'COMMON.VAR'
1326 include 'COMMON.CHAIN'
1327 include 'COMMON.DERIV'
1328 include 'COMMON.GEO'
1329 include 'COMMON.LOCAL'
1330 include 'COMMON.INTERACT'
1331 include 'COMMON.IOUNITS'
1332 include 'COMMON.MUCA'
1333 double precision epdrift,epdriftij
1334 c Drift of the potential energy
1340 epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i))
1341 if (lmuca) epdriftij=epdriftij*factor
1342 c write (iout,*) "back",i,j,epdriftij
1343 if (epdriftij.gt.epdrift) epdrift=epdriftij
1347 if (itype(i).ne.10 .and. itype(i).ne.21) then
1350 & dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
1351 if (lmuca) epdriftij=epdriftij*factor
1352 c write (iout,*) "side",i,j,epdriftij
1353 if (epdriftij.gt.epdrift) epdrift=epdriftij
1357 epdrift=0.5d0*epdrift*d_time*d_time
1358 c write (iout,*) "epdrift",epdrift
1361 c-----------------------------------------------------------------------
1362 subroutine verlet_bath
1364 c Coupling to the thermostat by using the Berendsen algorithm
1366 implicit real*8 (a-h,o-z)
1367 include 'DIMENSIONS'
1368 include 'COMMON.CONTROL'
1369 include 'COMMON.VAR'
1371 include 'COMMON.CHAIN'
1372 include 'COMMON.DERIV'
1373 include 'COMMON.GEO'
1374 include 'COMMON.LOCAL'
1375 include 'COMMON.INTERACT'
1376 include 'COMMON.IOUNITS'
1377 include 'COMMON.NAMES'
1378 double precision T_half,fact
1380 T_half=2.0d0/(dimen3*Rb)*EK
1381 fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0))
1382 c write(iout,*) "T_half", T_half
1383 c write(iout,*) "EK", EK
1384 c write(iout,*) "fact", fact
1386 d_t(j,0)=fact*d_t(j,0)
1390 d_t(j,i)=fact*d_t(j,i)
1394 if (itype(i).ne.10 .and. itype(i).ne.21) then
1397 d_t(j,inres)=fact*d_t(j,inres)
1403 c---------------------------------------------------------
1405 c Set up the initial conditions of a MD simulation
1406 implicit real*8 (a-h,o-z)
1407 include 'DIMENSIONS'
1411 integer IERROR,ERRCODE
1413 include 'COMMON.SETUP'
1414 include 'COMMON.CONTROL'
1415 include 'COMMON.VAR'
1418 include 'COMMON.LANGEVIN'
1420 include 'COMMON.LANGEVIN.lang0'
1422 include 'COMMON.CHAIN'
1423 include 'COMMON.DERIV'
1424 include 'COMMON.GEO'
1425 include 'COMMON.LOCAL'
1426 include 'COMMON.INTERACT'
1427 include 'COMMON.IOUNITS'
1428 include 'COMMON.NAMES'
1429 include 'COMMON.REMD'
1430 real*8 energia_long(0:n_ene),
1431 & energia_short(0:n_ene),vcm(3),incr(3)
1432 double precision cm(3),L(3),xv,sigv,lowb,highb
1433 double precision varia(maxvar)
1441 c write(iout,*) "d_time", d_time
1442 c Compute the standard deviations of stochastic forces for Langevin dynamics
1443 c if the friction coefficients do not depend on surface area
1444 if (lang.gt.0 .and. .not.surfarea) then
1446 stdforcp(i)=stdfp*dsqrt(gamp)
1449 stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamsc(itype(i)))
1452 c Open the pdb file for snapshotshots
1455 if (ilen(tmpdir).gt.0)
1456 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1457 & liczba(:ilen(liczba))//".pdb")
1459 & file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1463 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file))
1464 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1465 & liczba(:ilen(liczba))//".x")
1466 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1469 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file))
1470 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1471 & liczba(:ilen(liczba))//".cx")
1472 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1478 if (ilen(tmpdir).gt.0)
1479 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb")
1480 open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb")
1482 if (ilen(tmpdir).gt.0)
1483 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx")
1484 cartname=prefix(:ilen(prefix))//"_MD.cx"
1488 write (qstr,'(256(1h ))')
1491 iq = qinfrag(i,iset)*10
1492 iw = wfrag(i,iset)/100
1494 if(me.eq.king.or..not.out1file)
1495 & write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw
1496 write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw
1501 iq = qinpair(i,iset)*10
1502 iw = wpair(i,iset)/100
1504 if(me.eq.king.or..not.out1file)
1505 & write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw
1506 write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw
1510 c pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb'
1512 c cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x'
1514 c cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx'
1516 c statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat'
1520 if (restart1file) then
1522 & inquire(file=mremd_rst_name,exist=file_exist)
1524 write (*,*) me," Before broadcast: file_exist",file_exist
1525 call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM,
1527 write (*,*) me," After broadcast: file_exist",file_exist
1528 c inquire(file=mremd_rst_name,exist=file_exist)
1530 if(me.eq.king.or..not.out1file)
1531 & write(iout,*) "Initial state read by master and distributed"
1533 if (ilen(tmpdir).gt.0)
1534 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'
1535 & //liczba(:ilen(liczba))//'.rst')
1536 inquire(file=rest2name,exist=file_exist)
1539 if(.not.restart1file) then
1540 if(me.eq.king.or..not.out1file)
1541 & write(iout,*) "Initial state will be read from file ",
1542 & rest2name(:ilen(rest2name))
1545 call rescale_weights(t_bath)
1547 if(me.eq.king.or..not.out1file)then
1548 if (restart1file) then
1549 write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)),
1552 write(iout,*) "File ",rest2name(:ilen(rest2name)),
1555 write(iout,*) "Initial velocities randomly generated"
1561 c Generate initial velocities
1562 if(me.eq.king.or..not.out1file)
1563 & write(iout,*) "Initial velocities randomly generated"
1567 c rest2name = prefix(:ilen(prefix))//'.rst'
1568 if(me.eq.king.or..not.out1file)then
1569 write (iout,*) "Initial velocities"
1571 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1572 & (d_t(j,i+nres),j=1,3)
1574 c Zeroing the total angular momentum of the system
1575 write(iout,*) "Calling the zero-angular
1576 & momentum subroutine"
1579 c Getting the potential energy and forces and velocities and accelerations
1581 c write (iout,*) "velocity of the center of the mass:"
1582 c write (iout,*) (vcm(j),j=1,3)
1584 d_t(j,0)=d_t(j,0)-vcm(j)
1586 c Removing the velocity of the center of mass
1588 if(me.eq.king.or..not.out1file)then
1589 write (iout,*) "vcm right after adjustment:"
1590 write (iout,*) (vcm(j),j=1,3)
1594 if(iranconf.ne.0) then
1596 print *, 'Calling OVERLAP_SC'
1597 call overlap_sc(fail)
1601 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
1602 print *,'SC_move',nft_sc,etot
1603 if(me.eq.king.or..not.out1file)
1604 & write(iout,*) 'SC_move',nft_sc,etot
1608 print *, 'Calling MINIM_DC'
1609 call minim_dc(etot,iretcode,nfun)
1611 call geom_to_var(nvar,varia)
1612 print *,'Calling MINIMIZE.'
1613 call minimize(etot,varia,iretcode,nfun)
1614 call var_to_geom(nvar,varia)
1616 if(me.eq.king.or..not.out1file)
1617 & write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
1620 call chainbuild_cart
1625 kinetic_T=2.0d0/(dimen3*Rb)*EK
1626 if(me.eq.king.or..not.out1file)then
1636 call etotal(potEcomp)
1637 if (large) call enerprint(potEcomp)
1640 t_etotal=t_etotal+MPI_Wtime()-tt0
1642 t_etotal=t_etotal+tcpu()-tt0
1649 if (amax*d_time .gt. dvmax) then
1650 d_time=d_time*dvmax/amax
1651 if(me.eq.king.or..not.out1file) write (iout,*)
1652 & "Time step reduced to",d_time,
1653 & " because of too large initial acceleration."
1655 if(me.eq.king.or..not.out1file)then
1656 write(iout,*) "Potential energy and its components"
1657 call enerprint(potEcomp)
1658 c write(iout,*) (potEcomp(i),i=0,n_ene)
1660 potE=potEcomp(0)-potEcomp(20)
1663 if (ntwe.ne.0) call statout(itime)
1664 if(me.eq.king.or..not.out1file)
1665 & write (iout,'(/a/3(a25,1pe14.5/))') "Initial:",
1666 & " Kinetic energy",EK," Potential energy",potE,
1667 & " Total energy",totE," Maximum acceleration ",
1670 write (iout,*) "Initial coordinates"
1672 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3),
1673 & (c(j,i+nres),j=1,3)
1675 write (iout,*) "Initial dC"
1677 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),
1678 & (dc(j,i+nres),j=1,3)
1680 write (iout,*) "Initial velocities"
1681 write (iout,"(13x,' backbone ',23x,' side chain')")
1683 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1684 & (d_t(j,i+nres),j=1,3)
1686 write (iout,*) "Initial accelerations"
1688 c write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1689 write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3),
1690 & (d_a(j,i+nres),j=1,3)
1696 d_t_old(j,i)=d_t(j,i)
1697 d_a_old(j,i)=d_a(j,i)
1699 c write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3)
1708 call etotal_short(energia_short)
1709 if (large) call enerprint(potEcomp)
1712 t_eshort=t_eshort+MPI_Wtime()-tt0
1714 t_eshort=t_eshort+tcpu()-tt0
1719 if(.not.out1file .and. large) then
1720 write (iout,*) "energia_long",energia_long(0),
1721 & " energia_short",energia_short(0),
1722 & " total",energia_long(0)+energia_short(0)
1723 write (iout,*) "Initial fast-force accelerations"
1725 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1726 & (d_a(j,i+nres),j=1,3)
1729 C 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
1732 d_a_short(j,i)=d_a(j,i)
1741 call etotal_long(energia_long)
1742 if (large) call enerprint(potEcomp)
1745 t_elong=t_elong+MPI_Wtime()-tt0
1747 t_elong=t_elong+tcpu()-tt0
1752 if(.not.out1file .and. large) then
1753 write (iout,*) "energia_long",energia_long(0)
1754 write (iout,*) "Initial slow-force accelerations"
1756 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1757 & (d_a(j,i+nres),j=1,3)
1761 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1763 t_enegrad=t_enegrad+tcpu()-tt0
1768 c-----------------------------------------------------------
1769 subroutine random_vel
1770 implicit real*8 (a-h,o-z)
1771 include 'DIMENSIONS'
1772 include 'COMMON.CONTROL'
1773 include 'COMMON.VAR'
1776 include 'COMMON.LANGEVIN'
1778 include 'COMMON.LANGEVIN.lang0'
1780 include 'COMMON.CHAIN'
1781 include 'COMMON.DERIV'
1782 include 'COMMON.GEO'
1783 include 'COMMON.LOCAL'
1784 include 'COMMON.INTERACT'
1785 include 'COMMON.IOUNITS'
1786 include 'COMMON.NAMES'
1787 include 'COMMON.TIME1'
1788 double precision xv,sigv,lowb,highb
1789 c Generate random velocities from Gaussian distribution of mean 0 and std of KT/m
1790 c First generate velocities in the eigenspace of the G matrix
1791 c write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3
1798 sigv=dsqrt((Rb*t_bath)/geigen(i))
1801 d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb)
1802 c write (iout,*) "i",i," ii",ii," geigen",geigen(i),
1803 c & " d_t_work_new",d_t_work_new(ii)
1812 c Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2
1815 c write (iout,*) "Ek from eigenvectors",Ek1
1817 c Transform velocities to UNRES coordinate space
1823 d_t_work(ind)=d_t_work(ind)
1824 & +Gvec(i,j)*d_t_work_new((j-1)*3+k+1)
1826 c write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind)
1830 c Transfer to the d_t vector
1832 d_t(j,0)=d_t_work(j)
1838 d_t(j,i)=d_t_work(ind)
1842 if (itype(i).ne.10 .and. itype(i).ne.21) then
1845 d_t(j,i+nres)=d_t_work(ind)
1850 c write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",
1851 c & 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
1856 c-----------------------------------------------------------
1857 subroutine sd_verlet_p_setup
1858 c Sets up the parameters of stochastic Verlet algorithm
1859 implicit real*8 (a-h,o-z)
1860 include 'DIMENSIONS'
1864 include 'COMMON.CONTROL'
1865 include 'COMMON.VAR'
1868 include 'COMMON.LANGEVIN'
1870 include 'COMMON.LANGEVIN.lang0'
1872 include 'COMMON.CHAIN'
1873 include 'COMMON.DERIV'
1874 include 'COMMON.GEO'
1875 include 'COMMON.LOCAL'
1876 include 'COMMON.INTERACT'
1877 include 'COMMON.IOUNITS'
1878 include 'COMMON.NAMES'
1879 include 'COMMON.TIME1'
1880 double precision emgdt(MAXRES6),
1881 & pterm,vterm,rho,rhoc,vsig,
1882 & pfric_vec(MAXRES6),vfric_vec(MAXRES6),
1883 & afric_vec(MAXRES6),prand_vec(MAXRES6),
1884 & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6)
1885 logical lprn /.false./
1886 double precision zero /1.0d-8/, gdt_radius /0.05d0/
1887 double precision ktm
1894 c AL 8/17/04 Code adapted from tinker
1896 c Get the frictional and random terms for stochastic dynamics in the
1897 c eigenspace of mass-scaled UNRES friction matrix
1900 gdt = fricgam(i) * d_time
1902 c Stochastic dynamics reduces to simple MD for zero friction
1904 if (gdt .le. zero) then
1905 pfric_vec(i) = 1.0d0
1906 vfric_vec(i) = d_time
1907 afric_vec(i) = 0.5d0 * d_time * d_time
1908 prand_vec(i) = 0.0d0
1909 vrand_vec1(i) = 0.0d0
1910 vrand_vec2(i) = 0.0d0
1912 c Analytical expressions when friction coefficient is large
1915 if (gdt .ge. gdt_radius) then
1918 vfric_vec(i) = (1.0d0-egdt) / fricgam(i)
1919 afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i)
1920 pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt
1921 vterm = 1.0d0 - egdt**2
1922 rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm)
1924 c Use series expansions when friction coefficient is small
1935 afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0
1936 & - gdt5/120.0d0 + gdt6/720.0d0
1937 & - gdt7/5040.0d0 + gdt8/40320.0d0
1938 & - gdt9/362880.0d0) / fricgam(i)**2
1939 vfric_vec(i) = d_time - fricgam(i)*afric_vec(i)
1940 pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i)
1941 pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0
1942 & + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0
1943 & + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0
1944 & + 127.0d0*gdt9/90720.0d0
1945 vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0
1946 & - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0
1947 & - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0
1948 & - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0
1949 rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0
1950 & - 17.0d0*gdt2/1280.0d0
1951 & + 17.0d0*gdt3/6144.0d0
1952 & + 40967.0d0*gdt4/34406400.0d0
1953 & - 57203.0d0*gdt5/275251200.0d0
1954 & - 1429487.0d0*gdt6/13212057600.0d0)
1957 c Compute the scaling factors of random terms for the nonzero friction case
1959 ktm = 0.5d0*d_time/fricgam(i)
1960 psig = dsqrt(ktm*pterm) / fricgam(i)
1961 vsig = dsqrt(ktm*vterm)
1962 rhoc = dsqrt(1.0d0 - rho*rho)
1964 vrand_vec1(i) = vsig * rho
1965 vrand_vec2(i) = vsig * rhoc
1970 & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",
1973 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),
1974 & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
1978 c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
1981 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
1982 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
1983 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
1984 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
1985 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1)
1986 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
1989 t_sdsetup=t_sdsetup+MPI_Wtime()
1991 t_sdsetup=t_sdsetup+tcpu()-tt0
1995 c-------------------------------------------------------------
1996 subroutine eigtransf1(n,ndim,ab,d,c)
1999 double precision ab(ndim,ndim,n),c(ndim,n),d(ndim)
2005 c(i,j)=c(i,j)+ab(k,j,i)*d(k)
2011 c-------------------------------------------------------------
2012 subroutine eigtransf(n,ndim,a,b,d,c)
2015 double precision a(ndim,n),b(ndim,n),c(ndim,n),d(ndim)
2021 c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k)
2027 c-------------------------------------------------------------
2028 subroutine sd_verlet1
2029 c Applying stochastic velocity Verlet algorithm - step 1 to velocities
2030 implicit real*8 (a-h,o-z)
2031 include 'DIMENSIONS'
2032 include 'COMMON.CONTROL'
2033 include 'COMMON.VAR'
2036 include 'COMMON.LANGEVIN'
2038 include 'COMMON.LANGEVIN.lang0'
2040 include 'COMMON.CHAIN'
2041 include 'COMMON.DERIV'
2042 include 'COMMON.GEO'
2043 include 'COMMON.LOCAL'
2044 include 'COMMON.INTERACT'
2045 include 'COMMON.IOUNITS'
2046 include 'COMMON.NAMES'
2047 double precision stochforcvec(MAXRES6)
2048 common /stochcalc/ stochforcvec
2049 logical lprn /.false./
2051 c write (iout,*) "dc_old"
2053 c write (iout,'(i5,3f10.5,5x,3f10.5)')
2054 c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
2057 dc_work(j)=dc_old(j,0)
2058 d_t_work(j)=d_t_old(j,0)
2059 d_a_work(j)=d_a_old(j,0)
2064 dc_work(ind+j)=dc_old(j,i)
2065 d_t_work(ind+j)=d_t_old(j,i)
2066 d_a_work(ind+j)=d_a_old(j,i)
2071 if (itype(i).ne.10 .and. itype(i).ne.21) then
2073 dc_work(ind+j)=dc_old(j,i+nres)
2074 d_t_work(ind+j)=d_t_old(j,i+nres)
2075 d_a_work(ind+j)=d_a_old(j,i+nres)
2083 & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",
2087 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),
2088 & vfric_mat(i,j),afric_mat(i,j),
2089 & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
2097 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j)
2098 & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
2099 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
2100 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
2102 d_t_work_new(i)=ddt1+0.5d0*ddt2
2103 d_t_work(i)=ddt1+ddt2
2108 d_t(j,0)=d_t_work(j)
2113 dc(j,i)=dc_work(ind+j)
2114 d_t(j,i)=d_t_work(ind+j)
2119 if (itype(i).ne.10) then
2122 dc(j,inres)=dc_work(ind+j)
2123 d_t(j,inres)=d_t_work(ind+j)
2130 c--------------------------------------------------------------------------
2131 subroutine sd_verlet2
2132 c Calculating the adjusted velocities for accelerations
2133 implicit real*8 (a-h,o-z)
2134 include 'DIMENSIONS'
2135 include 'COMMON.CONTROL'
2136 include 'COMMON.VAR'
2139 include 'COMMON.LANGEVIN'
2141 include 'COMMON.LANGEVIN.lang0'
2143 include 'COMMON.CHAIN'
2144 include 'COMMON.DERIV'
2145 include 'COMMON.GEO'
2146 include 'COMMON.LOCAL'
2147 include 'COMMON.INTERACT'
2148 include 'COMMON.IOUNITS'
2149 include 'COMMON.NAMES'
2150 double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6)
2151 common /stochcalc/ stochforcvec
2153 c Compute the stochastic forces which contribute to velocity change
2155 call stochastic_force(stochforcvecV)
2162 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
2163 ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+
2164 & vrand_mat2(i,j)*stochforcvecV(j)
2166 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
2170 d_t(j,0)=d_t_work(j)
2175 d_t(j,i)=d_t_work(ind+j)
2180 if (itype(i).ne.10 .and. itype(i).ne.21) then
2183 d_t(j,inres)=d_t_work(ind+j)
2190 c-----------------------------------------------------------
2191 subroutine sd_verlet_ciccotti_setup
2192 c Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's
2194 implicit real*8 (a-h,o-z)
2195 include 'DIMENSIONS'
2199 include 'COMMON.CONTROL'
2200 include 'COMMON.VAR'
2203 include 'COMMON.LANGEVIN'
2205 include 'COMMON.LANGEVIN.lang0'
2207 include 'COMMON.CHAIN'
2208 include 'COMMON.DERIV'
2209 include 'COMMON.GEO'
2210 include 'COMMON.LOCAL'
2211 include 'COMMON.INTERACT'
2212 include 'COMMON.IOUNITS'
2213 include 'COMMON.NAMES'
2214 include 'COMMON.TIME1'
2215 double precision emgdt(MAXRES6),
2216 & pterm,vterm,rho,rhoc,vsig,
2217 & pfric_vec(MAXRES6),vfric_vec(MAXRES6),
2218 & afric_vec(MAXRES6),prand_vec(MAXRES6),
2219 & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6)
2220 logical lprn /.false./
2221 double precision zero /1.0d-8/, gdt_radius /0.05d0/
2222 double precision ktm
2229 c AL 8/17/04 Code adapted from tinker
2231 c Get the frictional and random terms for stochastic dynamics in the
2232 c eigenspace of mass-scaled UNRES friction matrix
2235 write (iout,*) "i",i," fricgam",fricgam(i)
2236 gdt = fricgam(i) * d_time
2238 c Stochastic dynamics reduces to simple MD for zero friction
2240 if (gdt .le. zero) then
2241 pfric_vec(i) = 1.0d0
2242 vfric_vec(i) = d_time
2243 afric_vec(i) = 0.5d0*d_time*d_time
2244 prand_vec(i) = afric_vec(i)
2245 vrand_vec2(i) = vfric_vec(i)
2247 c Analytical expressions when friction coefficient is large
2252 vfric_vec(i) = dexp(-0.5d0*gdt)*d_time
2253 afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time
2254 prand_vec(i) = afric_vec(i)
2255 vrand_vec2(i) = vfric_vec(i)
2257 c Compute the scaling factors of random terms for the nonzero friction case
2259 c ktm = 0.5d0*d_time/fricgam(i)
2260 c psig = dsqrt(ktm*pterm) / fricgam(i)
2261 c vsig = dsqrt(ktm*vterm)
2262 c prand_vec(i) = psig*afric_vec(i)
2263 c vrand_vec2(i) = vsig*vfric_vec(i)
2268 & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",
2271 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),
2272 & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
2276 c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
2278 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
2279 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
2280 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
2281 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
2282 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
2284 t_sdsetup=t_sdsetup+MPI_Wtime()
2286 t_sdsetup=t_sdsetup+tcpu()-tt0
2290 c-------------------------------------------------------------
2291 subroutine sd_verlet1_ciccotti
2292 c Applying stochastic velocity Verlet algorithm - step 1 to velocities
2293 implicit real*8 (a-h,o-z)
2294 include 'DIMENSIONS'
2298 include 'COMMON.CONTROL'
2299 include 'COMMON.VAR'
2302 include 'COMMON.LANGEVIN'
2304 include 'COMMON.LANGEVIN.lang0'
2306 include 'COMMON.CHAIN'
2307 include 'COMMON.DERIV'
2308 include 'COMMON.GEO'
2309 include 'COMMON.LOCAL'
2310 include 'COMMON.INTERACT'
2311 include 'COMMON.IOUNITS'
2312 include 'COMMON.NAMES'
2313 double precision stochforcvec(MAXRES6)
2314 common /stochcalc/ stochforcvec
2315 logical lprn /.false./
2317 c write (iout,*) "dc_old"
2319 c write (iout,'(i5,3f10.5,5x,3f10.5)')
2320 c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
2323 dc_work(j)=dc_old(j,0)
2324 d_t_work(j)=d_t_old(j,0)
2325 d_a_work(j)=d_a_old(j,0)
2330 dc_work(ind+j)=dc_old(j,i)
2331 d_t_work(ind+j)=d_t_old(j,i)
2332 d_a_work(ind+j)=d_a_old(j,i)
2337 if (itype(i).ne.10 .and. itype(i).ne.21) then
2339 dc_work(ind+j)=dc_old(j,i+nres)
2340 d_t_work(ind+j)=d_t_old(j,i+nres)
2341 d_a_work(ind+j)=d_a_old(j,i+nres)
2350 & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",
2354 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),
2355 & vfric_mat(i,j),afric_mat(i,j),
2356 & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
2364 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j)
2365 & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
2366 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
2367 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
2369 d_t_work_new(i)=ddt1+0.5d0*ddt2
2370 d_t_work(i)=ddt1+ddt2
2375 d_t(j,0)=d_t_work(j)
2380 dc(j,i)=dc_work(ind+j)
2381 d_t(j,i)=d_t_work(ind+j)
2386 if (itype(i).ne.10 .and. itype(i).ne.21) then
2389 dc(j,inres)=dc_work(ind+j)
2390 d_t(j,inres)=d_t_work(ind+j)
2397 c--------------------------------------------------------------------------
2398 subroutine sd_verlet2_ciccotti
2399 c Calculating the adjusted velocities for accelerations
2400 implicit real*8 (a-h,o-z)
2401 include 'DIMENSIONS'
2402 include 'COMMON.CONTROL'
2403 include 'COMMON.VAR'
2406 include 'COMMON.LANGEVIN'
2408 include 'COMMON.LANGEVIN.lang0'
2410 include 'COMMON.CHAIN'
2411 include 'COMMON.DERIV'
2412 include 'COMMON.GEO'
2413 include 'COMMON.LOCAL'
2414 include 'COMMON.INTERACT'
2415 include 'COMMON.IOUNITS'
2416 include 'COMMON.NAMES'
2417 double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6)
2418 common /stochcalc/ stochforcvec
2420 c Compute the stochastic forces which contribute to velocity change
2422 call stochastic_force(stochforcvecV)
2429 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
2430 c ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j)
2431 ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j)
2433 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
2437 d_t(j,0)=d_t_work(j)
2442 d_t(j,i)=d_t_work(ind+j)
2447 if (itype(i).ne.10 .and. itype(i).ne.21) then
2450 d_t(j,inres)=d_t_work(ind+j)