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 double precision cm(3),L(3),vcm(3)
30 double precision v_work(maxres6),v_transf(maxres6)
39 if (ilen(tmpdir).gt.0)
40 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_"
41 & //liczba(:ilen(liczba))//'.rst')
43 if (ilen(tmpdir).gt.0)
44 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_"//'.rst')
51 write (iout,'(20(1h=),a20,20(1h=))') "MD calculation started"
57 c Determine the inverse of the inertia matrix.
58 call setup_MD_matrices
62 t_MDsetup = MPI_Wtime()-tt0
64 t_MDsetup = tcpu()-tt0
67 c Entering the MD loop
73 if (lang.eq.2 .or. lang.eq.3) then
77 call sd_verlet_p_setup
79 call sd_verlet_ciccotti_setup
83 pfric0_mat(i,j,0)=pfric_mat(i,j)
84 afric0_mat(i,j,0)=afric_mat(i,j)
85 vfric0_mat(i,j,0)=vfric_mat(i,j)
86 prand0_mat(i,j,0)=prand_mat(i,j)
87 vrand0_mat1(i,j,0)=vrand_mat1(i,j)
88 vrand0_mat2(i,j,0)=vrand_mat2(i,j)
97 & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
99 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
103 else if (lang.eq.1 .or. lang.eq.4) then
107 t_langsetup=MPI_Wtime()-tt0
110 t_langsetup=tcpu()-tt0
113 do itime=1,n_timestep
115 if (lang.gt.0 .and. surfarea .and.
116 & mod(itime,reset_fricmat).eq.0) then
117 if (lang.eq.2 .or. lang.eq.3) then
121 call sd_verlet_p_setup
123 call sd_verlet_ciccotti_setup
127 pfric0_mat(i,j,0)=pfric_mat(i,j)
128 afric0_mat(i,j,0)=afric_mat(i,j)
129 vfric0_mat(i,j,0)=vfric_mat(i,j)
130 prand0_mat(i,j,0)=prand_mat(i,j)
131 vrand0_mat1(i,j,0)=vrand_mat1(i,j)
132 vrand0_mat2(i,j,0)=vrand_mat2(i,j)
137 flag_stoch(i)=.false.
140 else if (lang.eq.1 .or. lang.eq.4) then
143 write (iout,'(a,i10)')
144 & "Friction matrix reset based on surface area, itime",itime
146 if (reset_vel .and. tbf .and. lang.eq.0
147 & .and. mod(itime,count_reset_vel).eq.0) then
149 write(iout,'(a,f20.2)')
150 & "Velocities reset to random values, time",totT
153 d_t_old(j,i)=d_t(j,i)
157 if (reset_moment .and. mod(itime,count_reset_moment).eq.0) then
161 d_t(j,0)=d_t(j,0)-vcm(j)
164 kinetic_T=2.0d0/(dimen3*Rb)*EK
165 scalfac=dsqrt(T_bath/kinetic_T)
166 write(iout,'(a,f20.2)') "Momenta zeroed out, time",totT
169 d_t_old(j,i)=scalfac*d_t(j,i)
175 c Time-reversible RESPA algorithm
176 c (Tuckerman et al., J. Chem. Phys., 97, 1990, 1992)
177 call RESPA_step(itime)
179 c Variable time step algorithm.
180 call velverlet_step(itime)
184 call brown_step(itime)
186 print *,"Brown dynamics not here!"
188 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
194 if (mod(itime,ntwe).eq.0) call statout(itime)
207 if (itype(i).ne.10) then
210 v_work(ind)=d_t(j,i+nres)
215 write (66,'(80f10.5)')
216 & ((d_t(j,i),j=1,3),i=0,nres-1),((d_t(j,i+nres),j=1,3),i=1,nres)
220 v_transf(i)=v_transf(i)+gvec(j,i)*v_work(j)
222 v_transf(i)= v_transf(i)*dsqrt(geigen(i))
224 write (67,'(80f10.5)') (v_transf(i),i=1,ind)
227 if (mod(itime,ntwx).eq.0) then
228 write (tytul,'("time",f8.2)') totT
230 call pdbout(potE,tytul,ipdb)
235 if (rstcount.eq.1000.or.itime.eq.n_timestep) then
236 open(irest2,file=rest2name,status='unknown')
237 write(irest2,*) totT,EK,potE,totE,t_bath
239 write (irest2,'(3e15.5)') (d_t(j,i),j=1,3)
242 write (irest2,'(3e15.5)') (dc(j,i),j=1,3)
253 write (iout,'(//35(1h=),a10,35(1h=)/10(/a40,1pe15.5))')
255 & 'MD calculations setup:',t_MDsetup,
256 & 'Energy & gradient evaluation:',t_enegrad,
257 & 'Stochastic MD setup:',t_langsetup,
258 & 'Stochastic MD step setup:',t_sdsetup,
260 write (iout,'(/28(1h=),a25,27(1h=))')
261 & ' End of MD calculation '
263 write (iout,*) "time for etotal",t_etotal," elong",t_elong,
265 write (iout,*) "time_fric",time_fric," time_stoch",time_stoch,
266 & " time_fricmatmult",time_fricmatmult," time_fsample ",
271 c-------------------------------------------------------------------------------
272 subroutine velverlet_step(itime)
273 c-------------------------------------------------------------------------------
274 c Perform a single velocity Verlet step; the time step can be rescaled if
275 c increments in accelerations exceed the threshold
276 c-------------------------------------------------------------------------------
277 implicit real*8 (a-h,o-z)
281 integer ierror,ierrcode
283 include 'COMMON.SETUP'
284 include 'COMMON.CONTROL'
288 include 'COMMON.LANGEVIN'
290 include 'COMMON.LANGEVIN.lang0'
292 include 'COMMON.CHAIN'
293 include 'COMMON.DERIV'
295 include 'COMMON.LOCAL'
296 include 'COMMON.INTERACT'
297 include 'COMMON.IOUNITS'
298 include 'COMMON.NAMES'
299 include 'COMMON.TIME1'
300 include 'COMMON.MUCA'
301 double precision vcm(3),incr(3)
302 double precision cm(3),L(3)
303 integer ilen,count,rstcount
306 integer maxcount_scale /20/
308 double precision stochforcvec(MAXRES6)
309 common /stochcalc/ stochforcvec
312 double precision HNose1,HNose,HNose_nh,H,vtnp(maxres6)
313 double precision vtnp_(maxres6),vtnp_a(maxres6)
319 else if (lang.eq.2 .or. lang.eq.3) then
321 call stochastic_force(stochforcvec)
324 & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
326 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
333 icount_scale=icount_scale+1
334 if (icount_scale.gt.maxcount_scale) then
336 & "ERROR: too many attempts at scaling down the time step. ",
337 & "amax=",amax,"epdrift=",epdrift,
338 & "damax=",damax,"edriftmax=",edriftmax,
342 call MPI_Abort(MPI_COMM_WORLD,IERROR,IERRCODE)
346 c First step of the velocity Verlet algorithm
351 else if (lang.eq.3) then
353 call sd_verlet1_ciccotti
355 else if (lang.eq.1) then
363 call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8)
366 d_t_old(j,i)=d_t_old(j,i)*scale_nh
372 c Build the chain from the newly calculated coordinates
374 if (rattle) call rattle1
376 if (large.and. mod(itime,ntwe).eq.0) then
377 write (iout,*) "Cartesian and internal coordinates: step 1"
382 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),
383 & (dc(j,i+nres),j=1,3)
385 write (iout,*) "Accelerations"
387 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
388 & (d_a(j,i+nres),j=1,3)
390 write (iout,*) "Velocities, step 1"
392 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
393 & (d_t(j,i+nres),j=1,3)
402 c Calculate energy and forces
404 call etotal(potEcomp)
407 t_etotal=t_etotal+MPI_Wtime()-tt0
409 t_etotal=t_etotal+tcpu()-tt0
413 potE=potEcomp(0)-potEcomp(20)
415 c Get the new accelerations
418 t_enegrad=t_enegrad+MPI_Wtime()-tt0
420 t_enegrad=t_enegrad+tcpu()-tt0
422 c Determine maximum acceleration and scale down the timestep if needed
424 amax=amax/(itime_scal+1)**2
425 call predict_edrift(epdrift)
426 if (amax/(itime_scal+1).gt.damax .or. epdrift.gt.edriftmax) then
427 c Maximum acceleration or maximum predicted energy drift exceeded, rescale the time step
429 ifac_time=dmax1(dlog(amax/damax),dlog(epdrift/edriftmax))
431 itime_scal=itime_scal+ifac_time
432 c fac_time=dmin1(damax/amax,0.5d0)
433 fac_time=0.5d0**ifac_time
434 d_time=d_time*fac_time
435 if (lang.eq.2 .or. lang.eq.3) then
437 c write (iout,*) "Calling sd_verlet_setup: 1"
438 c Rescale the stochastic forces and recalculate or restore
439 c the matrices of tinker integrator
440 if (itime_scal.gt.maxflag_stoch) then
441 if (large) write (iout,'(a,i5,a)')
442 & "Calculate matrices for stochastic step;",
443 & " itime_scal ",itime_scal
445 call sd_verlet_p_setup
447 call sd_verlet_ciccotti_setup
449 write (iout,'(2a,i3,a,i3,1h.)')
450 & "Warning: cannot store matrices for stochastic",
451 & " integration because the index",itime_scal,
452 & " is greater than",maxflag_stoch
453 write (iout,'(2a)')"Increase MAXFLAG_STOCH or use direct",
454 & " integration Langevin algorithm for better efficiency."
455 else if (flag_stoch(itime_scal)) then
456 if (large) write (iout,'(a,i5,a,l1)')
457 & "Restore matrices for stochastic step; itime_scal ",
458 & itime_scal," flag ",flag_stoch(itime_scal)
461 pfric_mat(i,j)=pfric0_mat(i,j,itime_scal)
462 afric_mat(i,j)=afric0_mat(i,j,itime_scal)
463 vfric_mat(i,j)=vfric0_mat(i,j,itime_scal)
464 prand_mat(i,j)=prand0_mat(i,j,itime_scal)
465 vrand_mat1(i,j)=vrand0_mat1(i,j,itime_scal)
466 vrand_mat2(i,j)=vrand0_mat2(i,j,itime_scal)
470 if (large) write (iout,'(2a,i5,a,l1)')
471 & "Calculate & store matrices for stochastic step;",
472 & " itime_scal ",itime_scal," flag ",flag_stoch(itime_scal)
474 call sd_verlet_p_setup
476 call sd_verlet_ciccotti_setup
478 flag_stoch(ifac_time)=.true.
481 pfric0_mat(i,j,itime_scal)=pfric_mat(i,j)
482 afric0_mat(i,j,itime_scal)=afric_mat(i,j)
483 vfric0_mat(i,j,itime_scal)=vfric_mat(i,j)
484 prand0_mat(i,j,itime_scal)=prand_mat(i,j)
485 vrand0_mat1(i,j,itime_scal)=vrand_mat1(i,j)
486 vrand0_mat2(i,j,itime_scal)=vrand_mat2(i,j)
490 fac_time=1.0d0/dsqrt(fac_time)
492 stochforcvec(i)=fac_time*stochforcvec(i)
495 else if (lang.eq.1) then
496 c Rescale the accelerations due to stochastic forces
497 fac_time=1.0d0/dsqrt(fac_time)
499 d_as_work(i)=d_as_work(i)*fac_time
502 if (large) write (iout,'(a,i10,a,f8.6,a,i3,a,i3)')
503 & "itime",itime," Timestep scaled down to ",
504 & d_time," ifac_time",ifac_time," itime_scal",itime_scal
506 c Second step of the velocity Verlet algorithm
511 else if (lang.eq.3) then
513 call sd_verlet2_ciccotti
515 else if (lang.eq.1) then
525 call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8)
528 d_t(j,i)=d_t(j,i)*scale_nh
533 if (rattle) call rattle2
535 if (d_time.ne.d_time0) then
538 if (lang.eq.2 .or. lang.eq.3) then
539 if (large) write (iout,'(a)')
540 & "Restore original matrices for stochastic step"
541 c write (iout,*) "Calling sd_verlet_setup: 2"
542 c Restore the matrices of tinker integrator if the time step has been restored
545 pfric_mat(i,j)=pfric0_mat(i,j,0)
546 afric_mat(i,j)=afric0_mat(i,j,0)
547 vfric_mat(i,j)=vfric0_mat(i,j,0)
548 prand_mat(i,j)=prand0_mat(i,j,0)
549 vrand_mat1(i,j)=vrand0_mat1(i,j,0)
550 vrand_mat2(i,j)=vrand0_mat2(i,j,0)
559 c Calculate the kinetic and the total energy and the kinetic temperature
560 if (tnp .or. tnp1) then
563 d_t_old(j,i)=d_t(j,i)
564 d_t(j,i)=d_t(j,i)/s_np
572 c write (iout,*) "step",itime," EK",EK," EK1",EK1
574 c Couple the system to Berendsen bath if needed
575 if (tbf .and. lang.eq.0) then
578 kinetic_T=2.0d0/(dimen3*Rb)*EK
579 c Backup the coordinates, velocities, and accelerations
583 if(.not.(tnp .or. tnp1)) d_t_old(j,i)=d_t(j,i)
584 d_a_old(j,i)=d_a(j,i)
588 if (mod(itime,ntwe).eq.0) then
590 if(tnp .or. tnp1) then
591 HNose1=Hnose(EK,s_np,potE,pi_np,Q_np,t_bath,dimen3)
593 cd write (iout,'(a,10f)') "hhh",EK,s_np,potE,pi_np,H0
594 cd & ,EK+potE+pi_np**2/(2*Q_np)+dimen3*0.001986d0*t_bath*log(s_np)
595 cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0
600 HNose1=Hnose_nh(EK,potE)
603 cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0
619 if (itype(i).ne.10) then
623 vtnp(itnp)=d_t(j,inres)
628 c Transform velocities from UNRES coordinate space to cartesian and Gvec
635 vtnp_(i)=vtnp_(i)+Gvec(j,i)*vtnp(j)
636 vtnp_a(i)=vtnp_a(i)+A(i,j)*vtnp(j)
638 vtnp_(i)=vtnp_(i)*dsqrt(geigen(i))
642 write (iout,'("WWW",i3,3f10.5)') i,vtnp(i),vtnp_(i),vtnp_a(i)
645 write (iout,*) "Velocities, step 2"
647 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
648 & (d_t(j,i+nres),j=1,3)
655 c-------------------------------------------------------------------------------
656 subroutine RESPA_step(itime)
657 c-------------------------------------------------------------------------------
658 c Perform a single RESPA step.
659 c-------------------------------------------------------------------------------
660 implicit real*8 (a-h,o-z)
664 integer IERROR,ERRCODE
666 include 'COMMON.SETUP'
667 include 'COMMON.CONTROL'
671 include 'COMMON.LANGEVIN'
673 include 'COMMON.LANGEVIN.lang0'
675 include 'COMMON.CHAIN'
676 include 'COMMON.DERIV'
678 include 'COMMON.LOCAL'
679 include 'COMMON.INTERACT'
680 include 'COMMON.IOUNITS'
681 include 'COMMON.NAMES'
682 include 'COMMON.TIME1'
683 double precision energia_short(0:n_ene),
684 & energia_long(0:n_ene)
685 double precision cm(3),L(3),vcm(3),incr(3)
686 double precision dc_old0(3,0:maxres2),d_t_old0(3,0:maxres2),
687 & d_a_old0(3,0:maxres2)
688 integer ilen,count,rstcount
691 integer maxcount_scale /10/
692 common /gucio/ cm,energia_short
693 double precision stochforcvec(MAXRES6)
694 common /stochcalc/ stochforcvec
697 double precision vtnp(maxres6), vtnp_(maxres6), vtnp_a(maxres6)
698 common /cipiszcze/ itt
701 if (large.and. mod(itime,ntwe).eq.0) then
702 write (iout,*) "***************** RESPA itime",itime
703 write (iout,*) "Cartesian and internal coordinates: step 0"
705 call pdbout(0.0d0,"cipiszcze",iout)
707 write (iout,*) "Accelerations from long-range forces"
709 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
710 & (d_a(j,i+nres),j=1,3)
712 write (iout,*) "Velocities, step 0"
714 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
715 & (d_t(j,i+nres),j=1,3)
720 c Perform the initial RESPA step (increment velocities)
721 c write (iout,*) "*********************** RESPA ini"
727 if (tnh.and..not.xiresp) then
728 call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8)
731 d_t(j,i)=d_t(j,i)*scale_nh
738 cd if(tnp .or. tnp1) then
739 cd write (iout,'(a,3f)') "EE1 NP S, pi",totT, s_np, pi_np
743 if (mod(itime,ntwe).eq.0 .and. large) then
744 write (iout,*) "Velocities, end"
746 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
747 & (d_t(j,i+nres),j=1,3)
751 c Compute the short-range forces
757 C 7/2/2009 commented out
759 c call etotal_short(energia_short)
760 if (tnp.or.tnp1) potE=energia_short(0)
763 C 7/2/2009 Copy accelerations due to short-lange forces from previous MD step
766 d_a(j,i)=d_a_short(j,i)
770 if (large.and. mod(itime,ntwe).eq.0) then
771 write (iout,*) "energia_short",energia_short(0)
772 write (iout,*) "Accelerations from short-range forces"
774 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
775 & (d_a(j,i+nres),j=1,3)
780 t_enegrad=t_enegrad+MPI_Wtime()-tt0
782 t_enegrad=t_enegrad+tcpu()-tt0
787 if(.not.(tnp .or. tnp1)) d_t_old(j,i)=d_t(j,i)
788 d_a_old(j,i)=d_a(j,i)
791 c 6/30/08 A-MTS: attempt at increasing the split number
794 dc_old0(j,i)=dc_old(j,i)
795 d_t_old0(j,i)=d_t_old(j,i)
796 d_a_old0(j,i)=d_a_old(j,i)
799 if (ntime_split.gt.ntime_split0) ntime_split=ntime_split/2
800 if (ntime_split.lt.ntime_split0) ntime_split=ntime_split0
807 c write (iout,*) "itime",itime," ntime_split",ntime_split
808 c Split the time step
809 d_time=d_time0/ntime_split
810 c Perform the short-range RESPA steps (velocity Verlet increments of
811 c positions and velocities using short-range forces)
812 c write (iout,*) "*********************** RESPA split"
813 do itsplit=1,ntime_split
816 else if (lang.eq.2 .or. lang.eq.3) then
818 call stochastic_force(stochforcvec)
821 & "LANG=2 or 3 NOT SUPPORTED. Recompile without -DLANG0"
823 call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
828 c First step of the velocity Verlet algorithm
833 else if (lang.eq.3) then
835 call sd_verlet1_ciccotti
837 else if (lang.eq.1) then
840 call tnp1_respa_i_step1
842 call tnp_respa_i_step1
844 if (tnh.and.xiresp) then
846 call nhcint(EK,scale_nh,wdtii,wdtii2,wdtii4,wdtii8)
849 d_t_old(j,i)=d_t_old(j,i)*scale_nh
852 cd write(iout,*) "SSS1",itsplit,EK,scale_nh
856 c Build the chain from the newly calculated coordinates
858 if (rattle) call rattle1
860 if (large.and. mod(itime,ntwe).eq.0) then
861 write (iout,*) "***** ITSPLIT",itsplit
862 write (iout,*) "Cartesian and internal coordinates: step 1"
863 call pdbout(0.0d0,"cipiszcze",iout)
866 write (iout,*) "Velocities, step 1"
868 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
869 & (d_t(j,i+nres),j=1,3)
878 c Calculate energy and forces
880 call etotal_short(energia_short)
882 potE=energia_short(0)
885 t_eshort=t_eshort+MPI_Wtime()-tt0
887 t_eshort=t_eshort+tcpu()-tt0
891 c Get the new accelerations
893 C 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
896 d_a_short(j,i)=d_a(j,i)
900 if (large.and. mod(itime,ntwe).eq.0) then
901 write (iout,*)"energia_short",energia_short(0)
902 write (iout,*) "Accelerations from short-range forces"
904 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
905 & (d_a(j,i+nres),j=1,3)
910 c Determine maximum acceleration and scale down the timestep if needed
912 amax=amax/ntime_split**2
913 call predict_edrift(epdrift)
914 if (ntwe.gt.0 .and. large .and. mod(itime,ntwe).eq.0)
915 & write (iout,*) "amax",amax," damax",damax,
916 & " epdrift",epdrift," epdriftmax",epdriftmax
917 c Exit loop and try with increased split number if the change of
918 c acceleration is too big
919 if (amax.gt.damax .or. epdrift.gt.edriftmax) then
920 if (ntime_split.lt.maxtime_split) then
922 ntime_split=ntime_split*2
925 dc_old(j,i)=dc_old0(j,i)
926 d_t_old(j,i)=d_t_old0(j,i)
927 d_a_old(j,i)=d_a_old0(j,i)
930 write (iout,*) "acceleration/energy drift too large",amax,
931 & epdrift," split increased to ",ntime_split," itime",itime,
936 & "Uh-hu. Bumpy landscape. Maximum splitting number",
938 & " already reached!!! Trying to carry on!"
942 t_enegrad=t_enegrad+MPI_Wtime()-tt0
944 t_enegrad=t_enegrad+tcpu()-tt0
946 c Second step of the velocity Verlet algorithm
951 else if (lang.eq.3) then
953 call sd_verlet2_ciccotti
955 else if (lang.eq.1) then
958 call tnp1_respa_i_step2
960 call tnp_respa_i_step2
963 if (tnh.and.xiresp) then
965 call nhcint(EK,scale_nh,wdtii,wdtii2,wdtii4,wdtii8)
968 d_t(j,i)=d_t(j,i)*scale_nh
971 cd write(iout,*) "SSS2",itsplit,EK,scale_nh
974 if (rattle) call rattle2
975 c Backup the coordinates, velocities, and accelerations
976 if (tnp .or. tnp1) then
979 d_t_old(j,i)=d_t(j,i)
980 if (tnp) d_t(j,i)=d_t(j,i)/s_np
981 if (tnp1) d_t(j,i)=d_t(j,i)/s_np
989 if(.not.(tnp .or. tnp1)) d_t_old(j,i)=d_t(j,i)
990 d_a_old(j,i)=d_a(j,i)
997 c Restore the time step
999 c Compute long-range forces
1006 call etotal_long(energia_long)
1007 E_long=energia_long(0)
1008 potE=energia_short(0)+energia_long(0)
1011 t_elong=t_elong+MPI_Wtime()-tt0
1013 t_elong=t_elong+tcpu()-tt0
1019 t_enegrad=t_enegrad+MPI_Wtime()-tt0
1021 t_enegrad=t_enegrad+tcpu()-tt0
1023 c Compute accelerations from long-range forces
1025 if (large.and. mod(itime,ntwe).eq.0) then
1026 write (iout,*) "energia_long",energia_long(0)
1027 write (iout,*) "Cartesian and internal coordinates: step 2"
1029 call pdbout(0.0d0,"cipiszcze",iout)
1031 write (iout,*) "Accelerations from long-range forces"
1033 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1034 & (d_a(j,i+nres),j=1,3)
1036 write (iout,*) "Velocities, step 2"
1038 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1039 & (d_t(j,i+nres),j=1,3)
1043 c Compute the final RESPA step (increment velocities)
1044 c write (iout,*) "*********************** RESPA fin"
1046 call tnp_respa_step2
1048 call tnp_respa_step2
1051 if (tnh.and..not.xiresp) then
1053 call nhcint(EK,scale_nh,wdti,wdti2,wdti4,wdti8)
1056 d_t(j,i)=d_t(j,i)*scale_nh
1062 if (tnp .or. tnp1) then
1065 d_t(j,i)=d_t_old(j,i)/s_np
1070 c Compute the complete potential energy
1072 potEcomp(i)=energia_short(i)+energia_long(i)
1074 potE=potEcomp(0)-potEcomp(20)
1075 c potE=energia_short(0)+energia_long(0)
1077 c Calculate the kinetic and the total energy and the kinetic temperature
1080 c Couple the system to Berendsen bath if needed
1081 if (tbf .and. lang.eq.0) then
1084 kinetic_T=2.0d0/(dimen3*Rb)*EK
1085 c Backup the coordinates, velocities, and accelerations
1087 if (mod(itime,ntwe).eq.0 .and. large) then
1088 write (iout,*) "Velocities, end"
1090 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1091 & (d_t(j,i+nres),j=1,3)
1095 if (mod(itime,ntwe).eq.0) then
1097 if(tnp .or. tnp1) then
1099 write (iout,'(a3,7f20.10)') "TTT",EK,s_np,potE,pi_np,Csplit,
1100 & E_long,energia_short(0)
1102 write (iout,'(a3,7f20.10)') "TTT",EK,s_np,potE,pi_np,Csplit,
1103 & E_long,energia_short(0)
1105 HNose1=Hnose(EK,s_np,potE,pi_np,Q_np,t_bath,dimen3)
1107 cd write (iout,'(a,10f)') "hhh",EK,s_np,potE,pi_np,H0
1108 cd & ,EK+potE+pi_np**2/(2*Q_np)+dimen3*0.001986d0*t_bath*log(s_np)
1109 cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0
1111 cd write (iout,'(a,3f)') "EE2 NP S, pi",totT, s_np, pi_np
1115 HNose1=Hnose_nh(EK,potE)
1117 cd write (iout,*) "HHH H=",H,abs(HNose1-H0)/H0
1135 if (itype(i).ne.10) then
1139 vtnp(itnp)=d_t(j,inres)
1144 c Transform velocities from UNRES coordinate space to cartesian and Gvec
1151 vtnp_(i)=vtnp_(i)+Gvec(j,i)*vtnp(j)
1152 vtnp_a(i)=vtnp_a(i)+A(i,j)*vtnp(j)
1154 vtnp_(i)=vtnp_(i)*dsqrt(geigen(i))
1158 write (iout,'("WWW",i3,3f10.5)') i,vtnp(i),vtnp_(i),vtnp_a(i)
1168 c---------------------------------------------------------------------
1169 subroutine RESPA_vel
1170 c First and last RESPA step (incrementing velocities using long-range
1172 implicit real*8 (a-h,o-z)
1173 include 'DIMENSIONS'
1174 include 'COMMON.CONTROL'
1175 include 'COMMON.VAR'
1177 include 'COMMON.CHAIN'
1178 include 'COMMON.DERIV'
1179 include 'COMMON.GEO'
1180 include 'COMMON.LOCAL'
1181 include 'COMMON.INTERACT'
1182 include 'COMMON.IOUNITS'
1183 include 'COMMON.NAMES'
1185 d_t(j,0)=d_t(j,0)+0.5d0*d_a(j,0)*d_time
1189 d_t(j,i)=d_t(j,i)+0.5d0*d_a(j,i)*d_time
1193 if (itype(i).ne.10) then
1196 d_t(j,inres)=d_t(j,inres)+0.5d0*d_a(j,inres)*d_time
1202 c-----------------------------------------------------------------
1204 c Applying velocity Verlet algorithm - step 1 to coordinates
1205 implicit real*8 (a-h,o-z)
1206 include 'DIMENSIONS'
1207 include 'COMMON.CONTROL'
1208 include 'COMMON.VAR'
1210 include 'COMMON.CHAIN'
1211 include 'COMMON.DERIV'
1212 include 'COMMON.GEO'
1213 include 'COMMON.LOCAL'
1214 include 'COMMON.INTERACT'
1215 include 'COMMON.IOUNITS'
1216 include 'COMMON.NAMES'
1217 double precision adt,adt2
1220 write (iout,*) "VELVERLET1 START: DC"
1222 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),
1223 & (dc(j,i+nres),j=1,3)
1227 adt=d_a_old(j,0)*d_time
1229 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
1230 d_t_new(j,0)=d_t_old(j,0)+adt2
1231 d_t(j,0)=d_t_old(j,0)+adt
1235 adt=d_a_old(j,i)*d_time
1237 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
1238 d_t_new(j,i)=d_t_old(j,i)+adt2
1239 d_t(j,i)=d_t_old(j,i)+adt
1243 if (itype(i).ne.10) then
1246 adt=d_a_old(j,inres)*d_time
1248 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
1249 d_t_new(j,inres)=d_t_old(j,inres)+adt2
1250 d_t(j,inres)=d_t_old(j,inres)+adt
1255 write (iout,*) "VELVERLET1 END: DC"
1257 write (iout,'(i3,3f10.5,5x,3f10.5)') i,(dc(j,i),j=1,3),
1258 & (dc(j,i+nres),j=1,3)
1263 c---------------------------------------------------------------------
1265 c Step 2 of the velocity Verlet algorithm: update velocities
1266 implicit real*8 (a-h,o-z)
1267 include 'DIMENSIONS'
1268 include 'COMMON.CONTROL'
1269 include 'COMMON.VAR'
1271 include 'COMMON.CHAIN'
1272 include 'COMMON.DERIV'
1273 include 'COMMON.GEO'
1274 include 'COMMON.LOCAL'
1275 include 'COMMON.INTERACT'
1276 include 'COMMON.IOUNITS'
1277 include 'COMMON.NAMES'
1279 d_t(j,0)=d_t_new(j,0)+0.5d0*d_a(j,0)*d_time
1283 d_t(j,i)=d_t_new(j,i)+0.5d0*d_a(j,i)*d_time
1287 if (itype(i).ne.10) then
1290 d_t(j,inres)=d_t_new(j,inres)+0.5d0*d_a(j,inres)*d_time
1296 c-----------------------------------------------------------------
1297 subroutine sddir_precalc
1298 c Applying velocity Verlet algorithm - step 1 to coordinates
1299 implicit real*8 (a-h,o-z)
1300 include 'DIMENSIONS'
1304 include 'COMMON.CONTROL'
1305 include 'COMMON.VAR'
1308 include 'COMMON.LANGEVIN'
1310 include 'COMMON.LANGEVIN.lang0'
1312 include 'COMMON.CHAIN'
1313 include 'COMMON.DERIV'
1314 include 'COMMON.GEO'
1315 include 'COMMON.LOCAL'
1316 include 'COMMON.INTERACT'
1317 include 'COMMON.IOUNITS'
1318 include 'COMMON.NAMES'
1319 include 'COMMON.TIME1'
1320 double precision stochforcvec(MAXRES6)
1321 common /stochcalc/ stochforcvec
1323 c Compute friction and stochastic forces
1332 time_fric=time_fric+MPI_Wtime()-time00
1335 time_fric=time_fric+tcpu()-time00
1338 call stochastic_force(stochforcvec)
1340 time_stoch=time_stoch+MPI_Wtime()-time00
1342 time_stoch=time_stoch+tcpu()-time00
1345 c Compute the acceleration due to friction forces (d_af_work) and stochastic
1346 c forces (d_as_work)
1348 call ginv_mult(fric_work, d_af_work)
1349 call ginv_mult(stochforcvec, d_as_work)
1352 c---------------------------------------------------------------------
1353 subroutine sddir_verlet1
1354 c Applying velocity Verlet algorithm - step 1 to velocities
1355 implicit real*8 (a-h,o-z)
1356 include 'DIMENSIONS'
1357 include 'COMMON.CONTROL'
1358 include 'COMMON.VAR'
1361 include 'COMMON.LANGEVIN'
1363 include 'COMMON.LANGEVIN.lang0'
1365 include 'COMMON.CHAIN'
1366 include 'COMMON.DERIV'
1367 include 'COMMON.GEO'
1368 include 'COMMON.LOCAL'
1369 include 'COMMON.INTERACT'
1370 include 'COMMON.IOUNITS'
1371 include 'COMMON.NAMES'
1372 c Revised 3/31/05 AL: correlation between random contributions to
1373 c position and velocity increments included.
1374 double precision sqrt13 /0.57735026918962576451d0/ ! 1/sqrt(3)
1375 double precision adt,adt2
1377 c Add the contribution from BOTH friction and stochastic force to the
1378 c coordinates, but ONLY the contribution from the friction forces to velocities
1381 adt=(d_a_old(j,0)+d_af_work(j))*d_time
1382 adt2=0.5d0*adt+sqrt13*d_as_work(j)*d_time
1383 dc(j,0)=dc_old(j,0)+(d_t_old(j,0)+adt2)*d_time
1384 d_t_new(j,0)=d_t_old(j,0)+0.5d0*adt
1385 d_t(j,0)=d_t_old(j,0)+adt
1390 adt=(d_a_old(j,i)+d_af_work(ind+j))*d_time
1391 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
1392 dc(j,i)=dc_old(j,i)+(d_t_old(j,i)+adt2)*d_time
1393 d_t_new(j,i)=d_t_old(j,i)+0.5d0*adt
1394 d_t(j,i)=d_t_old(j,i)+adt
1399 if (itype(i).ne.10) then
1402 adt=(d_a_old(j,inres)+d_af_work(ind+j))*d_time
1403 adt2=0.5d0*adt+sqrt13*d_as_work(ind+j)*d_time
1404 dc(j,inres)=dc_old(j,inres)+(d_t_old(j,inres)+adt2)*d_time
1405 d_t_new(j,inres)=d_t_old(j,inres)+0.5d0*adt
1406 d_t(j,inres)=d_t_old(j,inres)+adt
1413 c---------------------------------------------------------------------
1414 subroutine sddir_verlet2
1415 c Calculating the adjusted velocities for accelerations
1416 implicit real*8 (a-h,o-z)
1417 include 'DIMENSIONS'
1418 include 'COMMON.CONTROL'
1419 include 'COMMON.VAR'
1422 include 'COMMON.LANGEVIN'
1424 include 'COMMON.LANGEVIN.lang0'
1426 include 'COMMON.CHAIN'
1427 include 'COMMON.DERIV'
1428 include 'COMMON.GEO'
1429 include 'COMMON.LOCAL'
1430 include 'COMMON.INTERACT'
1431 include 'COMMON.IOUNITS'
1432 include 'COMMON.NAMES'
1433 double precision stochforcvec(MAXRES6),d_as_work1(MAXRES6)
1434 double precision cos60 /0.5d0/, sin60 /0.86602540378443864676d0/
1435 c Revised 3/31/05 AL: correlation between random contributions to
1436 c position and velocity increments included.
1437 c The correlation coefficients are calculated at low-friction limit.
1438 c Also, friction forces are now not calculated with new velocities.
1440 c call friction_force
1441 call stochastic_force(stochforcvec)
1443 c Compute the acceleration due to friction forces (d_af_work) and stochastic
1444 c forces (d_as_work)
1446 call ginv_mult(stochforcvec, d_as_work1)
1452 d_t(j,0)=d_t_new(j,0)+(0.5d0*(d_a(j,0)+d_af_work(j))
1453 & +sin60*d_as_work(j)+cos60*d_as_work1(j))*d_time
1458 d_t(j,i)=d_t_new(j,i)+(0.5d0*(d_a(j,i)+d_af_work(ind+j))
1459 & +sin60*d_as_work(ind+j)+cos60*d_as_work1(ind+j))*d_time
1464 if (itype(i).ne.10) then
1467 d_t(j,inres)=d_t_new(j,inres)+(0.5d0*(d_a(j,inres)
1468 & +d_af_work(ind+j))+sin60*d_as_work(ind+j)
1469 & +cos60*d_as_work1(ind+j))*d_time
1476 c---------------------------------------------------------------------
1477 subroutine max_accel
1479 c Find the maximum difference in the accelerations of the the sites
1480 c at the beginning and the end of the time step.
1482 implicit real*8 (a-h,o-z)
1483 include 'DIMENSIONS'
1484 include 'COMMON.CONTROL'
1485 include 'COMMON.VAR'
1487 include 'COMMON.CHAIN'
1488 include 'COMMON.DERIV'
1489 include 'COMMON.GEO'
1490 include 'COMMON.LOCAL'
1491 include 'COMMON.INTERACT'
1492 include 'COMMON.IOUNITS'
1493 double precision aux(3),accel(3),accel_old(3),dacc
1495 c aux(j)=d_a(j,0)-d_a_old(j,0)
1496 accel_old(j)=d_a_old(j,0)
1503 c 7/3/08 changed to asymmetric difference
1505 c accel(j)=aux(j)+0.5d0*(d_a(j,i)-d_a_old(j,i))
1506 accel_old(j)=accel_old(j)+0.5d0*d_a_old(j,i)
1507 accel(j)=accel(j)+0.5d0*d_a(j,i)
1508 c if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
1509 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
1510 dacc=dabs(accel(j)-accel_old(j))
1511 if (dacc.gt.amax) amax=dacc
1519 accel_old(j)=d_a_old(j,0)
1524 accel_old(j)=accel_old(j)+d_a_old(j,1)
1525 accel(j)=accel(j)+d_a(j,1)
1529 if (itype(i).ne.10) then
1531 c accel(j)=accel(j)+d_a(j,i+nres)-d_a_old(j,i+nres)
1532 accel_old(j)=accel_old(j)+d_a_old(j,i+nres)
1533 accel(j)=accel(j)+d_a(j,i+nres)
1537 c if (dabs(accel(j)).gt.amax) amax=dabs(accel(j))
1538 if (dabs(accel(j)).gt.dabs(accel_old(j))) then
1539 dacc=dabs(accel(j)-accel_old(j))
1540 if (dacc.gt.amax) amax=dacc
1544 accel_old(j)=accel_old(j)+d_a_old(j,i)
1545 accel(j)=accel(j)+d_a(j,i)
1546 c aux(j)=aux(j)+d_a(j,i)-d_a_old(j,i)
1551 c---------------------------------------------------------------------
1552 subroutine predict_edrift(epdrift)
1554 c Predict the drift of the potential energy
1556 implicit real*8 (a-h,o-z)
1557 include 'DIMENSIONS'
1558 include 'COMMON.CONTROL'
1559 include 'COMMON.VAR'
1561 include 'COMMON.CHAIN'
1562 include 'COMMON.DERIV'
1563 include 'COMMON.GEO'
1564 include 'COMMON.LOCAL'
1565 include 'COMMON.INTERACT'
1566 include 'COMMON.IOUNITS'
1567 include 'COMMON.MUCA'
1568 double precision epdrift,epdriftij
1569 c Drift of the potential energy
1575 epdriftij=dabs((d_a(j,i)-d_a_old(j,i))*gcart(j,i))
1576 if (lmuca) epdriftij=epdriftij*factor
1577 c write (iout,*) "back",i,j,epdriftij
1578 if (epdriftij.gt.epdrift) epdrift=epdriftij
1582 if (itype(i).ne.10) then
1585 & dabs((d_a(j,i+nres)-d_a_old(j,i+nres))*gxcart(j,i))
1586 if (lmuca) epdriftij=epdriftij*factor
1587 c write (iout,*) "side",i,j,epdriftij
1588 if (epdriftij.gt.epdrift) epdrift=epdriftij
1592 epdrift=0.5d0*epdrift*d_time*d_time
1593 c write (iout,*) "epdrift",epdrift
1596 c-----------------------------------------------------------------------
1597 subroutine verlet_bath
1599 c Coupling to the thermostat by using the Berendsen algorithm
1601 implicit real*8 (a-h,o-z)
1602 include 'DIMENSIONS'
1603 include 'COMMON.CONTROL'
1604 include 'COMMON.VAR'
1606 include 'COMMON.CHAIN'
1607 include 'COMMON.DERIV'
1608 include 'COMMON.GEO'
1609 include 'COMMON.LOCAL'
1610 include 'COMMON.INTERACT'
1611 include 'COMMON.IOUNITS'
1612 include 'COMMON.NAMES'
1613 double precision T_half,fact
1615 T_half=2.0d0/(dimen3*Rb)*EK
1616 fact=dsqrt(1.0d0+(d_time/tau_bath)*(t_bath/T_half-1.0d0))
1617 c write(iout,*) "T_half", T_half
1618 c write(iout,*) "EK", EK
1619 c write(iout,*) "fact", fact
1621 d_t(j,0)=fact*d_t(j,0)
1625 d_t(j,i)=fact*d_t(j,i)
1629 if (itype(i).ne.10) then
1632 d_t(j,inres)=fact*d_t(j,inres)
1638 c---------------------------------------------------------
1640 c Set up the initial conditions of a MD simulation
1641 implicit real*8 (a-h,o-z)
1642 include 'DIMENSIONS'
1646 integer IERROR,ERRCODE
1648 include 'COMMON.SETUP'
1649 include 'COMMON.CONTROL'
1650 include 'COMMON.VAR'
1653 include 'COMMON.LANGEVIN'
1655 include 'COMMON.LANGEVIN.lang0'
1657 include 'COMMON.CHAIN'
1658 include 'COMMON.DERIV'
1659 include 'COMMON.GEO'
1660 include 'COMMON.LOCAL'
1661 include 'COMMON.INTERACT'
1662 include 'COMMON.IOUNITS'
1663 include 'COMMON.NAMES'
1664 include 'COMMON.REMD'
1665 real*8 energia_long(0:n_ene),
1666 & energia_short(0:n_ene),vcm(3),incr(3),E_short
1667 double precision cm(3),L(3),xv,sigv,lowb,highb
1668 double precision varia(maxvar)
1676 c write(iout,*) "d_time", d_time
1677 c Compute the standard deviations of stochastic forces for Langevin dynamics
1678 c if the friction coefficients do not depend on surface area
1679 if (lang.gt.0 .and. .not.surfarea) then
1681 stdforcp(i)=stdfp*dsqrt(gamp)
1684 stdforcsc(i)=stdfsc(itype(i))*dsqrt(gamsc(itype(i)))
1687 c Open the pdb file for snapshotshots
1690 if (ilen(tmpdir).gt.0)
1691 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1692 & liczba(:ilen(liczba))//".pdb")
1694 & file=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1698 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file))
1699 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1700 & liczba(:ilen(liczba))//".x")
1701 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1704 if (ilen(tmpdir).gt.0 .and. (me.eq.king .or. .not.traj1file))
1705 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD"//
1706 & liczba(:ilen(liczba))//".cx")
1707 cartname=prefix(:ilen(prefix))//"_MD"//liczba(:ilen(liczba))
1713 if (ilen(tmpdir).gt.0)
1714 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.pdb")
1715 open(ipdb,file=prefix(:ilen(prefix))//"_MD.pdb")
1717 if (ilen(tmpdir).gt.0)
1718 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//"_MD.cx")
1719 cartname=prefix(:ilen(prefix))//"_MD.cx"
1723 write (qstr,'(256(1h ))')
1726 iq = qinfrag(i,iset)*10
1727 iw = wfrag(i,iset)/100
1729 if(me.eq.king.or..not.out1file)
1730 & write (iout,*) "Frag",qinfrag(i,iset),wfrag(i,iset),iq,iw
1731 write (qstr(ipos:ipos+6),'(2h_f,i1,1h_,i1,1h_,i1)') i,iq,iw
1736 iq = qinpair(i,iset)*10
1737 iw = wpair(i,iset)/100
1739 if(me.eq.king.or..not.out1file)
1740 & write (iout,*) "Pair",i,qinpair(i,iset),wpair(i,iset),iq,iw
1741 write (qstr(ipos:ipos+6),'(2h_p,i1,1h_,i1,1h_,i1)') i,iq,iw
1745 c pdbname=pdbname(:ilen(pdbname)-4)//qstr(:ipos-1)//'.pdb'
1747 c cartname=cartname(:ilen(cartname)-2)//qstr(:ipos-1)//'.x'
1749 c cartname=cartname(:ilen(cartname)-3)//qstr(:ipos-1)//'.cx'
1751 c statname=statname(:ilen(statname)-5)//qstr(:ipos-1)//'.stat'
1755 if (restart1file) then
1757 & inquire(file=mremd_rst_name,exist=file_exist)
1758 write (*,*) me," Before broadcast: file_exist",file_exist
1760 call MPI_Bcast(file_exist,1,MPI_LOGICAL,king,CG_COMM,
1762 write (*,*) me," After broadcast: file_exist",file_exist
1764 c inquire(file=mremd_rst_name,exist=file_exist)
1765 if(me.eq.king.or..not.out1file)
1766 & write(iout,*) "Initial state read by master and distributed"
1768 if (ilen(tmpdir).gt.0)
1769 & call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'
1770 & //liczba(:ilen(liczba))//'.rst')
1771 inquire(file=rest2name,exist=file_exist)
1774 if(.not.restart1file) then
1775 if(me.eq.king.or..not.out1file)
1776 & write(iout,*) "Initial state will be read from file ",
1777 & rest2name(:ilen(rest2name))
1780 call rescale_weights(t_bath)
1782 if(me.eq.king.or..not.out1file)then
1783 if (restart1file) then
1784 write(iout,*) "File ",mremd_rst_name(:ilen(mremd_rst_name)),
1787 write(iout,*) "File ",rest2name(:ilen(rest2name)),
1790 write(iout,*) "Initial velocities randomly generated"
1796 c Generate initial velocities
1797 if(me.eq.king.or..not.out1file)
1798 & write(iout,*) "Initial velocities randomly generated"
1802 c rest2name = prefix(:ilen(prefix))//'.rst'
1803 if(me.eq.king.or..not.out1file)then
1804 write (iout,*) "Initial velocities"
1806 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1807 & (d_t(j,i+nres),j=1,3)
1810 c Zeroing the total angular momentum of the system
1811 write(iout,*) "Calling the zero-angular
1812 & momentum subroutine"
1815 c Getting the potential energy and forces and velocities and accelerations
1817 c write (iout,*) "velocity of the center of the mass:"
1818 c write (iout,*) (vcm(j),j=1,3)
1820 d_t(j,0)=d_t(j,0)-vcm(j)
1822 c Removing the velocity of the center of mass
1824 if(me.eq.king.or..not.out1file)then
1825 write (iout,*) "vcm right after adjustment:"
1826 write (iout,*) (vcm(j),j=1,3)
1830 if (start_from_model) then
1831 i_model=iran_num(1,constr_homology)
1832 write (iout,*) 'starting from model ',i_model
1835 c(j,i)=chomo(j,i,i_model)
1839 call int_from_cart(.true.,.false.)
1840 call sc_loc_geom(.false.)
1843 dc(j,i)=c(j,i+1)-c(j,i)
1844 dc_norm(j,i)=dc(j,i)*vbld_inv(i+1)
1849 dc(j,i+nres)=c(j,i+nres)-c(j,i)
1850 dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres)
1855 write (iout,*) "PREMINIM ",preminim
1856 if(iranconf.ne.0 .or. preminim) then
1858 print *, 'Calling OVERLAP_SC'
1859 call overlap_sc(fail)
1863 call sc_move(2,nres-1,10,1d10,nft_sc,etot)
1864 print *,'SC_move',nft_sc,etot
1865 if(me.eq.king.or..not.out1file)
1866 & write(iout,*) 'SC_move',nft_sc,etot
1870 print *, 'Calling MINIM_DC'
1871 call minim_dc(etot,iretcode,nfun)
1873 call geom_to_var(nvar,varia)
1874 print *,'Calling MINIMIZE.'
1875 call minimize(etot,varia,iretcode,nfun)
1876 call var_to_geom(nvar,varia)
1878 if(me.eq.king.or..not.out1file) then
1879 write(iout,*) "Minimized energy is",etot
1880 write(iout,*) 'SUMSL return code is',iretcode,' eval ',nfun
1881 call etotal(potEcomp)
1882 call enerprint(potEcomp)
1886 call chainbuild_cart
1891 kinetic_T=2.0d0/(dimen3*Rb)*EK
1892 if(me.eq.king.or..not.out1file)then
1902 call etotal(potEcomp)
1905 t_etotal=t_etotal+MPI_Wtime()-tt0
1907 t_etotal=t_etotal+tcpu()-tt0
1912 if(tnp .or. tnp1) then
1915 HNose1=Hnose(EK,s_np,potE,pi_np,Q_np,t_bath,dimen3)
1917 write(iout,*) 'H0= ',H0
1921 HNose1=Hnose_nh(EK,potE)
1923 write (iout,*) 'H0= ',H0
1929 if(me.eq.king.or..not.out1file)
1930 & write(iout,*) 'HMC',hmc_etot,potE,EK
1941 if (.not.RESPA .and. amax*d_time .gt. dvmax) then
1942 d_time=d_time*dvmax/amax
1943 if(me.eq.king.or..not.out1file) write (iout,*)
1944 & "Time step reduced to",d_time,
1945 & " because of too large initial acceleration."
1947 if(me.eq.king.or..not.out1file)then
1948 write(iout,*) "Potential energy and its components"
1949 call enerprint(potEcomp)
1950 c write(iout,*) (potEcomp(i),i=0,n_ene)
1952 potE=potEcomp(0)-potEcomp(20)
1955 if (ntwe.ne.0) call statout(itime)
1956 if(me.eq.king.or..not.out1file)
1957 & write (iout,'(/a/3(a25,1pe14.5/))') "Initial:",
1958 & " Kinetic energy",EK," potential energy",potE,
1959 & " total energy",totE," maximum acceleration ",
1962 write (iout,*) "Initial coordinates"
1964 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(c(j,i),j=1,3),
1965 & (c(j,i+nres),j=1,3)
1967 write (iout,*) "Initial dC"
1969 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(dc(j,i),j=1,3),
1970 & (dc(j,i+nres),j=1,3)
1972 write (iout,*) "Initial velocities"
1973 write (iout,"(13x,' backbone ',23x,' side chain')")
1975 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_t(j,i),j=1,3),
1976 & (d_t(j,i+nres),j=1,3)
1978 write (iout,*) "Initial accelerations"
1980 c write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
1981 write (iout,'(i3,3f15.10,3x,3f15.10)') i,(d_a(j,i),j=1,3),
1982 & (d_a(j,i+nres),j=1,3)
1988 d_t_old(j,i)=d_t(j,i)
1989 d_a_old(j,i)=d_a(j,i)
1991 c write (iout,*) "dc_old",i,(dc_old(j,i),j=1,3)
2000 call etotal_short(energia_short)
2003 t_eshort=t_eshort+MPI_Wtime()-tt0
2005 t_eshort=t_eshort+tcpu()-tt0
2009 if(tnp .or. tnp1) then
2010 E_short=energia_short(0)
2011 HNose1=Hnose(EK,s_np,E_short,pi_np,Q_np,t_bath,dimen3)
2014 c_new_var_csplit Csplit=H0-E_long
2015 c Csplit = H0-energia_short(0)
2016 write(iout,*) 'Csplit= ',Csplit
2022 if(.not.out1file .and. large) then
2023 write (iout,*) "energia_long",energia_long(0),
2024 & " energia_short",energia_short(0),
2025 & " total",energia_long(0)+energia_short(0)
2026 write (iout,*) "Initial fast-force accelerations"
2028 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
2029 & (d_a(j,i+nres),j=1,3)
2032 C 7/2/2009 Copy accelerations due to short-lange forces to an auxiliary array
2035 d_a_short(j,i)=d_a(j,i)
2044 call etotal_long(energia_long)
2047 t_elong=t_elong+MPI_Wtime()-tt0
2049 t_elong=t_elong+tcpu()-tt0
2054 if(.not.out1file .and. large) then
2055 write (iout,*) "energia_long",energia_long(0)
2056 write (iout,*) "Initial slow-force accelerations"
2058 write (iout,'(i3,3f10.5,3x,3f10.5)') i,(d_a(j,i),j=1,3),
2059 & (d_a(j,i+nres),j=1,3)
2063 t_enegrad=t_enegrad+MPI_Wtime()-tt0
2065 t_enegrad=t_enegrad+tcpu()-tt0
2073 c-----------------------------------------------------------
2074 subroutine random_vel
2075 implicit real*8 (a-h,o-z)
2076 include 'DIMENSIONS'
2077 include 'COMMON.CONTROL'
2078 include 'COMMON.VAR'
2081 include 'COMMON.LANGEVIN'
2083 include 'COMMON.LANGEVIN.lang0'
2085 include 'COMMON.CHAIN'
2086 include 'COMMON.DERIV'
2087 include 'COMMON.GEO'
2088 include 'COMMON.LOCAL'
2089 include 'COMMON.INTERACT'
2090 include 'COMMON.IOUNITS'
2091 include 'COMMON.NAMES'
2092 include 'COMMON.TIME1'
2093 double precision xv,sigv,lowb,highb
2094 c Generate random velocities from Gaussian distribution of mean 0 and std of KT/m
2095 c First generate velocities in the eigenspace of the G matrix
2096 c write (iout,*) "Calling random_vel dimen dimen3",dimen,dimen3
2098 c write (iout,*) "RANDOM_VEL dimen",dimen
2104 sigv=dsqrt((Rb*t_bath)/geigen(i))
2107 d_t_work_new(ii)=anorm_distr(xv,sigv,lowb,highb)
2108 c write (iout,*) "i",i," ii",ii," geigen",geigen(i),
2109 c & " d_t_work_new",d_t_work_new(ii)
2119 c Ek1=Ek1+0.5d0*geigen(i)*d_t_work_new(ii)**2
2122 c write (iout,*) "Ek from eigenvectors",Ek1
2124 c Transform velocities to UNRES coordinate space
2130 d_t_work(ind)=d_t_work(ind)
2131 & +Gvec(i,j)*d_t_work_new((j-1)*3+k+1)
2133 c write (iout,*) "i",i," ind",ind," d_t_work",d_t_work(ind)
2137 c Transfer to the d_t vector
2139 d_t(j,0)=d_t_work(j)
2145 d_t(j,i)=d_t_work(ind)
2149 c write (iout,*) "d_t",i,(d_t(j,i),j=1,3)
2153 if (itype(i).ne.10) then
2156 d_t(j,i+nres)=d_t_work(ind)
2161 c write (iout,*) "Kinetic energy",Ek,EK1," kinetic temperature",
2162 c & 2.0d0/(dimen3*Rb)*EK,2.0d0/(dimen3*Rb)*EK1
2167 c-----------------------------------------------------------
2168 subroutine sd_verlet_p_setup
2169 c Sets up the parameters of stochastic Verlet algorithm
2170 implicit real*8 (a-h,o-z)
2171 include 'DIMENSIONS'
2175 include 'COMMON.CONTROL'
2176 include 'COMMON.VAR'
2179 include 'COMMON.LANGEVIN'
2181 include 'COMMON.LANGEVIN.lang0'
2183 include 'COMMON.CHAIN'
2184 include 'COMMON.DERIV'
2185 include 'COMMON.GEO'
2186 include 'COMMON.LOCAL'
2187 include 'COMMON.INTERACT'
2188 include 'COMMON.IOUNITS'
2189 include 'COMMON.NAMES'
2190 include 'COMMON.TIME1'
2191 double precision emgdt(MAXRES6),
2192 & pterm,vterm,rho,rhoc,vsig,
2193 & pfric_vec(MAXRES6),vfric_vec(MAXRES6),
2194 & afric_vec(MAXRES6),prand_vec(MAXRES6),
2195 & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6)
2196 logical lprn /.false./
2197 double precision zero /1.0d-8/, gdt_radius /0.05d0/
2198 double precision ktm
2205 c AL 8/17/04 Code adapted from tinker
2207 c Get the frictional and random terms for stochastic dynamics in the
2208 c eigenspace of mass-scaled UNRES friction matrix
2211 gdt = fricgam(i) * d_time
2213 c Stochastic dynamics reduces to simple MD for zero friction
2215 if (gdt .le. zero) then
2216 pfric_vec(i) = 1.0d0
2217 vfric_vec(i) = d_time
2218 afric_vec(i) = 0.5d0 * d_time * d_time
2219 prand_vec(i) = 0.0d0
2220 vrand_vec1(i) = 0.0d0
2221 vrand_vec2(i) = 0.0d0
2223 c Analytical expressions when friction coefficient is large
2226 if (gdt .ge. gdt_radius) then
2229 vfric_vec(i) = (1.0d0-egdt) / fricgam(i)
2230 afric_vec(i) = (d_time-vfric_vec(i)) / fricgam(i)
2231 pterm = 2.0d0*gdt - 3.0d0 + (4.0d0-egdt)*egdt
2232 vterm = 1.0d0 - egdt**2
2233 rho = (1.0d0-egdt)**2 / sqrt(pterm*vterm)
2235 c Use series expansions when friction coefficient is small
2246 afric_vec(i) = (gdt2/2.0d0 - gdt3/6.0d0 + gdt4/24.0d0
2247 & - gdt5/120.0d0 + gdt6/720.0d0
2248 & - gdt7/5040.0d0 + gdt8/40320.0d0
2249 & - gdt9/362880.0d0) / fricgam(i)**2
2250 vfric_vec(i) = d_time - fricgam(i)*afric_vec(i)
2251 pfric_vec(i) = 1.0d0 - fricgam(i)*vfric_vec(i)
2252 pterm = 2.0d0*gdt3/3.0d0 - gdt4/2.0d0
2253 & + 7.0d0*gdt5/30.0d0 - gdt6/12.0d0
2254 & + 31.0d0*gdt7/1260.0d0 - gdt8/160.0d0
2255 & + 127.0d0*gdt9/90720.0d0
2256 vterm = 2.0d0*gdt - 2.0d0*gdt2 + 4.0d0*gdt3/3.0d0
2257 & - 2.0d0*gdt4/3.0d0 + 4.0d0*gdt5/15.0d0
2258 & - 4.0d0*gdt6/45.0d0 + 8.0d0*gdt7/315.0d0
2259 & - 2.0d0*gdt8/315.0d0 + 4.0d0*gdt9/2835.0d0
2260 rho = sqrt(3.0d0) * (0.5d0 - 3.0d0*gdt/16.0d0
2261 & - 17.0d0*gdt2/1280.0d0
2262 & + 17.0d0*gdt3/6144.0d0
2263 & + 40967.0d0*gdt4/34406400.0d0
2264 & - 57203.0d0*gdt5/275251200.0d0
2265 & - 1429487.0d0*gdt6/13212057600.0d0)
2268 c Compute the scaling factors of random terms for the nonzero friction case
2270 ktm = 0.5d0*d_time/fricgam(i)
2271 psig = dsqrt(ktm*pterm) / fricgam(i)
2272 vsig = dsqrt(ktm*vterm)
2273 rhoc = dsqrt(1.0d0 - rho*rho)
2275 vrand_vec1(i) = vsig * rho
2276 vrand_vec2(i) = vsig * rhoc
2281 & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",
2284 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),
2285 & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
2289 c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
2292 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
2293 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
2294 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
2295 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
2296 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec1,vrand_mat1)
2297 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
2300 t_sdsetup=t_sdsetup+MPI_Wtime()
2302 t_sdsetup=t_sdsetup+tcpu()-tt0
2306 c-------------------------------------------------------------
2307 subroutine eigtransf1(n,ndim,ab,d,c)
2310 double precision ab(ndim,ndim,n),c(ndim,n),d(ndim)
2316 c(i,j)=c(i,j)+ab(k,j,i)*d(k)
2322 c-------------------------------------------------------------
2323 subroutine eigtransf(n,ndim,a,b,d,c)
2326 double precision a(ndim,n),b(ndim,n),c(ndim,n),d(ndim)
2332 c(i,j)=c(i,j)+a(i,k)*b(k,j)*d(k)
2338 c-------------------------------------------------------------
2339 subroutine sd_verlet1
2340 c Applying stochastic velocity Verlet algorithm - step 1 to velocities
2341 implicit real*8 (a-h,o-z)
2342 include 'DIMENSIONS'
2343 include 'COMMON.CONTROL'
2344 include 'COMMON.VAR'
2347 include 'COMMON.LANGEVIN'
2349 include 'COMMON.LANGEVIN.lang0'
2351 include 'COMMON.CHAIN'
2352 include 'COMMON.DERIV'
2353 include 'COMMON.GEO'
2354 include 'COMMON.LOCAL'
2355 include 'COMMON.INTERACT'
2356 include 'COMMON.IOUNITS'
2357 include 'COMMON.NAMES'
2358 double precision stochforcvec(MAXRES6)
2359 common /stochcalc/ stochforcvec
2360 logical lprn /.false./
2362 c write (iout,*) "dc_old"
2364 c write (iout,'(i5,3f10.5,5x,3f10.5)')
2365 c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
2368 dc_work(j)=dc_old(j,0)
2369 d_t_work(j)=d_t_old(j,0)
2370 d_a_work(j)=d_a_old(j,0)
2375 dc_work(ind+j)=dc_old(j,i)
2376 d_t_work(ind+j)=d_t_old(j,i)
2377 d_a_work(ind+j)=d_a_old(j,i)
2382 if (itype(i).ne.10) then
2384 dc_work(ind+j)=dc_old(j,i+nres)
2385 d_t_work(ind+j)=d_t_old(j,i+nres)
2386 d_a_work(ind+j)=d_a_old(j,i+nres)
2394 & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",
2398 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),
2399 & vfric_mat(i,j),afric_mat(i,j),
2400 & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
2408 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j)
2409 & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
2410 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
2411 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
2413 d_t_work_new(i)=ddt1+0.5d0*ddt2
2414 d_t_work(i)=ddt1+ddt2
2419 d_t(j,0)=d_t_work(j)
2424 dc(j,i)=dc_work(ind+j)
2425 d_t(j,i)=d_t_work(ind+j)
2430 if (itype(i).ne.10) then
2433 dc(j,inres)=dc_work(ind+j)
2434 d_t(j,inres)=d_t_work(ind+j)
2441 c--------------------------------------------------------------------------
2442 subroutine sd_verlet2
2443 c Calculating the adjusted velocities for accelerations
2444 implicit real*8 (a-h,o-z)
2445 include 'DIMENSIONS'
2446 include 'COMMON.CONTROL'
2447 include 'COMMON.VAR'
2450 include 'COMMON.LANGEVIN'
2452 include 'COMMON.LANGEVIN.lang0'
2454 include 'COMMON.CHAIN'
2455 include 'COMMON.DERIV'
2456 include 'COMMON.GEO'
2457 include 'COMMON.LOCAL'
2458 include 'COMMON.INTERACT'
2459 include 'COMMON.IOUNITS'
2460 include 'COMMON.NAMES'
2461 double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6)
2462 common /stochcalc/ stochforcvec
2464 c Compute the stochastic forces which contribute to velocity change
2466 call stochastic_force(stochforcvecV)
2473 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
2474 ddt2=ddt2+vrand_mat1(i,j)*stochforcvec(j)+
2475 & vrand_mat2(i,j)*stochforcvecV(j)
2477 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
2481 d_t(j,0)=d_t_work(j)
2486 d_t(j,i)=d_t_work(ind+j)
2491 if (itype(i).ne.10) then
2494 d_t(j,inres)=d_t_work(ind+j)
2501 c-----------------------------------------------------------
2502 subroutine sd_verlet_ciccotti_setup
2503 c Sets up the parameters of stochastic velocity Verlet algorithmi; Ciccotti's
2505 implicit real*8 (a-h,o-z)
2506 include 'DIMENSIONS'
2510 include 'COMMON.CONTROL'
2511 include 'COMMON.VAR'
2514 include 'COMMON.LANGEVIN'
2516 include 'COMMON.LANGEVIN.lang0'
2518 include 'COMMON.CHAIN'
2519 include 'COMMON.DERIV'
2520 include 'COMMON.GEO'
2521 include 'COMMON.LOCAL'
2522 include 'COMMON.INTERACT'
2523 include 'COMMON.IOUNITS'
2524 include 'COMMON.NAMES'
2525 include 'COMMON.TIME1'
2526 double precision emgdt(MAXRES6),
2527 & pterm,vterm,rho,rhoc,vsig,
2528 & pfric_vec(MAXRES6),vfric_vec(MAXRES6),
2529 & afric_vec(MAXRES6),prand_vec(MAXRES6),
2530 & vrand_vec1(MAXRES6),vrand_vec2(MAXRES6)
2531 logical lprn /.false./
2532 double precision zero /1.0d-8/, gdt_radius /0.05d0/
2533 double precision ktm
2540 c AL 8/17/04 Code adapted from tinker
2542 c Get the frictional and random terms for stochastic dynamics in the
2543 c eigenspace of mass-scaled UNRES friction matrix
2546 write (iout,*) "i",i," fricgam",fricgam(i)
2547 gdt = fricgam(i) * d_time
2549 c Stochastic dynamics reduces to simple MD for zero friction
2551 if (gdt .le. zero) then
2552 pfric_vec(i) = 1.0d0
2553 vfric_vec(i) = d_time
2554 afric_vec(i) = 0.5d0*d_time*d_time
2555 prand_vec(i) = afric_vec(i)
2556 vrand_vec2(i) = vfric_vec(i)
2558 c Analytical expressions when friction coefficient is large
2563 vfric_vec(i) = dexp(-0.5d0*gdt)*d_time
2564 afric_vec(i) = 0.5d0*dexp(-0.25d0*gdt)*d_time*d_time
2565 prand_vec(i) = afric_vec(i)
2566 vrand_vec2(i) = vfric_vec(i)
2568 c Compute the scaling factors of random terms for the nonzero friction case
2570 c ktm = 0.5d0*d_time/fricgam(i)
2571 c psig = dsqrt(ktm*pterm) / fricgam(i)
2572 c vsig = dsqrt(ktm*vterm)
2573 c prand_vec(i) = psig*afric_vec(i)
2574 c vrand_vec2(i) = vsig*vfric_vec(i)
2579 & "pfric_vec, vfric_vec, afric_vec, prand_vec, vrand_vec1,",
2582 write (iout,'(i5,6e15.5)') i,pfric_vec(i),vfric_vec(i),
2583 & afric_vec(i),prand_vec(i),vrand_vec1(i),vrand_vec2(i)
2587 c Transform from the eigenspace of mass-scaled friction matrix to UNRES variables
2589 call eigtransf(dimen,maxres2,mt3,mt2,pfric_vec,pfric_mat)
2590 call eigtransf(dimen,maxres2,mt3,mt2,vfric_vec,vfric_mat)
2591 call eigtransf(dimen,maxres2,mt3,mt2,afric_vec,afric_mat)
2592 call eigtransf(dimen,maxres2,mt3,mt1,prand_vec,prand_mat)
2593 call eigtransf(dimen,maxres2,mt3,mt1,vrand_vec2,vrand_mat2)
2595 t_sdsetup=t_sdsetup+MPI_Wtime()
2597 t_sdsetup=t_sdsetup+tcpu()-tt0
2601 c-------------------------------------------------------------
2602 subroutine sd_verlet1_ciccotti
2603 c Applying stochastic velocity Verlet algorithm - step 1 to velocities
2604 implicit real*8 (a-h,o-z)
2605 include 'DIMENSIONS'
2609 include 'COMMON.CONTROL'
2610 include 'COMMON.VAR'
2613 include 'COMMON.LANGEVIN'
2615 include 'COMMON.LANGEVIN.lang0'
2617 include 'COMMON.CHAIN'
2618 include 'COMMON.DERIV'
2619 include 'COMMON.GEO'
2620 include 'COMMON.LOCAL'
2621 include 'COMMON.INTERACT'
2622 include 'COMMON.IOUNITS'
2623 include 'COMMON.NAMES'
2624 double precision stochforcvec(MAXRES6)
2625 common /stochcalc/ stochforcvec
2626 logical lprn /.false./
2628 c write (iout,*) "dc_old"
2630 c write (iout,'(i5,3f10.5,5x,3f10.5)')
2631 c & i,(dc_old(j,i),j=1,3),(dc_old(j,i+nres),j=1,3)
2634 dc_work(j)=dc_old(j,0)
2635 d_t_work(j)=d_t_old(j,0)
2636 d_a_work(j)=d_a_old(j,0)
2641 dc_work(ind+j)=dc_old(j,i)
2642 d_t_work(ind+j)=d_t_old(j,i)
2643 d_a_work(ind+j)=d_a_old(j,i)
2648 if (itype(i).ne.10) then
2650 dc_work(ind+j)=dc_old(j,i+nres)
2651 d_t_work(ind+j)=d_t_old(j,i+nres)
2652 d_a_work(ind+j)=d_a_old(j,i+nres)
2661 & "pfric_mat, vfric_mat, afric_mat, prand_mat, vrand_mat1,",
2665 write (iout,'(2i5,6e15.5)') i,j,pfric_mat(i,j),
2666 & vfric_mat(i,j),afric_mat(i,j),
2667 & prand_mat(i,j),vrand_mat1(i,j),vrand_mat2(i,j)
2675 dc_work(i)=dc_work(i)+vfric_mat(i,j)*d_t_work(j)
2676 & +afric_mat(i,j)*d_a_work(j)+prand_mat(i,j)*stochforcvec(j)
2677 ddt1=ddt1+pfric_mat(i,j)*d_t_work(j)
2678 ddt2=ddt2+vfric_mat(i,j)*d_a_work(j)
2680 d_t_work_new(i)=ddt1+0.5d0*ddt2
2681 d_t_work(i)=ddt1+ddt2
2686 d_t(j,0)=d_t_work(j)
2691 dc(j,i)=dc_work(ind+j)
2692 d_t(j,i)=d_t_work(ind+j)
2697 if (itype(i).ne.10) then
2700 dc(j,inres)=dc_work(ind+j)
2701 d_t(j,inres)=d_t_work(ind+j)
2708 c--------------------------------------------------------------------------
2709 subroutine sd_verlet2_ciccotti
2710 c Calculating the adjusted velocities for accelerations
2711 implicit real*8 (a-h,o-z)
2712 include 'DIMENSIONS'
2713 include 'COMMON.CONTROL'
2714 include 'COMMON.VAR'
2717 include 'COMMON.LANGEVIN'
2719 include 'COMMON.LANGEVIN.lang0'
2721 include 'COMMON.CHAIN'
2722 include 'COMMON.DERIV'
2723 include 'COMMON.GEO'
2724 include 'COMMON.LOCAL'
2725 include 'COMMON.INTERACT'
2726 include 'COMMON.IOUNITS'
2727 include 'COMMON.NAMES'
2728 double precision stochforcvec(MAXRES6),stochforcvecV(MAXRES6)
2729 common /stochcalc/ stochforcvec
2731 c Compute the stochastic forces which contribute to velocity change
2733 call stochastic_force(stochforcvecV)
2740 ddt1=ddt1+vfric_mat(i,j)*d_a_work(j)
2741 c ddt2=ddt2+vrand_mat2(i,j)*stochforcvecV(j)
2742 ddt2=ddt2+vrand_mat2(i,j)*stochforcvec(j)
2744 d_t_work(i)=d_t_work_new(i)+0.5d0*ddt1+ddt2
2748 d_t(j,0)=d_t_work(j)
2753 d_t(j,i)=d_t_work(ind+j)
2758 if (itype(i).ne.10) then
2761 d_t(j,inres)=d_t_work(ind+j)
2769 c------------------------------------------------------
2770 double precision function HNose(ek,s,e,pi,Q,t_bath,dimenl)
2772 double precision ek,s,e,pi,Q,t_bath,Rb
2775 HNose=ek+e+pi**2/(2*Q)+dimenl*Rb*t_bath*log(s)
2776 c print '(6f15.5,i5,a2,2f15.5)',ek,s,e,pi,Q,t_bath,dimenl,"--",
2777 c & pi**2/(2*Q),dimenl*Rb*t_bath*log(s)
2780 c-----------------------------------------------------------------
2781 double precision function HNose_nh(eki,e)
2782 implicit real*8 (a-h,o-z)
2783 include 'DIMENSIONS'
2785 HNose_nh=eki+e+dimen3*Rb*t_bath*xlogs(1)+qmass(1)*vlogs(1)**2/2
2787 HNose_nh=HNose_nh+qmass(i)*vlogs(i)**2/2+Rb*t_bath*xlogs(i)
2789 c write(4,'(5e15.5)')
2790 c & vlogs(1),xlogs(1),HNose,eki,e
2793 c-----------------------------------------------------------------
2794 SUBROUTINE NHCINT(akin,scale,wdti,wdti2,wdti4,wdti8)
2795 implicit real*8 (a-h,o-z)
2796 include 'DIMENSIONS'
2798 double precision akin,gnkt,dt,aa,gkt,scale
2799 double precision wdti(maxyosh),wdti2(maxyosh),
2800 & wdti4(maxyosh),wdti8(maxyosh)
2801 integer i,iresn,iyosh,inos,nnos1
2810 C THIS ROUTINE DOES THE NOSE-HOOVER PART OF THE
2811 C INTEGRATION FROM t=0 TO t=DT/2
2812 C GET THE TOTAL KINETIC ENERGY
2814 c CALL GETKINP(MASS,VX,VY,VZ,AKIN)
2816 GLOGS(1) = (AKIN - GNKT)/QMASS(1)
2817 C START THE MULTIPLE TIME STEP PROCEDURE
2820 C UPDATE THE THERMOSTAT VELOCITIES
2821 VLOGS(NNOS) = VLOGS(NNOS) + GLOGS(NNOS)*WDTI4(IYOSH)
2823 AA = EXP(-WDTI8(IYOSH)*VLOGS(NNOS1-INOS) )
2824 VLOGS(NNOS-INOS) = VLOGS(NNOS-INOS)*AA*AA
2825 & + WDTI4(IYOSH)*GLOGS(NNOS-INOS)*AA
2827 C UPDATE THE PARTICLE VELOCITIES
2828 AA = EXP(-WDTI2(IYOSH)*VLOGS(1) )
2831 GLOGS(1) = (SCALE*SCALE*AKIN - GNKT)/QMASS(1)
2832 C UPDATE THE THERMOSTAT POSITIONS
2834 XLOGS(INOS) = XLOGS(INOS) + VLOGS(INOS)*WDTI2(IYOSH)
2836 C UPDATE THE THERMOSTAT VELOCITIES
2838 AA = EXP(-WDTI8(IYOSH)*VLOGS(INOS+1) )
2839 VLOGS(INOS) = VLOGS(INOS)*AA*AA
2840 & + WDTI4(IYOSH)*GLOGS(INOS)*AA
2841 GLOGS(INOS+1) = (QMASS(INOS)*VLOGS(INOS)*VLOGS(INOS)
2842 & -GKT)/QMASS(INOS+1)
2844 VLOGS(NNOS) = VLOGS(NNOS) + GLOGS(NNOS)*WDTI4(IYOSH)
2847 C UPDATE THE PARTICLE VELOCITIES
2848 c outside of this subroutine
2850 c VX(I) = VX(I)*SCALE
2851 c VY(I) = VY(I)*SCALE
2852 c VZ(I) = VZ(I)*SCALE
2856 c-----------------------------------------------------------------
2857 subroutine tnp1_respa_i_step1
2858 c Applying Nose-Poincare algorithm - step 1 to coordinates
2859 c JPSJ 70 75 (2001) S. Nose
2861 c d_t is not updated here
2863 implicit real*8 (a-h,o-z)
2864 include 'DIMENSIONS'
2865 include 'COMMON.CONTROL'
2866 include 'COMMON.VAR'
2868 include 'COMMON.CHAIN'
2869 include 'COMMON.DERIV'
2870 include 'COMMON.GEO'
2871 include 'COMMON.LOCAL'
2872 include 'COMMON.INTERACT'
2873 include 'COMMON.IOUNITS'
2874 include 'COMMON.NAMES'
2875 double precision adt,adt2,tmp
2877 tmp=1+pi_np/(2*Q_np)*0.5*d_time
2880 s12_dt=d_time/s12_np
2881 d_time_s12=d_time*0.5*s12_np
2884 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s12
2885 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*s12_dt
2889 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s12
2890 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*s12_dt
2894 if (itype(i).ne.10) then
2897 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s12
2898 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*s12_dt
2904 c---------------------------------------------------------------------
2905 subroutine tnp1_respa_i_step2
2906 c Step 2 of the velocity Verlet algorithm: update velocities
2907 implicit real*8 (a-h,o-z)
2908 include 'DIMENSIONS'
2909 include 'COMMON.CONTROL'
2910 include 'COMMON.VAR'
2912 include 'COMMON.CHAIN'
2913 include 'COMMON.DERIV'
2914 include 'COMMON.GEO'
2915 include 'COMMON.LOCAL'
2916 include 'COMMON.INTERACT'
2917 include 'COMMON.IOUNITS'
2918 include 'COMMON.NAMES'
2920 double precision d_time_s12
2924 d_t(j,i)=d_t_new(j,i)
2931 d_time_s12=0.5d0*s12_np*d_time
2934 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s12
2938 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s12
2942 if (itype(i).ne.10) then
2945 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s12
2950 pistar=pistar+(EK-0.5*(E_old+potE)
2951 & -dimen3*Rb*t_bath*log(s12_np)+Csplit-dimen3*Rb*t_bath)*d_time
2952 tmp=1+pistar/(2*Q_np)*0.5*d_time
2958 c-------------------------------------------------------
2960 subroutine tnp1_step1
2961 c Applying Nose-Poincare algorithm - step 1 to coordinates
2962 c JPSJ 70 75 (2001) S. Nose
2964 c d_t is not updated here
2966 implicit real*8 (a-h,o-z)
2967 include 'DIMENSIONS'
2968 include 'COMMON.CONTROL'
2969 include 'COMMON.VAR'
2971 include 'COMMON.CHAIN'
2972 include 'COMMON.DERIV'
2973 include 'COMMON.GEO'
2974 include 'COMMON.LOCAL'
2975 include 'COMMON.INTERACT'
2976 include 'COMMON.IOUNITS'
2977 include 'COMMON.NAMES'
2978 double precision adt,adt2,tmp
2980 tmp=1+pi_np/(2*Q_np)*0.5*d_time
2983 s12_dt=d_time/s12_np
2984 d_time_s12=d_time*0.5*s12_np
2987 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s12
2988 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*s12_dt
2992 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s12
2993 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*s12_dt
2997 if (itype(i).ne.10) then
3000 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s12
3001 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*s12_dt
3007 c---------------------------------------------------------------------
3008 subroutine tnp1_step2
3009 c Step 2 of the velocity Verlet algorithm: update velocities
3010 implicit real*8 (a-h,o-z)
3011 include 'DIMENSIONS'
3012 include 'COMMON.CONTROL'
3013 include 'COMMON.VAR'
3015 include 'COMMON.CHAIN'
3016 include 'COMMON.DERIV'
3017 include 'COMMON.GEO'
3018 include 'COMMON.LOCAL'
3019 include 'COMMON.INTERACT'
3020 include 'COMMON.IOUNITS'
3021 include 'COMMON.NAMES'
3023 double precision d_time_s12
3027 d_t(j,i)=d_t_new(j,i)
3034 d_time_s12=0.5d0*s12_np*d_time
3037 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s12
3041 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s12
3045 if (itype(i).ne.10) then
3048 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s12
3053 cd write(iout,*) 'pistar',pistar,EK,E_old,potE,s12_np
3054 pistar=pistar+(EK-0.5*(E_old+potE)
3055 & -dimen3*Rb*t_bath*log(s12_np)+H0-dimen3*Rb*t_bath)*d_time
3056 tmp=1+pistar/(2*Q_np)*0.5*d_time
3063 c-----------------------------------------------------------------
3064 subroutine tnp_respa_i_step1
3065 c Applying Nose-Poincare algorithm - step 1 to coordinates
3066 c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird
3068 c d_t is not updated here, it is destroyed
3070 implicit real*8 (a-h,o-z)
3071 include 'DIMENSIONS'
3072 include 'COMMON.CONTROL'
3073 include 'COMMON.VAR'
3075 include 'COMMON.CHAIN'
3076 include 'COMMON.DERIV'
3077 include 'COMMON.GEO'
3078 include 'COMMON.LOCAL'
3079 include 'COMMON.INTERACT'
3080 include 'COMMON.IOUNITS'
3081 include 'COMMON.NAMES'
3082 double precision C_np,d_time_s,tmp,d_time_ss
3084 d_time_s=d_time*0.5*s_np
3085 ct2 d_time_s=d_time*0.5*s12_np
3088 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s
3092 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s
3096 if (itype(i).ne.10) then
3099 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s
3106 d_t(j,i)=d_t_new(j,i)
3113 C_np=0.5*d_time*(dimen3*Rb*t_bath*(1.0+log(s_np))-EK+potE-Csplit)
3116 pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np))
3117 tmp=0.5*d_time*pistar/Q_np
3118 s12_np=s_np*(1.0+tmp)/(1.0-tmp)
3120 d_time_ss=0.5*d_time*(1.0/s12_np+1.0/s_np)
3121 ct2 d_time_ss=d_time/s12_np
3122 c d_time_ss=0.5*d_time*(1.0/sold_np+1.0/s_np)
3125 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*d_time_ss
3129 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*d_time_ss
3133 if (itype(i).ne.10) then
3136 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*d_time_ss
3143 c---------------------------------------------------------------------
3145 subroutine tnp_respa_i_step2
3146 c Step 2 of the velocity Verlet algorithm: update velocities
3147 implicit real*8 (a-h,o-z)
3148 include 'DIMENSIONS'
3149 include 'COMMON.CONTROL'
3150 include 'COMMON.VAR'
3152 include 'COMMON.CHAIN'
3153 include 'COMMON.DERIV'
3154 include 'COMMON.GEO'
3155 include 'COMMON.LOCAL'
3156 include 'COMMON.INTERACT'
3157 include 'COMMON.IOUNITS'
3158 include 'COMMON.NAMES'
3160 double precision d_time_s
3162 EK=EK*(s_np/s12_np)**2
3163 HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen3)
3164 pi_np=pistar+0.5*d_time*(2*EK-dimen3*Rb*t_bath
3167 cr print '(a,5f)','i_step2',EK,potE,HNose1,pi_np,E_long
3168 d_time_s=d_time*0.5*s12_np
3169 c d_time_s=d_time*0.5*s_np
3172 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s
3176 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s
3180 if (itype(i).ne.10) then
3183 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s
3192 c-----------------------------------------------------------------
3193 subroutine tnp_respa_step1
3194 c Applying Nose-Poincare algorithm - step 1 to vel for RESPA
3195 c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird
3197 c d_t is not updated here, it is destroyed
3199 implicit real*8 (a-h,o-z)
3200 include 'DIMENSIONS'
3201 include 'COMMON.CONTROL'
3202 include 'COMMON.VAR'
3204 include 'COMMON.CHAIN'
3205 include 'COMMON.DERIV'
3206 include 'COMMON.GEO'
3207 include 'COMMON.LOCAL'
3208 include 'COMMON.INTERACT'
3209 include 'COMMON.IOUNITS'
3210 include 'COMMON.NAMES'
3211 double precision C_np,d_time_s,tmp,d_time_ss
3212 double precision energia(0:n_ene)
3214 d_time_s=d_time*0.5*s_np
3217 d_t_old(j,0)=d_t_old(j,0)+d_a(j,0)*d_time_s
3221 d_t_old(j,i)=d_t_old(j,i)+d_a(j,i)*d_time_s
3225 if (itype(i).ne.10) then
3228 d_t_old(j,inres)=d_t_old(j,inres)+d_a(j,inres)*d_time_s
3234 c C_np=0.5*d_time*(dimen3*Rb*t_bath*(1.0+log(s_np))-EK+potE-H0)
3237 c pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np))
3238 c tmp=0.5*d_time*pistar/Q_np
3239 c s12_np=s_np*(1.0+tmp)/(1.0-tmp)
3240 c write(iout,*) 'tnp_respa_step1',s_np,s12_np,EK,potE,C_np,pistar,tmp
3246 c-------------------------------------
3247 c test of reviewer's comment
3248 pi_np=pi_np-0.5*d_time*(E_long+Csplit-H0)
3249 cr print '(a,3f)','1 pi_np,s_np',pi_np,s_np,E_long
3250 c-------------------------------------
3254 c---------------------------------------------------------------------
3255 subroutine tnp_respa_step2
3256 c Step 2 of the velocity Verlet algorithm: update velocities for RESPA
3257 implicit real*8 (a-h,o-z)
3258 include 'DIMENSIONS'
3259 include 'COMMON.CONTROL'
3260 include 'COMMON.VAR'
3262 include 'COMMON.CHAIN'
3263 include 'COMMON.DERIV'
3264 include 'COMMON.GEO'
3265 include 'COMMON.LOCAL'
3266 include 'COMMON.INTERACT'
3267 include 'COMMON.IOUNITS'
3268 include 'COMMON.NAMES'
3270 double precision d_time_s
3276 ct HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen3)
3277 ct pi_np=pistar+0.5*d_time*(2*EK-dimen3*Rb*t_bath)
3278 ct & -0.5*d_time*(HNose1-H0)
3280 c-------------------------------------
3281 c test of reviewer's comment
3282 pi_np=pi_np-0.5*d_time*(E_long+Csplit-H0)
3283 cr print '(a,3f)','2 pi_np,s_np',pi_np,s_np,E_long
3284 c-------------------------------------
3285 d_time_s=d_time*0.5*s_np
3288 d_t_old(j,0)=d_t_old(j,0)+d_a(j,0)*d_time_s
3292 d_t_old(j,i)=d_t_old(j,i)+d_a(j,i)*d_time_s
3296 if (itype(i).ne.10) then
3299 d_t_old(j,inres)=d_t_old(j,inres)+d_a(j,inres)*d_time_s
3308 c---------------------------------------------------------------------
3309 subroutine tnp_step1
3310 c Applying Nose-Poincare algorithm - step 1 to coordinates
3311 c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird
3313 c d_t is not updated here, it is destroyed
3315 implicit real*8 (a-h,o-z)
3316 include 'DIMENSIONS'
3317 include 'COMMON.CONTROL'
3318 include 'COMMON.VAR'
3320 include 'COMMON.CHAIN'
3321 include 'COMMON.DERIV'
3322 include 'COMMON.GEO'
3323 include 'COMMON.LOCAL'
3324 include 'COMMON.INTERACT'
3325 include 'COMMON.IOUNITS'
3326 include 'COMMON.NAMES'
3327 double precision C_np,d_time_s,tmp,d_time_ss
3329 d_time_s=d_time*0.5*s_np
3332 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s
3336 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s
3340 if (itype(i).ne.10) then
3343 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s
3350 d_t(j,i)=d_t_new(j,i)
3357 C_np=0.5*d_time*(dimen3*Rb*t_bath*(1.0+log(s_np))-EK+potE-H0)
3360 pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np))
3361 tmp=0.5*d_time*pistar/Q_np
3362 s12_np=s_np*(1.0+tmp)/(1.0-tmp)
3363 c write(iout,*) 'tnp_step1',s_np,s12_np,EK,potE,C_np,pistar,tmp
3365 d_time_ss=0.5*d_time*(1.0/s12_np+1.0/s_np)
3368 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*d_time_ss
3372 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*d_time_ss
3376 if (itype(i).ne.10) then
3379 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*d_time_ss
3386 c-----------------------------------------------------------------
3387 subroutine tnp_step2
3388 c Step 2 of the velocity Verlet algorithm: update velocities
3389 implicit real*8 (a-h,o-z)
3390 include 'DIMENSIONS'
3391 include 'COMMON.CONTROL'
3392 include 'COMMON.VAR'
3394 include 'COMMON.CHAIN'
3395 include 'COMMON.DERIV'
3396 include 'COMMON.GEO'
3397 include 'COMMON.LOCAL'
3398 include 'COMMON.INTERACT'
3399 include 'COMMON.IOUNITS'
3400 include 'COMMON.NAMES'
3402 double precision d_time_s
3404 EK=EK*(s_np/s12_np)**2
3405 HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen3)
3406 pi_np=pistar+0.5*d_time*(2*EK-dimen3*Rb*t_bath)
3407 & -0.5*d_time*(HNose1-H0)
3409 cd write(iout,'(a,4f)') 'mmm',EK,potE,HNose1,pi_np
3410 d_time_s=d_time*0.5*s12_np
3413 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s
3417 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s
3421 if (itype(i).ne.10) then
3424 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s
3434 subroutine hmc_test(itime)
3435 implicit real*8 (a-h,o-z)
3436 include 'DIMENSIONS'
3437 include 'COMMON.CONTROL'
3439 include 'COMMON.CHAIN'
3442 delta=-(potE+EK-hmc_etot)/(Rb*t_bath)
3443 if (delta .lt. -50.0d0) then
3448 xxx=ran_number(0.0d0,1.0d0)
3450 if (me.eq.king .or. .not. out1file)
3451 & write(iout,'(a8,i5,6f10.4)')
3452 & 'HMC',itime,potE+EK,potE,EK,hmc_etot,delta,xxx
3454 if (delta .le. xxx) then
3463 if (me.eq.king .or. .not. out1file)
3464 & write(iout,*) 'HMC accepting new'
3473 call chainbuild_cart
3477 d_t_old(j,i)=d_t(j,i)
3481 kinetic_T=2.0d0/(dimen3*Rb)*EK
3482 call etotal(potEcomp)
3485 if (me.eq.king .or. .not. out1file)
3486 & write(iout,'(a8,i5,3f10.4)')'HMC new',itime,potE+EK,potE,EK