1 /* -*- mode: c; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; c-file-style: "stroustrup"; -*-
3 * This source code is part of
7 * GROningen MAchine for Chemical Simulations
10 * Written by David van der Spoel, Erik Lindahl, Berk Hess, and others.
11 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
12 * Copyright (c) 2001-2004, The GROMACS development team,
13 * check out http://www.gromacs.org for more information.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
33 * GROwing Monsters And Cloning Shrimps
46 #include "gmx_fatal.h"
49 #include "gmx_random.h"
53 #define NTROTTERPARTS 3
55 /* these integration routines are only referenced inside this file */
56 static void NHC_trotter(t_grpopts
*opts
,int nvar
, gmx_ekindata_t
*ekind
,real dtfull
,
57 double xi
[],double vxi
[], double scalefac
[], real
*veta
, t_extmass
*MassQ
, gmx_bool bEkinAveVel
)
60 /* general routine for both barostat and thermostat nose hoover chains */
62 int i
,j
,mi
,mj
,jmax
,nd
;
63 double Ekin
,Efac
,reft
,kT
;
71 int ns
= SUZUKI_YOSHIDA_NUM
; /* set the degree of integration in the types/state.h file */
72 int nh
= opts
->nhchainlength
;
75 mstepsi
= mstepsj
= ns
;
77 /* if scalefac is NULL, we are doing the NHC of the barostat */
80 if (scalefac
== NULL
) {
84 for (i
=0; i
<nvar
; i
++)
87 /* make it easier to iterate by selecting
88 out the sub-array that corresponds to this T group */
93 iQinv
= &(MassQ
->QPinv
[i
*nh
]);
94 nd
= 1; /* THIS WILL CHANGE IF NOT ISOTROPIC */
95 reft
= max(0.0,opts
->ref_t
[0]);
96 Ekin
= sqr(*veta
)/MassQ
->Winv
;
98 iQinv
= &(MassQ
->Qinv
[i
*nh
]);
99 tcstat
= &ekind
->tcstat
[i
];
101 reft
= max(0.0,opts
->ref_t
[i
]);
104 Ekin
= 2*trace(tcstat
->ekinf
)*tcstat
->ekinscalef_nhc
;
106 Ekin
= 2*trace(tcstat
->ekinh
)*tcstat
->ekinscaleh_nhc
;
111 for(mi
=0;mi
<mstepsi
;mi
++)
113 for(mj
=0;mj
<mstepsj
;mj
++)
115 /* weighting for this step using Suzuki-Yoshida integration - fixed at 5 */
116 dt
= sy_const
[ns
][mj
] * dtfull
/ mstepsi
;
118 /* compute the thermal forces */
119 GQ
[0] = iQinv
[0]*(Ekin
- nd
*kT
);
123 if (iQinv
[j
+1] > 0) {
124 /* we actually don't need to update here if we save the
125 state of the GQ, but it's easier to just recompute*/
126 GQ
[j
+1] = iQinv
[j
+1]*((sqr(ivxi
[j
])/iQinv
[j
])-kT
);
132 ivxi
[nh
-1] += 0.25*dt
*GQ
[nh
-1];
135 Efac
= exp(-0.125*dt
*ivxi
[j
]);
136 ivxi
[j
-1] = Efac
*(ivxi
[j
-1]*Efac
+ 0.25*dt
*GQ
[j
-1]);
139 Efac
= exp(-0.5*dt
*ivxi
[0]);
147 /* Issue - if the KE is an average of the last and the current temperatures, then we might not be
148 able to scale the kinetic energy directly with this factor. Might take more bookkeeping -- have to
149 think about this a bit more . . . */
151 GQ
[0] = iQinv
[0]*(Ekin
- nd
*kT
);
153 /* update thermostat positions */
156 ixi
[j
] += 0.5*dt
*ivxi
[j
];
161 Efac
= exp(-0.125*dt
*ivxi
[j
+1]);
162 ivxi
[j
] = Efac
*(ivxi
[j
]*Efac
+ 0.25*dt
*GQ
[j
]);
163 if (iQinv
[j
+1] > 0) {
164 GQ
[j
+1] = iQinv
[j
+1]*((sqr(ivxi
[j
])/iQinv
[j
])-kT
);
169 ivxi
[nh
-1] += 0.25*dt
*GQ
[nh
-1];
176 static void boxv_trotter(t_inputrec
*ir
, real
*veta
, real dt
, tensor box
,
177 gmx_ekindata_t
*ekind
, tensor vir
, real pcorr
, real ecorr
, t_extmass
*MassQ
)
184 tensor Winvm
,ekinmod
,localpres
;
186 /* The heat bath is coupled to a separate barostat, the last temperature group. In the
187 2006 Tuckerman et al paper., the order is iL_{T_baro} iL {T_part}
190 if (ir
->epct
==epctSEMIISOTROPIC
)
199 /* eta is in pure units. veta is in units of ps^-1. GW is in
200 units of ps^-2. However, eta has a reference of 1 nm^3, so care must be
201 taken to use only RATIOS of eta in updating the volume. */
203 /* we take the partial pressure tensors, modify the
204 kinetic energy tensor, and recovert to pressure */
206 if (ir
->opts
.nrdf
[0]==0)
208 gmx_fatal(FARGS
,"Barostat is coupled to a T-group with no degrees of freedom\n");
210 /* alpha factor for phase space volume, then multiply by the ekin scaling factor. */
211 alpha
= 1.0 + DIM
/((double)ir
->opts
.nrdf
[0]);
212 alpha
*= ekind
->tcstat
[0].ekinscalef_nhc
;
213 msmul(ekind
->ekin
,alpha
,ekinmod
);
215 /* for now, we use Elr = 0, because if you want to get it right, you
216 really should be using PME. Maybe print a warning? */
218 pscal
= calc_pres(ir
->ePBC
,nwall
,box
,ekinmod
,vir
,localpres
,0.0) + pcorr
;
221 GW
= (vol
*(MassQ
->Winv
/PRESFAC
))*(DIM
*pscal
- trace(ir
->ref_p
)); /* W is in ps^2 * bar * nm^3 */
227 * This file implements temperature and pressure coupling algorithms:
228 * For now only the Weak coupling and the modified weak coupling.
230 * Furthermore computation of pressure and temperature is done here
234 real
calc_pres(int ePBC
,int nwall
,matrix box
,tensor ekin
,tensor vir
,
235 tensor pres
,real Elr
)
240 if (ePBC
==epbcNONE
|| (ePBC
==epbcXY
&& nwall
!=2))
243 /* Uitzoeken welke ekin hier van toepassing is, zie Evans & Morris - E.
244 * Wrs. moet de druktensor gecorrigeerd worden voor de netto stroom in
248 /* Long range correction for periodic systems, see
250 * divide by 6 because it is multiplied by fac later on.
251 * If Elr = 0, no correction is made.
254 /* This formula should not be used with Ewald or PME,
255 * where the full long-range virial is calculated. EL 990823
259 fac
=PRESFAC
*2.0/det(box
);
260 for(n
=0; (n
<DIM
); n
++)
261 for(m
=0; (m
<DIM
); m
++)
262 pres
[n
][m
]=(ekin
[n
][m
]-vir
[n
][m
]+Plr
)*fac
;
265 pr_rvecs(debug
,0,"PC: pres",pres
,DIM
);
266 pr_rvecs(debug
,0,"PC: ekin",ekin
,DIM
);
267 pr_rvecs(debug
,0,"PC: vir ",vir
, DIM
);
268 pr_rvecs(debug
,0,"PC: box ",box
, DIM
);
271 return trace(pres
)/DIM
;
274 real
calc_temp(real ekin
,real nrdf
)
277 return (2.0*ekin
)/(nrdf
*BOLTZ
);
282 void parrinellorahman_pcoupl(FILE *fplog
,gmx_large_int_t step
,
283 t_inputrec
*ir
,real dt
,tensor pres
,
284 tensor box
,tensor box_rel
,tensor boxv
,
285 tensor M
,matrix mu
,gmx_bool bFirstStep
)
287 /* This doesn't do any coordinate updating. It just
288 * integrates the box vector equations from the calculated
289 * acceleration due to pressure difference. We also compute
290 * the tensor M which is used in update to couple the particle
291 * coordinates to the box vectors.
293 * In Nose and Klein (Mol.Phys 50 (1983) no 5., p 1055) this is
296 * M_nk = (h') * (h' * h + h' h) * h
298 * with the dots denoting time derivatives and h is the transformation from
299 * the scaled frame to the real frame, i.e. the TRANSPOSE of the box.
300 * This also goes for the pressure and M tensors - they are transposed relative
301 * to ours. Our equation thus becomes:
304 * M_gmx = M_nk' = b * (b * b' + b * b') * b'
306 * where b is the gromacs box matrix.
307 * Our box accelerations are given by
309 * b = vol/W inv(box') * (P-ref_P) (=h')
314 real vol
=box
[XX
][XX
]*box
[YY
][YY
]*box
[ZZ
][ZZ
];
315 real atot
,arel
,change
,maxchange
,xy_pressure
;
316 tensor invbox
,pdiff
,t1
,t2
;
320 m_inv_ur0(box
,invbox
);
323 /* Note that PRESFAC does not occur here.
324 * The pressure and compressibility always occur as a product,
325 * therefore the pressure unit drops out.
327 maxl
=max(box
[XX
][XX
],box
[YY
][YY
]);
328 maxl
=max(maxl
,box
[ZZ
][ZZ
]);
332 (4*M_PI
*M_PI
*ir
->compress
[d
][n
])/(3*ir
->tau_p
*ir
->tau_p
*maxl
);
334 m_sub(pres
,ir
->ref_p
,pdiff
);
336 if(ir
->epct
==epctSURFACETENSION
) {
337 /* Unlike Berendsen coupling it might not be trivial to include a z
338 * pressure correction here? On the other hand we don't scale the
339 * box momentarily, but change accelerations, so it might not be crucial.
341 xy_pressure
=0.5*(pres
[XX
][XX
]+pres
[YY
][YY
]);
343 pdiff
[d
][d
]=(xy_pressure
-(pres
[ZZ
][ZZ
]-ir
->ref_p
[d
][d
]/box
[d
][d
]));
346 tmmul(invbox
,pdiff
,t1
);
347 /* Move the off-diagonal elements of the 'force' to one side to ensure
348 * that we obey the box constraints.
352 t1
[d
][n
] += t1
[n
][d
];
358 case epctANISOTROPIC
:
361 t1
[d
][n
] *= winv
[d
][n
]*vol
;
364 /* calculate total volume acceleration */
365 atot
=box
[XX
][XX
]*box
[YY
][YY
]*t1
[ZZ
][ZZ
]+
366 box
[XX
][XX
]*t1
[YY
][YY
]*box
[ZZ
][ZZ
]+
367 t1
[XX
][XX
]*box
[YY
][YY
]*box
[ZZ
][ZZ
];
369 /* set all RELATIVE box accelerations equal, and maintain total V
373 t1
[d
][n
] = winv
[0][0]*vol
*arel
*box
[d
][n
];
375 case epctSEMIISOTROPIC
:
376 case epctSURFACETENSION
:
377 /* Note the correction to pdiff above for surftens. coupling */
379 /* calculate total XY volume acceleration */
380 atot
=box
[XX
][XX
]*t1
[YY
][YY
]+t1
[XX
][XX
]*box
[YY
][YY
];
381 arel
=atot
/(2*box
[XX
][XX
]*box
[YY
][YY
]);
382 /* set RELATIVE XY box accelerations equal, and maintain total V
383 * change speed. Dont change the third box vector accelerations */
386 t1
[d
][n
] = winv
[d
][n
]*vol
*arel
*box
[d
][n
];
388 t1
[ZZ
][n
] *= winv
[d
][n
]*vol
;
391 gmx_fatal(FARGS
,"Parrinello-Rahman pressure coupling type %s "
392 "not supported yet\n",EPCOUPLTYPETYPE(ir
->epct
));
399 boxv
[d
][n
] += dt
*t1
[d
][n
];
401 /* We do NOT update the box vectors themselves here, since
402 * we need them for shifting later. It is instead done last
403 * in the update() routine.
406 /* Calculate the change relative to diagonal elements-
407 since it's perfectly ok for the off-diagonal ones to
408 be zero it doesn't make sense to check the change relative
412 change
=fabs(dt
*boxv
[d
][n
]/box
[d
][d
]);
414 if (change
>maxchange
)
418 if (maxchange
> 0.01 && fplog
) {
420 fprintf(fplog
,"\nStep %s Warning: Pressure scaling more than 1%%.\n",
421 gmx_step_str(step
,buf
));
425 preserve_box_shape(ir
,box_rel
,boxv
);
427 mtmul(boxv
,box
,t1
); /* t1=boxv * b' */
431 /* Determine the scaling matrix mu for the coordinates */
434 t1
[d
][n
] = box
[d
][n
] + dt
*boxv
[d
][n
];
435 preserve_box_shape(ir
,box_rel
,t1
);
436 /* t1 is the box at t+dt, determine mu as the relative change */
437 mmul_ur0(invbox
,t1
,mu
);
440 void berendsen_pcoupl(FILE *fplog
,gmx_large_int_t step
,
441 t_inputrec
*ir
,real dt
, tensor pres
,matrix box
,
445 real scalar_pressure
, xy_pressure
, p_corr_z
;
446 char *ptr
,buf
[STRLEN
];
449 * Calculate the scaling matrix mu
453 for(d
=0; d
<DIM
; d
++) {
454 scalar_pressure
+= pres
[d
][d
]/DIM
;
456 xy_pressure
+= pres
[d
][d
]/(DIM
-1);
458 /* Pressure is now in bar, everywhere. */
459 #define factor(d,m) (ir->compress[d][m]*dt/ir->tau_p)
461 /* mu has been changed from pow(1+...,1/3) to 1+.../3, since this is
462 * necessary for triclinic scaling
469 mu
[d
][d
] = 1.0 - factor(d
,d
)*(ir
->ref_p
[d
][d
] - scalar_pressure
) /DIM
;
472 case epctSEMIISOTROPIC
:
474 mu
[d
][d
] = 1.0 - factor(d
,d
)*(ir
->ref_p
[d
][d
]-xy_pressure
)/DIM
;
476 1.0 - factor(ZZ
,ZZ
)*(ir
->ref_p
[ZZ
][ZZ
] - pres
[ZZ
][ZZ
])/DIM
;
478 case epctANISOTROPIC
:
481 mu
[d
][n
] = (d
==n
? 1.0 : 0.0)
482 -factor(d
,n
)*(ir
->ref_p
[d
][n
] - pres
[d
][n
])/DIM
;
484 case epctSURFACETENSION
:
485 /* ir->ref_p[0/1] is the reference surface-tension times *
486 * the number of surfaces */
487 if (ir
->compress
[ZZ
][ZZ
])
488 p_corr_z
= dt
/ir
->tau_p
*(ir
->ref_p
[ZZ
][ZZ
] - pres
[ZZ
][ZZ
]);
490 /* when the compressibity is zero, set the pressure correction *
491 * in the z-direction to zero to get the correct surface tension */
493 mu
[ZZ
][ZZ
] = 1.0 - ir
->compress
[ZZ
][ZZ
]*p_corr_z
;
494 for(d
=0; d
<DIM
-1; d
++)
495 mu
[d
][d
] = 1.0 + factor(d
,d
)*(ir
->ref_p
[d
][d
]/(mu
[ZZ
][ZZ
]*box
[ZZ
][ZZ
])
496 - (pres
[ZZ
][ZZ
]+p_corr_z
- xy_pressure
))/(DIM
-1);
499 gmx_fatal(FARGS
,"Berendsen pressure coupling type %s not supported yet\n",
500 EPCOUPLTYPETYPE(ir
->epct
));
503 /* To fullfill the orientation restrictions on triclinic boxes
504 * we will set mu_yx, mu_zx and mu_zy to 0 and correct
505 * the other elements of mu to first order.
507 mu
[YY
][XX
] += mu
[XX
][YY
];
508 mu
[ZZ
][XX
] += mu
[XX
][ZZ
];
509 mu
[ZZ
][YY
] += mu
[YY
][ZZ
];
515 pr_rvecs(debug
,0,"PC: pres ",pres
,3);
516 pr_rvecs(debug
,0,"PC: mu ",mu
,3);
519 if (mu
[XX
][XX
]<0.99 || mu
[XX
][XX
]>1.01 ||
520 mu
[YY
][YY
]<0.99 || mu
[YY
][YY
]>1.01 ||
521 mu
[ZZ
][ZZ
]<0.99 || mu
[ZZ
][ZZ
]>1.01) {
523 sprintf(buf
,"\nStep %s Warning: pressure scaling more than 1%%, "
525 gmx_step_str(step
,buf2
),mu
[XX
][XX
],mu
[YY
][YY
],mu
[ZZ
][ZZ
]);
527 fprintf(fplog
,"%s",buf
);
528 fprintf(stderr
,"%s",buf
);
532 void berendsen_pscale(t_inputrec
*ir
,matrix mu
,
533 matrix box
,matrix box_rel
,
534 int start
,int nr_atoms
,
535 rvec x
[],unsigned short cFREEZE
[],
538 ivec
*nFreeze
=ir
->opts
.nFreeze
;
541 /* Scale the positions */
542 for (n
=start
; n
<start
+nr_atoms
; n
++) {
547 x
[n
][XX
] = mu
[XX
][XX
]*x
[n
][XX
]+mu
[YY
][XX
]*x
[n
][YY
]+mu
[ZZ
][XX
]*x
[n
][ZZ
];
549 x
[n
][YY
] = mu
[YY
][YY
]*x
[n
][YY
]+mu
[ZZ
][YY
]*x
[n
][ZZ
];
551 x
[n
][ZZ
] = mu
[ZZ
][ZZ
]*x
[n
][ZZ
];
553 /* compute final boxlengths */
554 for (d
=0; d
<DIM
; d
++) {
555 box
[d
][XX
] = mu
[XX
][XX
]*box
[d
][XX
]+mu
[YY
][XX
]*box
[d
][YY
]+mu
[ZZ
][XX
]*box
[d
][ZZ
];
556 box
[d
][YY
] = mu
[YY
][YY
]*box
[d
][YY
]+mu
[ZZ
][YY
]*box
[d
][ZZ
];
557 box
[d
][ZZ
] = mu
[ZZ
][ZZ
]*box
[d
][ZZ
];
560 preserve_box_shape(ir
,box_rel
,box
);
562 /* (un)shifting should NOT be done after this,
563 * since the box vectors might have changed
565 inc_nrnb(nrnb
,eNR_PCOUPL
,nr_atoms
);
568 void berendsen_tcoupl(t_inputrec
*ir
,gmx_ekindata_t
*ekind
,real dt
)
576 for(i
=0; (i
<opts
->ngtc
); i
++)
580 T
= ekind
->tcstat
[i
].T
;
584 T
= ekind
->tcstat
[i
].Th
;
587 if ((opts
->tau_t
[i
] > 0) && (T
> 0.0)) {
589 reft
= max(0.0,opts
->ref_t
[i
]);
590 lll
= sqrt(1.0 + (dt
/opts
->tau_t
[i
])*(reft
/T
-1.0));
591 ekind
->tcstat
[i
].lambda
= max(min(lll
,1.25),0.8);
594 ekind
->tcstat
[i
].lambda
= 1.0;
598 fprintf(debug
,"TC: group %d: T: %g, Lambda: %g\n",
599 i
,T
,ekind
->tcstat
[i
].lambda
);
603 void nosehoover_tcoupl(t_grpopts
*opts
,gmx_ekindata_t
*ekind
,real dt
,
604 double xi
[],double vxi
[], t_extmass
*MassQ
)
609 /* note that this routine does not include Nose-hoover chains yet. Should be easy to add. */
611 for(i
=0; (i
<opts
->ngtc
); i
++) {
612 reft
= max(0.0,opts
->ref_t
[i
]);
614 vxi
[i
] += dt
*MassQ
->Qinv
[i
]*(ekind
->tcstat
[i
].Th
- reft
);
615 xi
[i
] += dt
*(oldvxi
+ vxi
[i
])*0.5;
619 t_state
*init_bufstate(const t_state
*template_state
)
622 int nc
= template_state
->nhchainlength
;
624 snew(state
->nosehoover_xi
,nc
*template_state
->ngtc
);
625 snew(state
->nosehoover_vxi
,nc
*template_state
->ngtc
);
626 snew(state
->therm_integral
,template_state
->ngtc
);
627 snew(state
->nhpres_xi
,nc
*template_state
->nnhpres
);
628 snew(state
->nhpres_vxi
,nc
*template_state
->nnhpres
);
633 void destroy_bufstate(t_state
*state
)
637 sfree(state
->nosehoover_xi
);
638 sfree(state
->nosehoover_vxi
);
639 sfree(state
->therm_integral
);
640 sfree(state
->nhpres_xi
);
641 sfree(state
->nhpres_vxi
);
645 void trotter_update(t_inputrec
*ir
,gmx_large_int_t step
, gmx_ekindata_t
*ekind
,
646 gmx_enerdata_t
*enerd
, t_state
*state
,
647 tensor vir
, t_mdatoms
*md
,
648 t_extmass
*MassQ
, int **trotter_seqlist
, int trotter_seqno
)
651 int n
,i
,j
,d
,ntgrp
,ngtc
,gc
=0;
652 t_grp_tcstat
*tcstat
;
654 gmx_large_int_t step_eff
;
655 real ecorr
,pcorr
,dvdlcorr
;
656 real bmass
,qmass
,reft
,kT
,dt
,nd
;
657 tensor dumpres
,dumvir
;
658 double *scalefac
,dtc
;
663 if (trotter_seqno
<= ettTSEQ2
)
665 step_eff
= step
-1; /* the velocity verlet calls are actually out of order -- the first half step
666 is actually the last half step from the previous step. Thus the first half step
667 actually corresponds to the n-1 step*/
673 bCouple
= (ir
->nsttcouple
== 1 ||
674 do_per_step(step_eff
+ir
->nsttcouple
,ir
->nsttcouple
));
676 trotter_seq
= trotter_seqlist
[trotter_seqno
];
678 /* signal we are returning if nothing is going to be done in this routine */
679 if ((trotter_seq
[0] == etrtSKIPALL
) || !(bCouple
))
684 dtc
= ir
->nsttcouple
*ir
->delta_t
;
685 opts
= &(ir
->opts
); /* just for ease of referencing */
687 snew(scalefac
,opts
->ngtc
);
692 /* execute the series of trotter updates specified in the trotterpart array */
694 for (i
=0;i
<NTROTTERPARTS
;i
++){
695 /* allow for doubled intgrators by doubling dt instead of making 2 calls */
696 if ((trotter_seq
[i
] == etrtBAROV2
) || (trotter_seq
[i
] == etrtBARONHC2
) || (trotter_seq
[i
] == etrtNHC2
))
705 switch (trotter_seq
[i
])
709 boxv_trotter(ir
,&(state
->veta
),dt
,state
->box
,ekind
,vir
,
710 enerd
->term
[F_PDISPCORR
],enerd
->term
[F_DISPCORR
],MassQ
);
714 NHC_trotter(opts
,state
->nnhpres
,ekind
,dt
,state
->nhpres_xi
,
715 state
->nhpres_vxi
,NULL
,&(state
->veta
),MassQ
,FALSE
);
719 NHC_trotter(opts
,opts
->ngtc
,ekind
,dt
,state
->nosehoover_xi
,
720 state
->nosehoover_vxi
,scalefac
,NULL
,MassQ
,(ir
->eI
==eiVV
));
721 /* need to rescale the kinetic energies and velocities here. Could
722 scale the velocities later, but we need them scaled in order to
723 produce the correct outputs, so we'll scale them here. */
725 for (i
=0; i
<ngtc
;i
++)
727 tcstat
= &ekind
->tcstat
[i
];
728 tcstat
->vscale_nhc
= scalefac
[i
];
729 tcstat
->ekinscaleh_nhc
*= (scalefac
[i
]*scalefac
[i
]);
730 tcstat
->ekinscalef_nhc
*= (scalefac
[i
]*scalefac
[i
]);
732 /* now that we've scaled the groupwise velocities, we can add them up to get the total */
733 /* but do we actually need the total? */
735 /* modify the velocities as well */
736 for (n
=md
->start
;n
<md
->start
+md
->homenr
;n
++)
744 state
->v
[n
][d
] *= scalefac
[gc
];
751 sumv
[d
] += (state
->v
[n
][d
])/md
->invmass
[n
];
760 /* check for conserved momentum -- worth looking at this again eventually, but not working right now.*/
768 consk
[d
] = sumv
[d
]*exp((1 + 1.0/opts
->nrdf
[0])*((1.0/DIM
)*log(det(state
->box
)/state
->vol0
)) + state
->nosehoover_xi
[0]);
770 fprintf(debug
,"Conserved kappa: %15.8f %15.8f %15.8f\n",consk
[0],consk
[1],consk
[2]);
777 int **init_npt_vars(t_inputrec
*ir
, t_state
*state
, t_extmass
*MassQ
, gmx_bool bTrotter
)
779 int n
,i
,j
,d
,ntgrp
,ngtc
,nnhpres
,nh
,gc
=0;
780 t_grp_tcstat
*tcstat
;
782 real ecorr
,pcorr
,dvdlcorr
;
783 real bmass
,qmass
,reft
,kT
,dt
,ndj
,nd
;
784 tensor dumpres
,dumvir
;
787 opts
= &(ir
->opts
); /* just for ease of referencing */
789 nnhpres
= state
->nnhpres
;
790 nh
= state
->nhchainlength
;
792 if (ir
->eI
== eiMD
) {
793 snew(MassQ
->Qinv
,ngtc
);
794 for(i
=0; (i
<ngtc
); i
++)
796 if ((opts
->tau_t
[i
] > 0) && (opts
->ref_t
[i
] > 0))
798 MassQ
->Qinv
[i
]=1.0/(sqr(opts
->tau_t
[i
]/M_2PI
)*opts
->ref_t
[i
]);
806 else if (EI_VV(ir
->eI
))
808 /* Set pressure variables */
810 if (state
->vol0
== 0)
812 state
->vol0
= det(state
->box
); /* because we start by defining a fixed compressibility,
813 we need the volume at this compressibility to solve the problem */
816 /* units are nm^3 * ns^2 / (nm^3 * bar / kJ/mol) = kJ/mol */
817 /* Investigate this more -- is this the right mass to make it? */
818 MassQ
->Winv
= (PRESFAC
*trace(ir
->compress
)*BOLTZ
*opts
->ref_t
[0])/(DIM
*state
->vol0
*sqr(ir
->tau_p
/M_2PI
));
819 /* An alternate mass definition, from Tuckerman et al. */
820 /* MassQ->Winv = 1.0/(sqr(ir->tau_p/M_2PI)*(opts->nrdf[0]+DIM)*BOLTZ*opts->ref_t[0]); */
825 MassQ
->Winvm
[d
][n
]= PRESFAC
*ir
->compress
[d
][n
]/(state
->vol0
*sqr(ir
->tau_p
/M_2PI
));
826 /* not clear this is correct yet for the anisotropic case*/
829 /* Allocate space for thermostat variables */
830 snew(MassQ
->Qinv
,ngtc
*nh
);
832 /* now, set temperature variables */
833 for(i
=0; i
<ngtc
; i
++)
835 if ((opts
->tau_t
[i
] > 0) && (opts
->ref_t
[i
] > 0))
837 reft
= max(0.0,opts
->ref_t
[i
]);
850 MassQ
->Qinv
[i
*nh
+j
] = 1.0/(sqr(opts
->tau_t
[i
]/M_2PI
)*ndj
*kT
);
858 MassQ
->Qinv
[i
*nh
+j
] = 0.0;
864 /* first, initialize clear all the trotter calls */
865 snew(trotter_seq
,ettTSEQMAX
);
866 for (i
=0;i
<ettTSEQMAX
;i
++)
868 snew(trotter_seq
[i
],NTROTTERPARTS
);
869 for (j
=0;j
<NTROTTERPARTS
;j
++) {
870 trotter_seq
[i
][j
] = etrtNONE
;
872 trotter_seq
[i
][0] = etrtSKIPALL
;
877 /* no trotter calls, so we never use the values in the array.
878 * We access them (so we need to define them, but ignore
884 /* compute the kinetic energy by using the half step velocities or
885 * the kinetic energies, depending on the order of the trotter calls */
889 if (IR_NPT_TROTTER(ir
))
891 /* This is the complicated version - there are 4 possible calls, depending on ordering.
892 We start with the initial one. */
893 /* first, a round that estimates veta. */
894 trotter_seq
[0][0] = etrtBAROV
;
896 /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
898 /* The first half trotter update */
899 trotter_seq
[2][0] = etrtBAROV
;
900 trotter_seq
[2][1] = etrtNHC
;
901 trotter_seq
[2][2] = etrtBARONHC
;
903 /* The second half trotter update */
904 trotter_seq
[3][0] = etrtBARONHC
;
905 trotter_seq
[3][1] = etrtNHC
;
906 trotter_seq
[3][2] = etrtBAROV
;
908 /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
913 if (IR_NVT_TROTTER(ir
))
915 /* This is the easy version - there are only two calls, both the same.
916 Otherwise, even easier -- no calls */
917 trotter_seq
[2][0] = etrtNHC
;
918 trotter_seq
[3][0] = etrtNHC
;
921 } else if (ir
->eI
==eiVVAK
) {
922 if (IR_NPT_TROTTER(ir
))
924 /* This is the complicated version - there are 4 possible calls, depending on ordering.
925 We start with the initial one. */
926 /* first, a round that estimates veta. */
927 trotter_seq
[0][0] = etrtBAROV
;
929 /* The first half trotter update, part 1 -- double update, because it commutes */
930 trotter_seq
[1][0] = etrtNHC
;
932 /* The first half trotter update, part 2 */
933 trotter_seq
[2][0] = etrtBAROV
;
934 trotter_seq
[2][1] = etrtBARONHC
;
936 /* The second half trotter update, part 1 */
937 trotter_seq
[3][0] = etrtBARONHC
;
938 trotter_seq
[3][1] = etrtBAROV
;
940 /* The second half trotter update -- blank for now */
941 trotter_seq
[4][0] = etrtNHC
;
945 if (IR_NVT_TROTTER(ir
))
947 /* This is the easy version - there is only one call, both the same.
948 Otherwise, even easier -- no calls */
949 trotter_seq
[1][0] = etrtNHC
;
950 trotter_seq
[4][0] = etrtNHC
;
959 bmass
= DIM
*DIM
; /* recommended mass parameters for isotropic barostat */
962 snew(MassQ
->QPinv
,nnhpres
*opts
->nhchainlength
);
964 /* barostat temperature */
965 if ((ir
->tau_p
> 0) && (opts
->ref_t
[0] > 0))
967 reft
= max(0.0,opts
->ref_t
[0]);
969 for (i
=0;i
<nnhpres
;i
++) {
979 MassQ
->QPinv
[i
*opts
->nhchainlength
+j
] = 1.0/(sqr(opts
->tau_t
[0]/M_2PI
)*qmass
*kT
);
985 for (i
=0;i
<nnhpres
;i
++) {
988 MassQ
->QPinv
[i
*nh
+j
]=0.0;
995 real
NPT_energy(t_inputrec
*ir
, t_state
*state
, t_extmass
*MassQ
)
997 int i
,j
,nd
,ndj
,bmass
,qmass
,ngtcall
;
998 real ener_npt
,reft
,eta
,kT
,tau
;
1002 int nh
= state
->nhchainlength
;
1006 /* now we compute the contribution of the pressure to the conserved quantity*/
1008 if (ir
->epc
==epcMTTK
)
1010 /* find the volume, and the kinetic energy of the volume */
1015 /* contribution from the pressure momenenta */
1016 ener_npt
+= 0.5*sqr(state
->veta
)/MassQ
->Winv
;
1018 /* contribution from the PV term */
1019 vol
= det(state
->box
);
1020 ener_npt
+= vol
*trace(ir
->ref_p
)/(DIM
*PRESFAC
);
1023 case epctANISOTROPIC
:
1027 case epctSURFACETENSION
:
1030 case epctSEMIISOTROPIC
:
1038 if (IR_NPT_TROTTER(ir
))
1040 /* add the energy from the barostat thermostat chain */
1041 for (i
=0;i
<state
->nnhpres
;i
++) {
1043 /* note -- assumes only one degree of freedom that is thermostatted in barostat */
1044 ivxi
= &state
->nhpres_vxi
[i
*nh
];
1045 ixi
= &state
->nhpres_xi
[i
*nh
];
1046 iQinv
= &(MassQ
->QPinv
[i
*nh
]);
1047 reft
= max(ir
->opts
.ref_t
[0],0); /* using 'System' temperature */
1054 ener_npt
+= 0.5*sqr(ivxi
[j
])/iQinv
[j
];
1055 /* contribution from the thermal variable of the NH chain */
1056 ener_npt
+= ixi
[j
]*kT
;
1060 fprintf(debug
,"P-T-group: %10d Chain %4d ThermV: %15.8f ThermX: %15.8f",i
,j
,ivxi
[j
],ixi
[j
]);
1068 for(i
=0; i
<ir
->opts
.ngtc
; i
++)
1070 ixi
= &state
->nosehoover_xi
[i
*nh
];
1071 ivxi
= &state
->nosehoover_vxi
[i
*nh
];
1072 iQinv
= &(MassQ
->Qinv
[i
*nh
]);
1074 nd
= ir
->opts
.nrdf
[i
];
1075 reft
= max(ir
->opts
.ref_t
[i
],0);
1080 if (IR_NVT_TROTTER(ir
))
1082 /* contribution from the thermal momenta of the NH chain */
1086 ener_npt
+= 0.5*sqr(ivxi
[j
])/iQinv
[j
];
1087 /* contribution from the thermal variable of the NH chain */
1095 ener_npt
+= ndj
*ixi
[j
]*kT
;
1099 else /* Other non Trotter temperature NH control -- no chains yet. */
1101 ener_npt
+= 0.5*BOLTZ
*nd
*sqr(ivxi
[0])/iQinv
[0];
1102 ener_npt
+= nd
*ixi
[0]*kT
;
1110 static real
vrescale_gamdev(int ia
, gmx_rng_t rng
)
1111 /* Gamma distribution, adapted from numerical recipes */
1114 real am
,e
,s
,v1
,v2
,x
,y
;
1121 for(j
=1; j
<=ia
; j
++)
1123 x
*= gmx_rng_uniform_real(rng
);
1137 v1
= gmx_rng_uniform_real(rng
);
1138 v2
= 2.0*gmx_rng_uniform_real(rng
)-1.0;
1140 while (v1
*v1
+ v2
*v2
> 1.0 ||
1141 v1
*v1
*GMX_REAL_MAX
< 3.0*ia
);
1142 /* The last check above ensures that both x (3.0 > 2.0 in s)
1143 * and the pre-factor for e do not go out of range.
1147 s
= sqrt(2.0*am
+ 1.0);
1151 e
= (1.0 + y
*y
)*exp(am
*log(x
/am
) - s
*y
);
1153 while (gmx_rng_uniform_real(rng
) > e
);
1159 static real
vrescale_sumnoises(int nn
,gmx_rng_t rng
)
1162 * Returns the sum of n independent gaussian noises squared
1163 * (i.e. equivalent to summing the square of the return values
1164 * of nn calls to gmx_rng_gaussian_real).xs
1170 } else if (nn
== 1) {
1171 rr
= gmx_rng_gaussian_real(rng
);
1173 } else if (nn
% 2 == 0) {
1174 return 2.0*vrescale_gamdev(nn
/2,rng
);
1176 rr
= gmx_rng_gaussian_real(rng
);
1177 return 2.0*vrescale_gamdev((nn
-1)/2,rng
) + rr
*rr
;
1181 static real
vrescale_resamplekin(real kk
,real sigma
, int ndeg
, real taut
,
1185 * Generates a new value for the kinetic energy,
1186 * according to Bussi et al JCP (2007), Eq. (A7)
1187 * kk: present value of the kinetic energy of the atoms to be thermalized (in arbitrary units)
1188 * sigma: target average value of the kinetic energy (ndeg k_b T/2) (in the same units as kk)
1189 * ndeg: number of degrees of freedom of the atoms to be thermalized
1190 * taut: relaxation time of the thermostat, in units of 'how often this routine is called'
1195 factor
= exp(-1.0/taut
);
1199 rr
= gmx_rng_gaussian_real(rng
);
1202 (1.0 - factor
)*(sigma
*(vrescale_sumnoises(ndeg
-1,rng
) + rr
*rr
)/ndeg
- kk
) +
1203 2.0*rr
*sqrt(kk
*sigma
/ndeg
*(1.0 - factor
)*factor
);
1206 void vrescale_tcoupl(t_inputrec
*ir
,gmx_ekindata_t
*ekind
,real dt
,
1207 double therm_integral
[],gmx_rng_t rng
)
1211 real Ek
,Ek_ref1
,Ek_ref
,Ek_new
;
1215 for(i
=0; (i
<opts
->ngtc
); i
++)
1219 Ek
= trace(ekind
->tcstat
[i
].ekinf
);
1223 Ek
= trace(ekind
->tcstat
[i
].ekinh
);
1226 if (opts
->tau_t
[i
] >= 0 && opts
->nrdf
[i
] > 0 && Ek
> 0)
1228 Ek_ref1
= 0.5*opts
->ref_t
[i
]*BOLTZ
;
1229 Ek_ref
= Ek_ref1
*opts
->nrdf
[i
];
1231 Ek_new
= vrescale_resamplekin(Ek
,Ek_ref
,opts
->nrdf
[i
],
1232 opts
->tau_t
[i
]/dt
,rng
);
1234 /* Analytically Ek_new>=0, but we check for rounding errors */
1237 ekind
->tcstat
[i
].lambda
= 0.0;
1241 ekind
->tcstat
[i
].lambda
= sqrt(Ek_new
/Ek
);
1244 therm_integral
[i
] -= Ek_new
- Ek
;
1248 fprintf(debug
,"TC: group %d: Ekr %g, Ek %g, Ek_new %g, Lambda: %g\n",
1249 i
,Ek_ref
,Ek
,Ek_new
,ekind
->tcstat
[i
].lambda
);
1254 ekind
->tcstat
[i
].lambda
= 1.0;
1259 real
vrescale_energy(t_grpopts
*opts
,double therm_integral
[])
1265 for(i
=0; i
<opts
->ngtc
; i
++) {
1266 ener
+= therm_integral
[i
];
1272 void rescale_velocities(gmx_ekindata_t
*ekind
,t_mdatoms
*mdatoms
,
1273 int start
,int end
,rvec v
[])
1276 t_grp_tcstat
*tcstat
;
1277 unsigned short *cACC
,*cTC
;
1282 tcstat
= ekind
->tcstat
;
1287 gstat
= ekind
->grpstat
;
1288 cACC
= mdatoms
->cACC
;
1292 for(n
=start
; n
<end
; n
++)
1302 /* Only scale the velocity component relative to the COM velocity */
1303 rvec_sub(v
[n
],gstat
[ga
].u
,vrel
);
1304 lg
= tcstat
[gt
].lambda
;
1305 for(d
=0; d
<DIM
; d
++)
1307 v
[n
][d
] = gstat
[ga
].u
[d
] + lg
*vrel
[d
];
1314 for(n
=start
; n
<end
; n
++)
1320 lg
= tcstat
[gt
].lambda
;
1321 for(d
=0; d
<DIM
; d
++)
1330 /* set target temperatures if we are annealing */
1331 void update_annealing_target_temp(t_grpopts
*opts
,real t
)
1334 real pert
,thist
=0,x
;
1336 for(i
=0;i
<opts
->ngtc
;i
++) {
1337 npoints
= opts
->anneal_npoints
[i
];
1338 switch (opts
->annealing
[i
]) {
1342 /* calculate time modulo the period */
1343 pert
= opts
->anneal_time
[i
][npoints
-1];
1345 thist
= t
- n
*pert
; /* modulo time */
1346 /* Make sure rounding didn't get us outside the interval */
1347 if (fabs(thist
-pert
) < GMX_REAL_EPS
*100)
1354 gmx_fatal(FARGS
,"Death horror in update_annealing_target_temp (i=%d/%d npoints=%d)",i
,opts
->ngtc
,npoints
);
1356 /* We are doing annealing for this group if we got here,
1357 * and we have the (relative) time as thist.
1358 * calculate target temp */
1360 while ((j
< npoints
-1) && (thist
>(opts
->anneal_time
[i
][j
+1])))
1362 if (j
< npoints
-1) {
1363 /* Found our position between points j and j+1.
1364 * Interpolate: x is the amount from j+1, (1-x) from point j
1365 * First treat possible jumps in temperature as a special case.
1367 if ((opts
->anneal_time
[i
][j
+1]-opts
->anneal_time
[i
][j
]) < GMX_REAL_EPS
*100)
1368 opts
->ref_t
[i
]=opts
->anneal_temp
[i
][j
+1];
1370 x
= ((thist
-opts
->anneal_time
[i
][j
])/
1371 (opts
->anneal_time
[i
][j
+1]-opts
->anneal_time
[i
][j
]));
1372 opts
->ref_t
[i
] = x
*opts
->anneal_temp
[i
][j
+1]+(1-x
)*opts
->anneal_temp
[i
][j
];
1376 opts
->ref_t
[i
] = opts
->anneal_temp
[i
][npoints
-1];