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.ntyp1) 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.ntyp1) 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.ntyp1) 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.ntyp1) 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.ntyp1) 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.ntyp1) 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 c write (iout,*) i,dacc
1277 if (dacc.gt.amax) amax=dacc
1285 accel_old(j)=d_a_old(j,0)
1290 accel_old(j)=accel_old(j)+d_a_old(j,1)
1291 accel(j)=accel(j)+d_a(j,1)
1295 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
1297 c accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres)
1298 accel_old(j)=accel_old(j)+d_a_old(j,i+nres)
1299 accel(j)=accel(j)+d_a(j,i+nres)
1303 c if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
1304 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
1305 dacc=dabs(accel(j)-accel_old(j))
1306 c write (iout,*) "side-chain",i,dacc
1307 if (dacc.gt.amax) amax=dacc
1311 accel_old(j)=accel_old(j)+d_a_old(j,i)
1312 accel(j)=accel(j)+d_a(j,i)
1313 c aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i)
1318 c---------------------------------------------------------------------
1319 subroutine predict_edrift(epdrift)
1321 c Predict the drift of the potential energy
1323 implicit real*8 (a-h,o-z)
1324 include 'DIMENSIONS'
1325 include 'COMMON.CONTROL'
1326 include 'COMMON.VAR'
1328 include 'COMMON.CHAIN'
1329 include 'COMMON.DERIV'
1330 include 'COMMON.GEO'
1331 include 'COMMON.LOCAL'
1332 include 'COMMON.INTERACT'
1333 include 'COMMON.IOUNITS'
1334 include 'COMMON.MUCA'
1335 double precision epdrift,epdriftij
1336 c Drift of the potential energy
1342 epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i))
1343 if (lmuca) epdriftij=epdriftij*factor
1344 c write (iout,*) "back",i,j,epdriftij
1345 if (epdriftij.gt.epdrift) epdrift=epdriftij
1349 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
1352 & dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
1353 if (lmuca) epdriftij=epdriftij*factor
1354 c write (iout,*) "side",i,j,epdriftij
1355 if (epdriftij.gt.epdrift) epdrift=epdriftij
1359 epdrift=0.5d0*epdrift*d_time*d_time
1360 c write (iout,*) "epdrift",epdrift
1363 c-----------------------------------------------------------------------
1364 subroutine verlet_bath
1366 c Coupling to the thermostat by using the Berendsen algorithm
1368 implicit real*8 (a-h,o-z)
1369 include 'DIMENSIONS'
1370 include 'COMMON.CONTROL'
1371 include 'COMMON.VAR'
1373 include 'COMMON.CHAIN'
1374 include 'COMMON.DERIV'
1375 include 'COMMON.GEO'
1376 include 'COMMON.LOCAL'
1377 include 'COMMON.INTERACT'
1378 include 'COMMON.IOUNITS'
1379 include 'COMMON.NAMES'
1380 double precision T_half,fact
1382 T_half=2.0d0/(dimen3*Rb)*EK
1383 fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0))
1384 c write(iout,*) "T_half", T_half
1385 c write(iout,*) "EK", EK
1386 c write(iout,*) "fact", fact
1388 d_t(j,0)=fact*d_t(j,0)
1392 d_t(j,i)=fact*d_t(j,i)
1396 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
1399 d_t(j,inres)=fact*d_t(j,inres)
1405 c---------------------------------------------------------
1407 c Set up the initial conditions of a MD simulation
1408 implicit real*8 (a-h,o-z)
1409 include 'DIMENSIONS'
1413 integer IERROR,ERRCODE
1415 include 'COMMON.SETUP'
1416 include 'COMMON.CONTROL'
1417 include 'COMMON.VAR'
1420 include 'COMMON.LANGEVIN'
1422 include 'COMMON.LANGEVIN.lang0'
1424 include 'COMMON.CHAIN'
1425 include 'COMMON.DERIV'
1426 include 'COMMON.GEO'
1427 include 'COMMON.LOCAL'
1428 include 'COMMON.INTERACT'
1429 include 'COMMON.IOUNITS'
1430 include 'COMMON.NAMES'
1431 include 'COMMON.REMD'
1432 real*8 energia_long(0:n_ene),
1433 & energia_short(0:n_ene),vcm(3),incr(3)
1434 double precision cm(3),L(3),xv,sigv,lowb,highb
1435 double precision varia(maxvar)
1443 c write(iout,*) "d_time", d_time
1444 c Compute the standard deviations of stochastic forces for Langevin dynamics
1445 c if the friction coefficients do not depend on surface area
1446 if (lang.gt.0 .and. .not.surfarea) then
1448 stdforcp(i)=stdfp*dsqrt(gamp)
1451 stdforcsc(i)=stdfsc(iabs(itype(i)))
1452 & *dsqrt(gamsc(iabs(itype(i))))
1455 c Open the pdb file for snapshotshots
1458 if (ilen(tmpdir).gt.0)
1459 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1460 & liczba(:ilen(liczba))//".pdb")
1462 & file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1466 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file))
1467 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1468 & liczba(:ilen(liczba))//".x")
1469 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1472 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file))
1473 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1474 & liczba(:ilen(liczba))//".cx")
1475 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1481 if (ilen(tmpdir).gt.0)
1482 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb")
1483 open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb")
1485 if (ilen(tmpdir).gt.0)
1486 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx")
1487 cartname=prefix(:ilen(prefix))//"_MD.cx"
1491 write (qstr,'(256(1h ))')
1494 iq = qinfrag(i,iset)*10
1495 iw = wfrag(i,iset)/100
1497 if(me.eq.king.or..not.out1file)
1498 & write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw
1499 write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw
1504 iq = qinpair(i,iset)*10
1505 iw = wpair(i,iset)/100
1507 if(me.eq.king.or..not.out1file)
1508 & write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw
1509 write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw
1513 c pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb'
1515 c cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x'
1517 c cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx'
1519 c statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat'
1523 if (restart1file) then
1525 & inquire(file=mremd_rst_name,exist=file_exist)
1527 write (*,*) me," Before broadcast: file_exist",file_exist
1528 call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM,
1530 write (*,*) me," After broadcast: file_exist",file_exist
1531 c inquire(file=mremd_rst_name,exist=file_exist)
1533 if(me.eq.king.or..not.out1file)
1534 & write(iout,*) "Initial state read by master and distributed"
1536 if (ilen(tmpdir).gt.0)
1537 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'
1538 & //liczba(:ilen(liczba))//'.rst')
1539 inquire(file=rest2name,exist=file_exist)
1542 if(.not.restart1file) then
1543 if(me.eq.king.or..not.out1file)
1544 & write(iout,*) "Initial state will be read from file ",
1545 & rest2name(:ilen(rest2name))
1548 call rescale_weights(t_bath)
1550 if(me.eq.king.or..not.out1file)then
1551 if (restart1file) then
1552 write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)),
1555 write(iout,*) "File ",rest2name(:ilen(rest2name)),
1558 write(iout,*) "Initial velocities randomly generated"
1564 c Generate initial velocities
1565 if(me.eq.king.or..not.out1file)
1566 & write(iout,*) "Initial velocities randomly generated"
1570 c rest2name = prefix(:ilen(prefix))//'.rst'
1571 if(me.eq.king.or..not.out1file)then
1572 write (iout,*) "Initial velocities"
1574 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1575 & (d_t(j,i+nres),j=1,3)
1577 c Zeroing the total angular momentum of the system
1578 write(iout,*) "Calling the zero-angular
1579 & momentum subroutine"
1582 c Getting the potential energy and forces and velocities and accelerations
1584 c write (iout,*) "velocity of the center of the mass:"
1585 c write (iout,*) (vcm(j),j=1,3)
1587 d_t(j,0)=d_t(j,0)-vcm(j)
1589 c Removing the velocity of the center of mass
1591 if(me.eq.king.or..not.out1file)then
1592 write (iout,*) "vcm right after adjustment:"
1593 write (iout,*) (vcm(j),j=1,3)
1597 if(iranconf.ne.0) then
1599 print *, 'Calling OVERLAP_SC'
1600 call overlap_sc(fail)
1604 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
1605 print *,'SC_move',nft_sc,etot
1606 if(me.eq.king.or..not.out1file)
1607 & write(iout,*) 'SC_move',nft_sc,etot
1611 print *, 'Calling MINIM_DC'
1612 call minim_dc(etot,iretcode,nfun)
1614 call geom_to_var(nvar,varia)
1615 print *,'Calling MINIMIZE.'
1616 call minimize(etot,varia,iretcode,nfun)
1617 call var_to_geom(nvar,varia)
1619 if(me.eq.king.or..not.out1file)
1620 & write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
1623 call chainbuild_cart
1628 kinetic_T=2.0d0/(dimen3*Rb)*EK
1629 if(me.eq.king.or..not.out1file)then
1639 call etotal(potEcomp)
1640 if (large) call enerprint(potEcomp)
1643 t_etotal=t_etotal+MPI_Wtime()-tt0
1645 t_etotal=t_etotal+tcpu()-tt0
1652 if (amax*d_time .gt. dvmax) then
1653 d_time=d_time*dvmax/amax
1654 if(me.eq.king.or..not.out1file) write (iout,*)
1655 & "Time step reduced to",d_time,
1656 & " because of too large initial acceleration."
1658 if(me.eq.king.or..not.out1file)then
1659 write(iout,*) "Potential energy and its components"
1660 call enerprint(potEcomp)
1661 c write(iout,*) (potEcomp(i),i=0,n_ene)
1663 potE=potEcomp(0)-potEcomp(20)
1666 if (ntwe.ne.0) call statout(itime)
1667 if(me.eq.king.or..not.out1file)
1668 & write (iout,'(/a/3(a25,1pe14.5/))') "Initial:",
1669 & " Kinetic energy",EK," Potential energy",potE,
1670 & " Total energy",totE," Maximum acceleration ",
1673 write (iout,*) "Initial coordinates"
1675 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3),
1676 & (c(j,i+nres),j=1,3)
1678 write (iout,*) "Initial dC"
1680 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),
1681 & (dc(j,i+nres),j=1,3)
1683 write (iout,*) "Initial velocities"
1684 write (iout,"(13x,' backbone ',23x,' side chain')")
1686 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1687 & (d_t(j,i+nres),j=1,3)
1689 write (iout,*) "Initial accelerations"
1691 c write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1692 write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3),
1693 & (d_a(j,i+nres),j=1,3)
1699 d_t_old(j,i)=d_t(j,i)
1700 d_a_old(j,i)=d_a(j,i)
1702 c write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3)
1711 call etotal_short(energia_short)
1712 if (large) call enerprint(potEcomp)
1715 t_eshort=t_eshort+MPI_Wtime()-tt0
1717 t_eshort=t_eshort+tcpu()-tt0
1722 if(.not.out1file .and. large) then
1723 write (iout,*) "energia_long",energia_long(0),
1724 & " energia_short",energia_short(0),
1725 & " total",energia_long(0)+energia_short(0)
1726 write (iout,*) "Initial fast-force accelerations"
1728 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1729 & (d_a(j,i+nres),j=1,3)
1732 C 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
1735 d_a_short(j,i)=d_a(j,i)
1744 call etotal_long(energia_long)
1745 if (large) call enerprint(potEcomp)
1748 t_elong=t_elong+MPI_Wtime()-tt0
1750 t_elong=t_elong+tcpu()-tt0
1755 if(.not.out1file .and. large) then
1756 write (iout,*) "energia_long",energia_long(0)
1757 write (iout,*) "Initial slow-force accelerations"
1759 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1760 & (d_a(j,i+nres),j=1,3)
1764 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1766 t_enegrad=t_enegrad+tcpu()-tt0
1771 c-----------------------------------------------------------
1772 subroutine random_vel
1773 implicit real*8 (a-h,o-z)
1774 include 'DIMENSIONS'
1775 include 'COMMON.CONTROL'
1776 include 'COMMON.VAR'
1779 include 'COMMON.LANGEVIN'
1781 include 'COMMON.LANGEVIN.lang0'
1783 include 'COMMON.CHAIN'
1784 include 'COMMON.DERIV'
1785 include 'COMMON.GEO'
1786 include 'COMMON.LOCAL'
1787 include 'COMMON.INTERACT'
1788 include 'COMMON.IOUNITS'
1789 include 'COMMON.NAMES'
1790 include 'COMMON.TIME1'
1791 double precision xv,sigv,lowb,highb
1792 c Generate random velocities from Gaussian distribution of mean 0 and std of KT/m
1793 c First generate velocities in the eigenspace of the G matrix
1794 c write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3
1801 sigv=dsqrt((Rb*t_bath)/geigen(i))
1804 d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb)
1805 c write (iout,*) "i",i," ii",ii," geigen",geigen(i),
1806 c & " d_t_work_new",d_t_work_new(ii)
1815 c Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2
1818 c write (iout,*) "Ek from eigenvectors",Ek1
1820 c Transform velocities to UNRES coordinate space
1826 d_t_work(ind)=d_t_work(ind)
1827 & +Gvec(i,j)*d_t_work_new((j-1)*3+k+1)
1829 c write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind)
1833 c Transfer to the d_t vector
1835 d_t(j,0)=d_t_work(j)
1841 d_t(j,i)=d_t_work(ind)
1845 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
1848 d_t(j,i+nres)=d_t_work(ind)
1853 c write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",
1854 c & 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
1859 c-----------------------------------------------------------
1860 subroutine sd_verlet_p_setup
1861 c Sets up the parameters of stochastic Verlet algorithm
1862 implicit real*8 (a-h,o-z)
1863 include 'DIMENSIONS'
1867 include 'COMMON.CONTROL'
1868 include 'COMMON.VAR'
1871 include 'COMMON.LANGEVIN'
1873 include 'COMMON.LANGEVIN.lang0'
1875 include 'COMMON.CHAIN'
1876 include 'COMMON.DERIV'
1877 include 'COMMON.GEO'
1878 include 'COMMON.LOCAL'
1879 include 'COMMON.INTERACT'
1880 include 'COMMON.IOUNITS'
1881 include 'COMMON.NAMES'
1882 include 'COMMON.TIME1'
1883 double precision emgdt(MAXRES6),
1884 & pterm,vterm,rho,rhoc,vsig,
1885 & pfric_vec(MAXRES6),vfric_vec(MAXRES6),
1886 & afric_vec(MAXRES6),prand_vec(MAXRES6),
1887 & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6)
1888 logical lprn /.false./
1889 double precision zero /1.0d-8/, gdt_radius /0.05d0/
1890 double precision ktm
1897 c AL 8/17/04 Code adapted from tinker
1899 c Get the frictional and random terms for stochastic dynamics in the
1900 c eigenspace of mass-scaled UNRES friction matrix
1903 gdt = fricgam(i) * d_time
1905 c Stochastic dynamics reduces to simple MD for zero friction
1907 if (gdt .le. zero) then
1908 pfric_vec(i) = 1.0d0
1909 vfric_vec(i) = d_time
1910 afric_vec(i) = 0.5d0 * d_time * d_time
1911 prand_vec(i) = 0.0d0
1912 vrand_vec1(i) = 0.0d0
1913 vrand_vec2(i) = 0.0d0
1915 c Analytical expressions when friction coefficient is large
1918 if (gdt .ge. gdt_radius) then
1921 vfric_vec(i) = (1.0d0-egdt) / fricgam(i)
1922 afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i)
1923 pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt
1924 vterm = 1.0d0 - egdt**2
1925 rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm)
1927 c Use series expansions when friction coefficient is small
1938 afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0
1939 & - gdt5/120.0d0 + gdt6/720.0d0
1940 & - gdt7/5040.0d0 + gdt8/40320.0d0
1941 & - gdt9/362880.0d0) / fricgam(i)**2
1942 vfric_vec(i) = d_time - fricgam(i)*afric_vec(i)
1943 pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i)
1944 pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0
1945 & + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0
1946 & + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0
1947 & + 127.0d0*gdt9/90720.0d0
1948 vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0
1949 & - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0
1950 & - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0
1951 & - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0
1952 rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0
1953 & - 17.0d0*gdt2/1280.0d0
1954 & + 17.0d0*gdt3/6144.0d0
1955 & + 40967.0d0*gdt4/34406400.0d0
1956 & - 57203.0d0*gdt5/275251200.0d0
1957 & - 1429487.0d0*gdt6/13212057600.0d0)
1960 c Compute the scaling factors of random terms for the nonzero friction case
1962 ktm = 0.5d0*d_time/fricgam(i)
1963 psig = dsqrt(ktm*pterm) / fricgam(i)
1964 vsig = dsqrt(ktm*vterm)
1965 rhoc = dsqrt(1.0d0 - rho*rho)
1967 vrand_vec1(i) = vsig * rho
1968 vrand_vec2(i) = vsig * rhoc
1973 & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",
1976 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),
1977 & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
1981 c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
1984 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
1985 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
1986 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
1987 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
1988 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1)
1989 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
1992 t_sdsetup=t_sdsetup+MPI_Wtime()
1994 t_sdsetup=t_sdsetup+tcpu()-tt0
1998 c-------------------------------------------------------------
1999 subroutine eigtransf1(n,ndim,ab,d,c)
2002 double precision ab(ndim,ndim,n),c(ndim,n),d(ndim)
2008 c(i,j)=c(i,j)+ab(k,j,i)*d(k)
2014 c-------------------------------------------------------------
2015 subroutine eigtransf(n,ndim,a,b,d,c)
2018 double precision a(ndim,n),b(ndim,n),c(ndim,n),d(ndim)
2024 c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k)
2030 c-------------------------------------------------------------
2031 subroutine sd_verlet1
2032 c Applying stochastic velocity Verlet algorithm - step 1 to velocities
2033 implicit real*8 (a-h,o-z)
2034 include 'DIMENSIONS'
2035 include 'COMMON.CONTROL'
2036 include 'COMMON.VAR'
2039 include 'COMMON.LANGEVIN'
2041 include 'COMMON.LANGEVIN.lang0'
2043 include 'COMMON.CHAIN'
2044 include 'COMMON.DERIV'
2045 include 'COMMON.GEO'
2046 include 'COMMON.LOCAL'
2047 include 'COMMON.INTERACT'
2048 include 'COMMON.IOUNITS'
2049 include 'COMMON.NAMES'
2050 double precision stochforcvec(MAXRES6)
2051 common /stochcalc/ stochforcvec
2052 logical lprn /.false./
2054 c write (iout,*) "dc_old"
2056 c write (iout,'(i5,3f10.5,5x,3f10.5)')
2057 c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
2060 dc_work(j)=dc_old(j,0)
2061 d_t_work(j)=d_t_old(j,0)
2062 d_a_work(j)=d_a_old(j,0)
2067 dc_work(ind+j)=dc_old(j,i)
2068 d_t_work(ind+j)=d_t_old(j,i)
2069 d_a_work(ind+j)=d_a_old(j,i)
2074 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
2076 dc_work(ind+j)=dc_old(j,i+nres)
2077 d_t_work(ind+j)=d_t_old(j,i+nres)
2078 d_a_work(ind+j)=d_a_old(j,i+nres)
2086 & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",
2090 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),
2091 & vfric_mat(i,j),afric_mat(i,j),
2092 & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
2100 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j)
2101 & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
2102 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
2103 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
2105 d_t_work_new(i)=ddt1+0.5d0*ddt2
2106 d_t_work(i)=ddt1+ddt2
2111 d_t(j,0)=d_t_work(j)
2116 dc(j,i)=dc_work(ind+j)
2117 d_t(j,i)=d_t_work(ind+j)
2122 if (itype(i).ne.10) then
2125 dc(j,inres)=dc_work(ind+j)
2126 d_t(j,inres)=d_t_work(ind+j)
2133 c--------------------------------------------------------------------------
2134 subroutine sd_verlet2
2135 c Calculating the adjusted velocities for accelerations
2136 implicit real*8 (a-h,o-z)
2137 include 'DIMENSIONS'
2138 include 'COMMON.CONTROL'
2139 include 'COMMON.VAR'
2142 include 'COMMON.LANGEVIN'
2144 include 'COMMON.LANGEVIN.lang0'
2146 include 'COMMON.CHAIN'
2147 include 'COMMON.DERIV'
2148 include 'COMMON.GEO'
2149 include 'COMMON.LOCAL'
2150 include 'COMMON.INTERACT'
2151 include 'COMMON.IOUNITS'
2152 include 'COMMON.NAMES'
2153 double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6)
2154 common /stochcalc/ stochforcvec
2156 c Compute the stochastic forces which contribute to velocity change
2158 call stochastic_force(stochforcvecV)
2165 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
2166 ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+
2167 & vrand_mat2(i,j)*stochforcvecV(j)
2169 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
2173 d_t(j,0)=d_t_work(j)
2178 d_t(j,i)=d_t_work(ind+j)
2183 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
2186 d_t(j,inres)=d_t_work(ind+j)
2193 c-----------------------------------------------------------
2194 subroutine sd_verlet_ciccotti_setup
2195 c Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's
2197 implicit real*8 (a-h,o-z)
2198 include 'DIMENSIONS'
2202 include 'COMMON.CONTROL'
2203 include 'COMMON.VAR'
2206 include 'COMMON.LANGEVIN'
2208 include 'COMMON.LANGEVIN.lang0'
2210 include 'COMMON.CHAIN'
2211 include 'COMMON.DERIV'
2212 include 'COMMON.GEO'
2213 include 'COMMON.LOCAL'
2214 include 'COMMON.INTERACT'
2215 include 'COMMON.IOUNITS'
2216 include 'COMMON.NAMES'
2217 include 'COMMON.TIME1'
2218 double precision emgdt(MAXRES6),
2219 & pterm,vterm,rho,rhoc,vsig,
2220 & pfric_vec(MAXRES6),vfric_vec(MAXRES6),
2221 & afric_vec(MAXRES6),prand_vec(MAXRES6),
2222 & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6)
2223 logical lprn /.false./
2224 double precision zero /1.0d-8/, gdt_radius /0.05d0/
2225 double precision ktm
2232 c AL 8/17/04 Code adapted from tinker
2234 c Get the frictional and random terms for stochastic dynamics in the
2235 c eigenspace of mass-scaled UNRES friction matrix
2238 write (iout,*) "i",i," fricgam",fricgam(i)
2239 gdt = fricgam(i) * d_time
2241 c Stochastic dynamics reduces to simple MD for zero friction
2243 if (gdt .le. zero) then
2244 pfric_vec(i) = 1.0d0
2245 vfric_vec(i) = d_time
2246 afric_vec(i) = 0.5d0*d_time*d_time
2247 prand_vec(i) = afric_vec(i)
2248 vrand_vec2(i) = vfric_vec(i)
2250 c Analytical expressions when friction coefficient is large
2255 vfric_vec(i) = dexp(-0.5d0*gdt)*d_time
2256 afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time
2257 prand_vec(i) = afric_vec(i)
2258 vrand_vec2(i) = vfric_vec(i)
2260 c Compute the scaling factors of random terms for the nonzero friction case
2262 c ktm = 0.5d0*d_time/fricgam(i)
2263 c psig = dsqrt(ktm*pterm) / fricgam(i)
2264 c vsig = dsqrt(ktm*vterm)
2265 c prand_vec(i) = psig*afric_vec(i)
2266 c vrand_vec2(i) = vsig*vfric_vec(i)
2271 & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",
2274 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),
2275 & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
2279 c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
2281 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
2282 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
2283 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
2284 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
2285 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
2287 t_sdsetup=t_sdsetup+MPI_Wtime()
2289 t_sdsetup=t_sdsetup+tcpu()-tt0
2293 c-------------------------------------------------------------
2294 subroutine sd_verlet1_ciccotti
2295 c Applying stochastic velocity Verlet algorithm - step 1 to velocities
2296 implicit real*8 (a-h,o-z)
2297 include 'DIMENSIONS'
2301 include 'COMMON.CONTROL'
2302 include 'COMMON.VAR'
2305 include 'COMMON.LANGEVIN'
2307 include 'COMMON.LANGEVIN.lang0'
2309 include 'COMMON.CHAIN'
2310 include 'COMMON.DERIV'
2311 include 'COMMON.GEO'
2312 include 'COMMON.LOCAL'
2313 include 'COMMON.INTERACT'
2314 include 'COMMON.IOUNITS'
2315 include 'COMMON.NAMES'
2316 double precision stochforcvec(MAXRES6)
2317 common /stochcalc/ stochforcvec
2318 logical lprn /.false./
2320 c write (iout,*) "dc_old"
2322 c write (iout,'(i5,3f10.5,5x,3f10.5)')
2323 c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
2326 dc_work(j)=dc_old(j,0)
2327 d_t_work(j)=d_t_old(j,0)
2328 d_a_work(j)=d_a_old(j,0)
2333 dc_work(ind+j)=dc_old(j,i)
2334 d_t_work(ind+j)=d_t_old(j,i)
2335 d_a_work(ind+j)=d_a_old(j,i)
2340 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
2342 dc_work(ind+j)=dc_old(j,i+nres)
2343 d_t_work(ind+j)=d_t_old(j,i+nres)
2344 d_a_work(ind+j)=d_a_old(j,i+nres)
2353 & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",
2357 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),
2358 & vfric_mat(i,j),afric_mat(i,j),
2359 & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
2367 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j)
2368 & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
2369 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
2370 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
2372 d_t_work_new(i)=ddt1+0.5d0*ddt2
2373 d_t_work(i)=ddt1+ddt2
2378 d_t(j,0)=d_t_work(j)
2383 dc(j,i)=dc_work(ind+j)
2384 d_t(j,i)=d_t_work(ind+j)
2389 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
2392 dc(j,inres)=dc_work(ind+j)
2393 d_t(j,inres)=d_t_work(ind+j)
2400 c--------------------------------------------------------------------------
2401 subroutine sd_verlet2_ciccotti
2402 c Calculating the adjusted velocities for accelerations
2403 implicit real*8 (a-h,o-z)
2404 include 'DIMENSIONS'
2405 include 'COMMON.CONTROL'
2406 include 'COMMON.VAR'
2409 include 'COMMON.LANGEVIN'
2411 include 'COMMON.LANGEVIN.lang0'
2413 include 'COMMON.CHAIN'
2414 include 'COMMON.DERIV'
2415 include 'COMMON.GEO'
2416 include 'COMMON.LOCAL'
2417 include 'COMMON.INTERACT'
2418 include 'COMMON.IOUNITS'
2419 include 'COMMON.NAMES'
2420 double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6)
2421 common /stochcalc/ stochforcvec
2423 c Compute the stochastic forces which contribute to velocity change
2425 call stochastic_force(stochforcvecV)
2432 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
2433 c ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j)
2434 ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j)
2436 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
2440 d_t(j,0)=d_t_work(j)
2445 d_t(j,i)=d_t_work(ind+j)
2450 if (itype(i).ne.10 .and. itype(i).ne.ntyp1) then
2453 d_t(j,inres)=d_t_work(ind+j)