1 c------------------------------------------------------
2 double precision function HNose(ek,s,e,pi,Q,t_bath,dimen)
4 double precision ek,s,e,pi,Q,t_bath,Rb
7 HNose=ek+e+pi**2/(2*Q)+dimen*Rb*t_bath*log(s)
8 c print '(6f15.5,i5,a2,2f15.5)',ek,s,e,pi,Q,t_bath,dimen,"--",
9 c & pi**2/(2*Q),dimen*Rb*t_bath*log(s)
12 c-----------------------------------------------------------------
13 double precision function HNose_nh(eki,e)
14 implicit real*8 (a-h,o-z)
17 HNose_nh=eki+e+dimen*Rb*t_bath*xlogs(1)+qmass(1)*vlogs(1)**2/2
19 HNose_nh=HNose_nh+qmass(i)*vlogs(i)**2/2+Rb*t_bath*xlogs(i)
22 c & vlogs(1),xlogs(1),HNose,eki,e
25 c-----------------------------------------------------------------
26 SUBROUTINE NHCINT(akin,scale,wdti,wdti2,wdti4,wdti8)
27 implicit real*8 (a-h,o-z)
30 double precision akin,gnkt,dt,aa,gkt,scale
31 double precision wdti(maxyosh),wdti2(maxyosh),
32 & wdti4(maxyosh),wdti8(maxyosh)
33 integer i,iresn,iyosh,inos,nnos1
42 C THIS ROUTINE DOES THE NOSE-HOOVER PART OF THE
43 C INTEGRATION FROM t=0 TO t=DT/2
44 C GET THE TOTAL KINETIC ENERGY
46 c CALL GETKINP(MASS,VX,VY,VZ,AKIN)
48 GLOGS(1) = (AKIN - GNKT)/QMASS(1)
49 C START THE MULTIPLE TIME STEP PROCEDURE
52 C UPDATE THE THERMOSTAT VELOCITIES
53 VLOGS(NNOS) = VLOGS(NNOS) + GLOGS(NNOS)*WDTI4(IYOSH)
55 AA = EXP(-WDTI8(IYOSH)*VLOGS(NNOS1-INOS) )
56 VLOGS(NNOS-INOS) = VLOGS(NNOS-INOS)*AA*AA
57 & + WDTI4(IYOSH)*GLOGS(NNOS-INOS)*AA
59 C UPDATE THE PARTICLE VELOCITIES
60 AA = EXP(-WDTI2(IYOSH)*VLOGS(1) )
63 GLOGS(1) = (SCALE*SCALE*AKIN - GNKT)/QMASS(1)
64 C UPDATE THE THERMOSTAT POSITIONS
66 XLOGS(INOS) = XLOGS(INOS) + VLOGS(INOS)*WDTI2(IYOSH)
68 C UPDATE THE THERMOSTAT VELOCITIES
70 AA = EXP(-WDTI8(IYOSH)*VLOGS(INOS+1) )
71 VLOGS(INOS) = VLOGS(INOS)*AA*AA
72 & + WDTI4(IYOSH)*GLOGS(INOS)*AA
73 GLOGS(INOS+1) = (QMASS(INOS)*VLOGS(INOS)*VLOGS(INOS)
76 VLOGS(NNOS) = VLOGS(NNOS) + GLOGS(NNOS)*WDTI4(IYOSH)
79 C UPDATE THE PARTICLE VELOCITIES
80 c outside of this subroutine
88 c-----------------------------------------------------------------
89 subroutine tnp1_respa_i_step1
90 c Applying Nose-Poincare algorithm - step 1 to coordinates
91 c JPSJ 70 75 (2001) S. Nose
93 c d_t is not updated here
95 implicit real*8 (a-h,o-z)
97 include 'COMMON.CONTROL'
100 include 'COMMON.CHAIN'
101 include 'COMMON.DERIV'
103 include 'COMMON.LOCAL'
104 include 'COMMON.INTERACT'
105 include 'COMMON.IOUNITS'
106 include 'COMMON.NAMES'
107 double precision adt,adt2,tmp
109 tmp=1+pi_np/(2*Q_np)*0.5*d_time
113 d_time_s12=d_time*0.5*s12_np
116 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s12
117 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*s12_dt
121 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s12
122 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*s12_dt
126 if (itype(i).ne.10) then
129 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s12
130 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*s12_dt
136 c---------------------------------------------------------------------
137 subroutine tnp1_respa_i_step2
138 c Step 2 of the velocity Verlet algorithm: update velocities
139 implicit real*8 (a-h,o-z)
141 include 'COMMON.CONTROL'
144 include 'COMMON.CHAIN'
145 include 'COMMON.DERIV'
147 include 'COMMON.LOCAL'
148 include 'COMMON.INTERACT'
149 include 'COMMON.IOUNITS'
150 include 'COMMON.NAMES'
152 double precision d_time_s12
156 d_t(j,i)=d_t_new(j,i)
163 d_time_s12=0.5d0*s12_np*d_time
166 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s12
170 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s12
174 if (itype(i).ne.10) then
177 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s12
182 pistar=pistar+(EK-0.5*(E_old+potE)
183 & -dimen*Rb*t_bath*log(s12_np)+Csplit-dimen*Rb*t_bath)*d_time
184 tmp=1+pistar/(2*Q_np)*0.5*d_time
190 c-------------------------------------------------------
192 subroutine tnp1_step1
193 c Applying Nose-Poincare algorithm - step 1 to coordinates
194 c JPSJ 70 75 (2001) S. Nose
196 c d_t is not updated here
198 implicit real*8 (a-h,o-z)
200 include 'COMMON.CONTROL'
203 include 'COMMON.CHAIN'
204 include 'COMMON.DERIV'
206 include 'COMMON.LOCAL'
207 include 'COMMON.INTERACT'
208 include 'COMMON.IOUNITS'
209 include 'COMMON.NAMES'
210 double precision adt,adt2,tmp
212 tmp=1+pi_np/(2*Q_np)*0.5*d_time
216 d_time_s12=d_time*0.5*s12_np
219 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s12
220 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*s12_dt
224 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s12
225 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*s12_dt
229 if (itype(i).ne.10) then
232 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s12
233 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*s12_dt
239 c---------------------------------------------------------------------
240 subroutine tnp1_step2
241 c Step 2 of the velocity Verlet algorithm: update velocities
242 implicit real*8 (a-h,o-z)
244 include 'COMMON.CONTROL'
247 include 'COMMON.CHAIN'
248 include 'COMMON.DERIV'
250 include 'COMMON.LOCAL'
251 include 'COMMON.INTERACT'
252 include 'COMMON.IOUNITS'
253 include 'COMMON.NAMES'
255 double precision d_time_s12
259 d_t(j,i)=d_t_new(j,i)
266 d_time_s12=0.5d0*s12_np*d_time
269 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s12
273 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s12
277 if (itype(i).ne.10) then
280 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s12
285 cd write(iout,*) 'pistar',pistar,EK,E_old,potE,s12_np
286 pistar=pistar+(EK-0.5*(E_old+potE)
287 & -dimen*Rb*t_bath*log(s12_np)+H0-dimen*Rb*t_bath)*d_time
288 tmp=1+pistar/(2*Q_np)*0.5*d_time
295 c-----------------------------------------------------------------
296 subroutine tnp_respa_i_step1
297 c Applying Nose-Poincare algorithm - step 1 to coordinates
298 c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird
300 c d_t is not updated here, it is destroyed
302 implicit real*8 (a-h,o-z)
304 include 'COMMON.CONTROL'
307 include 'COMMON.CHAIN'
308 include 'COMMON.DERIV'
310 include 'COMMON.LOCAL'
311 include 'COMMON.INTERACT'
312 include 'COMMON.IOUNITS'
313 include 'COMMON.NAMES'
314 double precision C_np,d_time_s,tmp,d_time_ss
316 d_time_s=d_time*0.5*s_np
317 ct2 d_time_s=d_time*0.5*s12_np
320 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s
324 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s
328 if (itype(i).ne.10) then
331 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s
338 d_t(j,i)=d_t_new(j,i)
345 C_np=0.5*d_time*(dimen*Rb*t_bath*(1.0+log(s_np))-EK+potE-Csplit)
348 pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np))
349 tmp=0.5*d_time*pistar/Q_np
350 s12_np=s_np*(1.0+tmp)/(1.0-tmp)
352 d_time_ss=0.5*d_time*(1.0/s12_np+1.0/s_np)
353 ct2 d_time_ss=d_time/s12_np
354 c d_time_ss=0.5*d_time*(1.0/sold_np+1.0/s_np)
357 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*d_time_ss
361 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*d_time_ss
365 if (itype(i).ne.10) then
368 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*d_time_ss
375 c---------------------------------------------------------------------
377 subroutine tnp_respa_i_step2
378 c Step 2 of the velocity Verlet algorithm: update velocities
379 implicit real*8 (a-h,o-z)
381 include 'COMMON.CONTROL'
384 include 'COMMON.CHAIN'
385 include 'COMMON.DERIV'
387 include 'COMMON.LOCAL'
388 include 'COMMON.INTERACT'
389 include 'COMMON.IOUNITS'
390 include 'COMMON.NAMES'
392 double precision d_time_s
394 EK=EK*(s_np/s12_np)**2
395 HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen)
396 pi_np=pistar+0.5*d_time*(2*EK-dimen*Rb*t_bath
399 cr print '(a,5f)','i_step2',EK,potE,HNose1,pi_np,E_long
400 d_time_s=d_time*0.5*s12_np
401 c d_time_s=d_time*0.5*s_np
404 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s
408 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s
412 if (itype(i).ne.10) then
415 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s
424 c-----------------------------------------------------------------
425 subroutine tnp_respa_step1
426 c Applying Nose-Poincare algorithm - step 1 to vel for RESPA
427 c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird
429 c d_t is not updated here, it is destroyed
431 implicit real*8 (a-h,o-z)
433 include 'COMMON.CONTROL'
436 include 'COMMON.CHAIN'
437 include 'COMMON.DERIV'
439 include 'COMMON.LOCAL'
440 include 'COMMON.INTERACT'
441 include 'COMMON.IOUNITS'
442 include 'COMMON.NAMES'
443 double precision C_np,d_time_s,tmp,d_time_ss
444 double precision energia(0:n_ene)
446 d_time_s=d_time*0.5*s_np
449 d_t_old(j,0)=d_t_old(j,0)+d_a(j,0)*d_time_s
453 d_t_old(j,i)=d_t_old(j,i)+d_a(j,i)*d_time_s
457 if (itype(i).ne.10) then
460 d_t_old(j,inres)=d_t_old(j,inres)+d_a(j,inres)*d_time_s
466 c C_np=0.5*d_time*(dimen*Rb*t_bath*(1.0+log(s_np))-EK+potE-H0)
469 c pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np))
470 c tmp=0.5*d_time*pistar/Q_np
471 c s12_np=s_np*(1.0+tmp)/(1.0-tmp)
472 c write(iout,*) 'tnp_respa_step1',s_np,s12_np,EK,potE,C_np,pistar,tmp
478 c-------------------------------------
479 c test of reviewer's comment
480 pi_np=pi_np-0.5*d_time*(E_long+Csplit-H0)
481 cr print '(a,3f)','1 pi_np,s_np',pi_np,s_np,E_long
482 c-------------------------------------
486 c---------------------------------------------------------------------
487 subroutine tnp_respa_step2
488 c Step 2 of the velocity Verlet algorithm: update velocities for RESPA
489 implicit real*8 (a-h,o-z)
491 include 'COMMON.CONTROL'
494 include 'COMMON.CHAIN'
495 include 'COMMON.DERIV'
497 include 'COMMON.LOCAL'
498 include 'COMMON.INTERACT'
499 include 'COMMON.IOUNITS'
500 include 'COMMON.NAMES'
502 double precision d_time_s
508 ct HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen)
509 ct pi_np=pistar+0.5*d_time*(2*EK-dimen*Rb*t_bath)
510 ct & -0.5*d_time*(HNose1-H0)
512 c-------------------------------------
513 c test of reviewer's comment
514 pi_np=pi_np-0.5*d_time*(E_long+Csplit-H0)
515 cr print '(a,3f)','2 pi_np,s_np',pi_np,s_np,E_long
516 c-------------------------------------
517 d_time_s=d_time*0.5*s_np
520 d_t_old(j,0)=d_t_old(j,0)+d_a(j,0)*d_time_s
524 d_t_old(j,i)=d_t_old(j,i)+d_a(j,i)*d_time_s
528 if (itype(i).ne.10) then
531 d_t_old(j,inres)=d_t_old(j,inres)+d_a(j,inres)*d_time_s
540 c---------------------------------------------------------------------
542 c Applying Nose-Poincare algorithm - step 1 to coordinates
543 c J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird
545 c d_t is not updated here, it is destroyed
547 implicit real*8 (a-h,o-z)
549 include 'COMMON.CONTROL'
552 include 'COMMON.CHAIN'
553 include 'COMMON.DERIV'
555 include 'COMMON.LOCAL'
556 include 'COMMON.INTERACT'
557 include 'COMMON.IOUNITS'
558 include 'COMMON.NAMES'
559 double precision C_np,d_time_s,tmp,d_time_ss
561 d_time_s=d_time*0.5*s_np
564 d_t_new(j,0)=d_t_old(j,0)+d_a_old(j,0)*d_time_s
568 d_t_new(j,i)=d_t_old(j,i)+d_a_old(j,i)*d_time_s
572 if (itype(i).ne.10) then
575 d_t_new(j,inres)=d_t_old(j,inres)+d_a_old(j,inres)*d_time_s
582 d_t(j,i)=d_t_new(j,i)
589 C_np=0.5*d_time*(dimen*Rb*t_bath*(1.0+log(s_np))-EK+potE-H0)
592 pistar=-2.0*C_np/(1.0+sqrt(1.0-C_np*d_time/Q_np))
593 tmp=0.5*d_time*pistar/Q_np
594 s12_np=s_np*(1.0+tmp)/(1.0-tmp)
595 c write(iout,*) 'tnp_step1',s_np,s12_np,EK,potE,C_np,pistar,tmp
597 d_time_ss=0.5*d_time*(1.0/s12_np+1.0/s_np)
600 dc(j,0)=dc_old(j,0)+d_t_new(j,0)*d_time_ss
604 dc(j,i)=dc_old(j,i)+d_t_new(j,i)*d_time_ss
608 if (itype(i).ne.10) then
611 dc(j,inres)=dc_old(j,inres)+d_t_new(j,inres)*d_time_ss
618 c-----------------------------------------------------------------
620 c Step 2 of the velocity Verlet algorithm: update velocities
621 implicit real*8 (a-h,o-z)
623 include 'COMMON.CONTROL'
626 include 'COMMON.CHAIN'
627 include 'COMMON.DERIV'
629 include 'COMMON.LOCAL'
630 include 'COMMON.INTERACT'
631 include 'COMMON.IOUNITS'
632 include 'COMMON.NAMES'
634 double precision d_time_s
636 EK=EK*(s_np/s12_np)**2
637 HNose1=Hnose(EK,s12_np,potE,pistar,Q_np,t_bath,dimen)
638 pi_np=pistar+0.5*d_time*(2*EK-dimen*Rb*t_bath)
639 & -0.5*d_time*(HNose1-H0)
641 cd write(iout,'(a,4f)') 'mmm',EK,potE,HNose1,pi_np
642 d_time_s=d_time*0.5*s12_np
645 d_t(j,0)=d_t_new(j,0)+d_a(j,0)*d_time_s
649 d_t(j,i)=d_t_new(j,i)+d_a(j,i)*d_time_s
653 if (itype(i).ne.10) then
656 d_t(j,inres)=d_t_new(j,inres)+d_a(j,inres)*d_time_s