2 * This file is part of the GROMACS molecular simulation package.
4 * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
5 * Copyright (c) 2001-2004, The GROMACS development team.
6 * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
7 * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
8 * and including many others, as listed in the AUTHORS file in the
9 * top-level source directory and at http://www.gromacs.org.
11 * GROMACS is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public License
13 * as published by the Free Software Foundation; either version 2.1
14 * of the License, or (at your option) any later version.
16 * GROMACS is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with GROMACS; if not, see
23 * http://www.gnu.org/licenses, or write to the Free Software Foundation,
24 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
26 * If you want to redistribute modifications to GROMACS, please
27 * consider that scientific software is very special. Version
28 * control is crucial - bugs must be traceable. We will be happy to
29 * consider code for inclusion in the official distribution, but
30 * derived work must not be called official GROMACS. Details are found
31 * in the README & COPYING files - if they are missing, get the
32 * official version at http://www.gromacs.org.
34 * To help us fund GROMACS development, we humbly ask that you cite
35 * the research papers on the package. Check out http://www.gromacs.org.
43 #include "gromacs/legacyheaders/gmx_omp_nthreads.h"
44 #include "gromacs/legacyheaders/macros.h"
45 #include "gromacs/legacyheaders/mdrun.h"
46 #include "gromacs/legacyheaders/names.h"
47 #include "gromacs/legacyheaders/nrnb.h"
48 #include "gromacs/legacyheaders/txtdump.h"
49 #include "gromacs/legacyheaders/typedefs.h"
50 #include "gromacs/legacyheaders/update.h"
51 #include "gromacs/legacyheaders/types/commrec.h"
52 #include "gromacs/math/units.h"
53 #include "gromacs/math/vec.h"
54 #include "gromacs/random/random.h"
55 #include "gromacs/utility/fatalerror.h"
56 #include "gromacs/utility/smalloc.h"
58 #define NTROTTERPARTS 3
60 /* Suzuki-Yoshida Constants, for n=3 and n=5, for symplectic integration */
62 /* for n=3, w0 = w2 = 1/(2-2^-(1/3)), w1 = 1-2*w0 */
63 /* for n=5, w0 = w1 = w3 = w4 = 1/(4-4^-(1/3)), w1 = 1-4*w0 */
65 #define MAX_SUZUKI_YOSHIDA_NUM 5
66 #define SUZUKI_YOSHIDA_NUM 5
68 static const double sy_const_1[] = { 1. };
69 static const double sy_const_3[] = { 0.828981543588751, -0.657963087177502, 0.828981543588751 };
70 static const double sy_const_5[] = { 0.2967324292201065, 0.2967324292201065, -0.186929716880426, 0.2967324292201065, 0.2967324292201065 };
72 static const double* sy_const[] = {
82 static const double sy_const[MAX_SUZUKI_YOSHIDA_NUM+1][MAX_SUZUKI_YOSHIDA_NUM+1] = {
86 {0.828981543588751,-0.657963087177502,0.828981543588751},
88 {0.2967324292201065,0.2967324292201065,-0.186929716880426,0.2967324292201065,0.2967324292201065}
91 /* these integration routines are only referenced inside this file */
92 static void NHC_trotter(t_grpopts *opts, int nvar, gmx_ekindata_t *ekind, real dtfull,
93 double xi[], double vxi[], double scalefac[], real *veta, t_extmass *MassQ, gmx_bool bEkinAveVel)
96 /* general routine for both barostat and thermostat nose hoover chains */
99 double Ekin, Efac, reft, kT, nd;
101 t_grp_tcstat *tcstat;
106 int mstepsi, mstepsj;
107 int ns = SUZUKI_YOSHIDA_NUM; /* set the degree of integration in the types/state.h file */
108 int nh = opts->nhchainlength;
111 mstepsi = mstepsj = ns;
113 /* if scalefac is NULL, we are doing the NHC of the barostat */
116 if (scalefac == NULL)
121 for (i = 0; i < nvar; i++)
124 /* make it easier to iterate by selecting
125 out the sub-array that corresponds to this T group */
131 iQinv = &(MassQ->QPinv[i*nh]);
132 nd = 1.0; /* THIS WILL CHANGE IF NOT ISOTROPIC */
133 reft = std::max<real>(0, opts->ref_t[0]);
134 Ekin = sqr(*veta)/MassQ->Winv;
138 iQinv = &(MassQ->Qinv[i*nh]);
139 tcstat = &ekind->tcstat[i];
141 reft = std::max<real>(0, opts->ref_t[i]);
144 Ekin = 2*trace(tcstat->ekinf)*tcstat->ekinscalef_nhc;
148 Ekin = 2*trace(tcstat->ekinh)*tcstat->ekinscaleh_nhc;
153 for (mi = 0; mi < mstepsi; mi++)
155 for (mj = 0; mj < mstepsj; mj++)
157 /* weighting for this step using Suzuki-Yoshida integration - fixed at 5 */
158 dt = sy_const[ns][mj] * dtfull / mstepsi;
160 /* compute the thermal forces */
161 GQ[0] = iQinv[0]*(Ekin - nd*kT);
163 for (j = 0; j < nh-1; j++)
167 /* we actually don't need to update here if we save the
168 state of the GQ, but it's easier to just recompute*/
169 GQ[j+1] = iQinv[j+1]*((sqr(ivxi[j])/iQinv[j])-kT);
177 ivxi[nh-1] += 0.25*dt*GQ[nh-1];
178 for (j = nh-1; j > 0; j--)
180 Efac = exp(-0.125*dt*ivxi[j]);
181 ivxi[j-1] = Efac*(ivxi[j-1]*Efac + 0.25*dt*GQ[j-1]);
184 Efac = exp(-0.5*dt*ivxi[0]);
195 /* Issue - if the KE is an average of the last and the current temperatures, then we might not be
196 able to scale the kinetic energy directly with this factor. Might take more bookkeeping -- have to
197 think about this a bit more . . . */
199 GQ[0] = iQinv[0]*(Ekin - nd*kT);
201 /* update thermostat positions */
202 for (j = 0; j < nh; j++)
204 ixi[j] += 0.5*dt*ivxi[j];
207 for (j = 0; j < nh-1; j++)
209 Efac = exp(-0.125*dt*ivxi[j+1]);
210 ivxi[j] = Efac*(ivxi[j]*Efac + 0.25*dt*GQ[j]);
213 GQ[j+1] = iQinv[j+1]*((sqr(ivxi[j])/iQinv[j])-kT);
220 ivxi[nh-1] += 0.25*dt*GQ[nh-1];
227 static void boxv_trotter(t_inputrec *ir, real *veta, real dt, tensor box,
228 gmx_ekindata_t *ekind, tensor vir, real pcorr, t_extmass *MassQ)
235 tensor ekinmod, localpres;
237 /* The heat bath is coupled to a separate barostat, the last temperature group. In the
238 2006 Tuckerman et al paper., the order is iL_{T_baro} iL {T_part}
241 if (ir->epct == epctSEMIISOTROPIC)
250 /* eta is in pure units. veta is in units of ps^-1. GW is in
251 units of ps^-2. However, eta has a reference of 1 nm^3, so care must be
252 taken to use only RATIOS of eta in updating the volume. */
254 /* we take the partial pressure tensors, modify the
255 kinetic energy tensor, and recovert to pressure */
257 if (ir->opts.nrdf[0] == 0)
259 gmx_fatal(FARGS, "Barostat is coupled to a T-group with no degrees of freedom\n");
261 /* alpha factor for phase space volume, then multiply by the ekin scaling factor. */
262 alpha = 1.0 + DIM/((double)ir->opts.nrdf[0]);
263 alpha *= ekind->tcstat[0].ekinscalef_nhc;
264 msmul(ekind->ekin, alpha, ekinmod);
265 /* for now, we use Elr = 0, because if you want to get it right, you
266 really should be using PME. Maybe print a warning? */
268 pscal = calc_pres(ir->ePBC, nwall, box, ekinmod, vir, localpres)+pcorr;
271 GW = (vol*(MassQ->Winv/PRESFAC))*(DIM*pscal - trace(ir->ref_p)); /* W is in ps^2 * bar * nm^3 */
277 * This file implements temperature and pressure coupling algorithms:
278 * For now only the Weak coupling and the modified weak coupling.
280 * Furthermore computation of pressure and temperature is done here
284 real calc_pres(int ePBC, int nwall, matrix box, tensor ekin, tensor vir,
290 if (ePBC == epbcNONE || (ePBC == epbcXY && nwall != 2))
296 /* Uitzoeken welke ekin hier van toepassing is, zie Evans & Morris - E.
297 * Wrs. moet de druktensor gecorrigeerd worden voor de netto stroom in
301 fac = PRESFAC*2.0/det(box);
302 for (n = 0; (n < DIM); n++)
304 for (m = 0; (m < DIM); m++)
306 pres[n][m] = (ekin[n][m] - vir[n][m])*fac;
312 pr_rvecs(debug, 0, "PC: pres", pres, DIM);
313 pr_rvecs(debug, 0, "PC: ekin", ekin, DIM);
314 pr_rvecs(debug, 0, "PC: vir ", vir, DIM);
315 pr_rvecs(debug, 0, "PC: box ", box, DIM);
318 return trace(pres)/DIM;
321 real calc_temp(real ekin, real nrdf)
325 return (2.0*ekin)/(nrdf*BOLTZ);
333 void parrinellorahman_pcoupl(FILE *fplog, gmx_int64_t step,
334 t_inputrec *ir, real dt, tensor pres,
335 tensor box, tensor box_rel, tensor boxv,
336 tensor M, matrix mu, gmx_bool bFirstStep)
338 /* This doesn't do any coordinate updating. It just
339 * integrates the box vector equations from the calculated
340 * acceleration due to pressure difference. We also compute
341 * the tensor M which is used in update to couple the particle
342 * coordinates to the box vectors.
344 * In Nose and Klein (Mol.Phys 50 (1983) no 5., p 1055) this is
347 * M_nk = (h') * (h' * h + h' h) * h
349 * with the dots denoting time derivatives and h is the transformation from
350 * the scaled frame to the real frame, i.e. the TRANSPOSE of the box.
351 * This also goes for the pressure and M tensors - they are transposed relative
352 * to ours. Our equation thus becomes:
355 * M_gmx = M_nk' = b * (b * b' + b * b') * b'
357 * where b is the gromacs box matrix.
358 * Our box accelerations are given by
360 * b = vol/W inv(box') * (P-ref_P) (=h')
365 real vol = box[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
366 real atot, arel, change, maxchange, xy_pressure;
367 tensor invbox, pdiff, t1, t2;
371 m_inv_ur0(box, invbox);
375 /* Note that PRESFAC does not occur here.
376 * The pressure and compressibility always occur as a product,
377 * therefore the pressure unit drops out.
379 maxl = std::max(box[XX][XX], box[YY][YY]);
380 maxl = std::max(maxl, box[ZZ][ZZ]);
381 for (d = 0; d < DIM; d++)
383 for (n = 0; n < DIM; n++)
386 (4*M_PI*M_PI*ir->compress[d][n])/(3*ir->tau_p*ir->tau_p*maxl);
390 m_sub(pres, ir->ref_p, pdiff);
392 if (ir->epct == epctSURFACETENSION)
394 /* Unlike Berendsen coupling it might not be trivial to include a z
395 * pressure correction here? On the other hand we don't scale the
396 * box momentarily, but change accelerations, so it might not be crucial.
398 xy_pressure = 0.5*(pres[XX][XX]+pres[YY][YY]);
399 for (d = 0; d < ZZ; d++)
401 pdiff[d][d] = (xy_pressure-(pres[ZZ][ZZ]-ir->ref_p[d][d]/box[d][d]));
405 tmmul(invbox, pdiff, t1);
406 /* Move the off-diagonal elements of the 'force' to one side to ensure
407 * that we obey the box constraints.
409 for (d = 0; d < DIM; d++)
411 for (n = 0; n < d; n++)
413 t1[d][n] += t1[n][d];
420 case epctANISOTROPIC:
421 for (d = 0; d < DIM; d++)
423 for (n = 0; n <= d; n++)
425 t1[d][n] *= winv[d][n]*vol;
430 /* calculate total volume acceleration */
431 atot = box[XX][XX]*box[YY][YY]*t1[ZZ][ZZ]+
432 box[XX][XX]*t1[YY][YY]*box[ZZ][ZZ]+
433 t1[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
435 /* set all RELATIVE box accelerations equal, and maintain total V
437 for (d = 0; d < DIM; d++)
439 for (n = 0; n <= d; n++)
441 t1[d][n] = winv[0][0]*vol*arel*box[d][n];
445 case epctSEMIISOTROPIC:
446 case epctSURFACETENSION:
447 /* Note the correction to pdiff above for surftens. coupling */
449 /* calculate total XY volume acceleration */
450 atot = box[XX][XX]*t1[YY][YY]+t1[XX][XX]*box[YY][YY];
451 arel = atot/(2*box[XX][XX]*box[YY][YY]);
452 /* set RELATIVE XY box accelerations equal, and maintain total V
453 * change speed. Dont change the third box vector accelerations */
454 for (d = 0; d < ZZ; d++)
456 for (n = 0; n <= d; n++)
458 t1[d][n] = winv[d][n]*vol*arel*box[d][n];
461 for (n = 0; n < DIM; n++)
463 t1[ZZ][n] *= winv[d][n]*vol;
467 gmx_fatal(FARGS, "Parrinello-Rahman pressure coupling type %s "
468 "not supported yet\n", EPCOUPLTYPETYPE(ir->epct));
473 for (d = 0; d < DIM; d++)
475 for (n = 0; n <= d; n++)
477 boxv[d][n] += dt*t1[d][n];
479 /* We do NOT update the box vectors themselves here, since
480 * we need them for shifting later. It is instead done last
481 * in the update() routine.
484 /* Calculate the change relative to diagonal elements-
485 since it's perfectly ok for the off-diagonal ones to
486 be zero it doesn't make sense to check the change relative
490 change = fabs(dt*boxv[d][n]/box[d][d]);
492 if (change > maxchange)
499 if (maxchange > 0.01 && fplog)
503 "\nStep %s Warning: Pressure scaling more than 1%%. "
504 "This may mean your system\n is not yet equilibrated. "
505 "Use of Parrinello-Rahman pressure coupling during\n"
506 "equilibration can lead to simulation instability, "
507 "and is discouraged.\n",
508 gmx_step_str(step, buf));
512 preserve_box_shape(ir, box_rel, boxv);
514 mtmul(boxv, box, t1); /* t1=boxv * b' */
515 mmul(invbox, t1, t2);
516 mtmul(t2, invbox, M);
518 /* Determine the scaling matrix mu for the coordinates */
519 for (d = 0; d < DIM; d++)
521 for (n = 0; n <= d; n++)
523 t1[d][n] = box[d][n] + dt*boxv[d][n];
526 preserve_box_shape(ir, box_rel, t1);
527 /* t1 is the box at t+dt, determine mu as the relative change */
528 mmul_ur0(invbox, t1, mu);
531 void berendsen_pcoupl(FILE *fplog, gmx_int64_t step,
532 t_inputrec *ir, real dt, tensor pres, matrix box,
536 real scalar_pressure, xy_pressure, p_corr_z;
540 * Calculate the scaling matrix mu
544 for (d = 0; d < DIM; d++)
546 scalar_pressure += pres[d][d]/DIM;
549 xy_pressure += pres[d][d]/(DIM-1);
552 /* Pressure is now in bar, everywhere. */
553 #define factor(d, m) (ir->compress[d][m]*dt/ir->tau_p)
555 /* mu has been changed from pow(1+...,1/3) to 1+.../3, since this is
556 * necessary for triclinic scaling
562 for (d = 0; d < DIM; d++)
564 mu[d][d] = 1.0 - factor(d, d)*(ir->ref_p[d][d] - scalar_pressure) /DIM;
567 case epctSEMIISOTROPIC:
568 for (d = 0; d < ZZ; d++)
570 mu[d][d] = 1.0 - factor(d, d)*(ir->ref_p[d][d]-xy_pressure)/DIM;
573 1.0 - factor(ZZ, ZZ)*(ir->ref_p[ZZ][ZZ] - pres[ZZ][ZZ])/DIM;
575 case epctANISOTROPIC:
576 for (d = 0; d < DIM; d++)
578 for (n = 0; n < DIM; n++)
580 mu[d][n] = (d == n ? 1.0 : 0.0)
581 -factor(d, n)*(ir->ref_p[d][n] - pres[d][n])/DIM;
585 case epctSURFACETENSION:
586 /* ir->ref_p[0/1] is the reference surface-tension times *
587 * the number of surfaces */
588 if (ir->compress[ZZ][ZZ])
590 p_corr_z = dt/ir->tau_p*(ir->ref_p[ZZ][ZZ] - pres[ZZ][ZZ]);
594 /* when the compressibity is zero, set the pressure correction *
595 * in the z-direction to zero to get the correct surface tension */
598 mu[ZZ][ZZ] = 1.0 - ir->compress[ZZ][ZZ]*p_corr_z;
599 for (d = 0; d < DIM-1; d++)
601 mu[d][d] = 1.0 + factor(d, d)*(ir->ref_p[d][d]/(mu[ZZ][ZZ]*box[ZZ][ZZ])
602 - (pres[ZZ][ZZ]+p_corr_z - xy_pressure))/(DIM-1);
606 gmx_fatal(FARGS, "Berendsen pressure coupling type %s not supported yet\n",
607 EPCOUPLTYPETYPE(ir->epct));
610 /* To fullfill the orientation restrictions on triclinic boxes
611 * we will set mu_yx, mu_zx and mu_zy to 0 and correct
612 * the other elements of mu to first order.
614 mu[YY][XX] += mu[XX][YY];
615 mu[ZZ][XX] += mu[XX][ZZ];
616 mu[ZZ][YY] += mu[YY][ZZ];
623 pr_rvecs(debug, 0, "PC: pres ", pres, 3);
624 pr_rvecs(debug, 0, "PC: mu ", mu, 3);
627 if (mu[XX][XX] < 0.99 || mu[XX][XX] > 1.01 ||
628 mu[YY][YY] < 0.99 || mu[YY][YY] > 1.01 ||
629 mu[ZZ][ZZ] < 0.99 || mu[ZZ][ZZ] > 1.01)
632 sprintf(buf, "\nStep %s Warning: pressure scaling more than 1%%, "
634 gmx_step_str(step, buf2), mu[XX][XX], mu[YY][YY], mu[ZZ][ZZ]);
637 fprintf(fplog, "%s", buf);
639 fprintf(stderr, "%s", buf);
643 void berendsen_pscale(t_inputrec *ir, matrix mu,
644 matrix box, matrix box_rel,
645 int start, int nr_atoms,
646 rvec x[], unsigned short cFREEZE[],
649 ivec *nFreeze = ir->opts.nFreeze;
651 int nthreads gmx_unused;
653 #ifndef __clang_analyzer__
654 // cppcheck-suppress unreadVariable
655 nthreads = gmx_omp_nthreads_get(emntUpdate);
658 /* Scale the positions */
659 #pragma omp parallel for num_threads(nthreads) schedule(static)
660 for (n = start; n < start+nr_atoms; n++)
675 x[n][XX] = mu[XX][XX]*x[n][XX]+mu[YY][XX]*x[n][YY]+mu[ZZ][XX]*x[n][ZZ];
679 x[n][YY] = mu[YY][YY]*x[n][YY]+mu[ZZ][YY]*x[n][ZZ];
683 x[n][ZZ] = mu[ZZ][ZZ]*x[n][ZZ];
686 /* compute final boxlengths */
687 for (d = 0; d < DIM; d++)
689 box[d][XX] = mu[XX][XX]*box[d][XX]+mu[YY][XX]*box[d][YY]+mu[ZZ][XX]*box[d][ZZ];
690 box[d][YY] = mu[YY][YY]*box[d][YY]+mu[ZZ][YY]*box[d][ZZ];
691 box[d][ZZ] = mu[ZZ][ZZ]*box[d][ZZ];
694 preserve_box_shape(ir, box_rel, box);
696 /* (un)shifting should NOT be done after this,
697 * since the box vectors might have changed
699 inc_nrnb(nrnb, eNR_PCOUPL, nr_atoms);
702 void berendsen_tcoupl(t_inputrec *ir, gmx_ekindata_t *ekind, real dt)
706 real T, reft = 0, lll;
710 for (i = 0; (i < opts->ngtc); i++)
714 T = ekind->tcstat[i].T;
718 T = ekind->tcstat[i].Th;
721 if ((opts->tau_t[i] > 0) && (T > 0.0))
723 reft = std::max<real>(0, opts->ref_t[i]);
724 lll = sqrt(1.0 + (dt/opts->tau_t[i])*(reft/T-1.0));
725 ekind->tcstat[i].lambda = std::max<real>(std::min<real>(lll, 1.25), 0.8);
729 ekind->tcstat[i].lambda = 1.0;
734 fprintf(debug, "TC: group %d: T: %g, Lambda: %g\n",
735 i, T, ekind->tcstat[i].lambda);
740 void andersen_tcoupl(t_inputrec *ir, gmx_int64_t step,
741 const t_commrec *cr, const t_mdatoms *md, t_state *state, real rate, const gmx_bool *randomize, const real *boltzfac)
743 const int *gatindex = (DOMAINDECOMP(cr) ? cr->dd->gatindex : NULL);
747 /* randomize the velocities of the selected particles */
749 for (i = 0; i < md->homenr; i++) /* now loop over the list of atoms */
751 int ng = gatindex ? gatindex[i] : i;
756 gc = md->cTC[i]; /* assign the atom to a temperature group if there are more than one */
760 if (ir->etc == etcANDERSEN)
768 gmx_rng_cycle_2uniform(step*2, ng, ir->andersen_seed, RND_SEED_ANDERSEN, uniform);
769 bRandomize = (uniform[0] < rate);
776 scal = sqrt(boltzfac[gc]*md->invmass[i]);
777 gmx_rng_cycle_3gaussian_table(step*2+1, ng, ir->andersen_seed, RND_SEED_ANDERSEN, gauss);
778 for (d = 0; d < DIM; d++)
780 state->v[i][d] = scal*gauss[d];
788 void nosehoover_tcoupl(t_grpopts *opts, gmx_ekindata_t *ekind, real dt,
789 double xi[], double vxi[], t_extmass *MassQ)
794 /* note that this routine does not include Nose-hoover chains yet. Should be easy to add. */
796 for (i = 0; (i < opts->ngtc); i++)
798 reft = std::max<real>(0, opts->ref_t[i]);
800 vxi[i] += dt*MassQ->Qinv[i]*(ekind->tcstat[i].Th - reft);
801 xi[i] += dt*(oldvxi + vxi[i])*0.5;
805 t_state *init_bufstate(const t_state *template_state)
808 int nc = template_state->nhchainlength;
810 snew(state->nosehoover_xi, nc*template_state->ngtc);
811 snew(state->nosehoover_vxi, nc*template_state->ngtc);
812 snew(state->therm_integral, template_state->ngtc);
813 snew(state->nhpres_xi, nc*template_state->nnhpres);
814 snew(state->nhpres_vxi, nc*template_state->nnhpres);
819 void destroy_bufstate(t_state *state)
823 sfree(state->nosehoover_xi);
824 sfree(state->nosehoover_vxi);
825 sfree(state->therm_integral);
826 sfree(state->nhpres_xi);
827 sfree(state->nhpres_vxi);
831 void trotter_update(t_inputrec *ir, gmx_int64_t step, gmx_ekindata_t *ekind,
832 gmx_enerdata_t *enerd, t_state *state,
833 tensor vir, t_mdatoms *md,
834 t_extmass *MassQ, int **trotter_seqlist, int trotter_seqno)
837 int n, i, d, ngtc, gc = 0;
838 t_grp_tcstat *tcstat;
840 gmx_int64_t step_eff;
842 double *scalefac, dtc;
844 rvec sumv = {0, 0, 0};
847 if (trotter_seqno <= ettTSEQ2)
849 step_eff = step-1; /* the velocity verlet calls are actually out of order -- the first half step
850 is actually the last half step from the previous step. Thus the first half step
851 actually corresponds to the n-1 step*/
859 bCouple = (ir->nsttcouple == 1 ||
860 do_per_step(step_eff+ir->nsttcouple, ir->nsttcouple));
862 trotter_seq = trotter_seqlist[trotter_seqno];
864 if ((trotter_seq[0] == etrtSKIPALL) || (!bCouple))
868 dtc = ir->nsttcouple*ir->delta_t; /* This is OK for NPT, because nsttcouple == nstpcouple is enforcesd */
869 opts = &(ir->opts); /* just for ease of referencing */
872 snew(scalefac, opts->ngtc);
873 for (i = 0; i < ngtc; i++)
877 /* execute the series of trotter updates specified in the trotterpart array */
879 for (i = 0; i < NTROTTERPARTS; i++)
881 /* allow for doubled intgrators by doubling dt instead of making 2 calls */
882 if ((trotter_seq[i] == etrtBAROV2) || (trotter_seq[i] == etrtBARONHC2) || (trotter_seq[i] == etrtNHC2))
891 switch (trotter_seq[i])
895 boxv_trotter(ir, &(state->veta), dt, state->box, ekind, vir,
896 enerd->term[F_PDISPCORR], MassQ);
900 NHC_trotter(opts, state->nnhpres, ekind, dt, state->nhpres_xi,
901 state->nhpres_vxi, NULL, &(state->veta), MassQ, FALSE);
905 NHC_trotter(opts, opts->ngtc, ekind, dt, state->nosehoover_xi,
906 state->nosehoover_vxi, scalefac, NULL, MassQ, (ir->eI == eiVV));
907 /* need to rescale the kinetic energies and velocities here. Could
908 scale the velocities later, but we need them scaled in order to
909 produce the correct outputs, so we'll scale them here. */
911 for (i = 0; i < ngtc; i++)
913 tcstat = &ekind->tcstat[i];
914 tcstat->vscale_nhc = scalefac[i];
915 tcstat->ekinscaleh_nhc *= (scalefac[i]*scalefac[i]);
916 tcstat->ekinscalef_nhc *= (scalefac[i]*scalefac[i]);
918 /* now that we've scaled the groupwise velocities, we can add them up to get the total */
919 /* but do we actually need the total? */
921 /* modify the velocities as well */
922 for (n = 0; n < md->homenr; n++)
924 if (md->cTC) /* does this conditional need to be here? is this always true?*/
928 for (d = 0; d < DIM; d++)
930 state->v[n][d] *= scalefac[gc];
935 for (d = 0; d < DIM; d++)
937 sumv[d] += (state->v[n][d])/md->invmass[n];
946 /* check for conserved momentum -- worth looking at this again eventually, but not working right now.*/
952 for (d = 0; d < DIM; d++)
954 consk[d] = sumv[d]*exp((1 + 1.0/opts->nrdf[0])*((1.0/DIM)*log(det(state->box)/state->vol0)) + state->nosehoover_xi[0]);
956 fprintf(debug, "Conserved kappa: %15.8f %15.8f %15.8f\n", consk[0], consk[1], consk[2]);
964 extern void init_npt_masses(t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bInit)
966 int n, i, j, d, ngtc, nh;
968 real reft, kT, ndj, nd;
970 opts = &(ir->opts); /* just for ease of referencing */
971 ngtc = ir->opts.ngtc;
972 nh = state->nhchainlength;
978 snew(MassQ->Qinv, ngtc);
980 for (i = 0; (i < ngtc); i++)
982 if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
984 MassQ->Qinv[i] = 1.0/(sqr(opts->tau_t[i]/M_2PI)*opts->ref_t[i]);
988 MassQ->Qinv[i] = 0.0;
992 else if (EI_VV(ir->eI))
994 /* Set pressure variables */
998 if (state->vol0 == 0)
1000 state->vol0 = det(state->box);
1001 /* because we start by defining a fixed
1002 compressibility, we need the volume at this
1003 compressibility to solve the problem. */
1007 /* units are nm^3 * ns^2 / (nm^3 * bar / kJ/mol) = kJ/mol */
1008 /* Consider evaluating eventually if this the right mass to use. All are correct, some might be more stable */
1009 MassQ->Winv = (PRESFAC*trace(ir->compress)*BOLTZ*opts->ref_t[0])/(DIM*state->vol0*sqr(ir->tau_p/M_2PI));
1010 /* An alternate mass definition, from Tuckerman et al. */
1011 /* MassQ->Winv = 1.0/(sqr(ir->tau_p/M_2PI)*(opts->nrdf[0]+DIM)*BOLTZ*opts->ref_t[0]); */
1012 for (d = 0; d < DIM; d++)
1014 for (n = 0; n < DIM; n++)
1016 MassQ->Winvm[d][n] = PRESFAC*ir->compress[d][n]/(state->vol0*sqr(ir->tau_p/M_2PI));
1017 /* not clear this is correct yet for the anisotropic case. Will need to reevaluate
1018 before using MTTK for anisotropic states.*/
1021 /* Allocate space for thermostat variables */
1024 snew(MassQ->Qinv, ngtc*nh);
1027 /* now, set temperature variables */
1028 for (i = 0; i < ngtc; i++)
1030 if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
1032 reft = std::max<real>(0, opts->ref_t[i]);
1035 for (j = 0; j < nh; j++)
1045 MassQ->Qinv[i*nh+j] = 1.0/(sqr(opts->tau_t[i]/M_2PI)*ndj*kT);
1050 for (j = 0; j < nh; j++)
1052 MassQ->Qinv[i*nh+j] = 0.0;
1059 int **init_npt_vars(t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bTrotter)
1061 int i, j, nnhpres, nh;
1063 real bmass, qmass, reft, kT;
1066 opts = &(ir->opts); /* just for ease of referencing */
1067 nnhpres = state->nnhpres;
1068 nh = state->nhchainlength;
1070 init_npt_masses(ir, state, MassQ, TRUE);
1072 /* first, initialize clear all the trotter calls */
1073 snew(trotter_seq, ettTSEQMAX);
1074 for (i = 0; i < ettTSEQMAX; i++)
1076 snew(trotter_seq[i], NTROTTERPARTS);
1077 for (j = 0; j < NTROTTERPARTS; j++)
1079 trotter_seq[i][j] = etrtNONE;
1081 trotter_seq[i][0] = etrtSKIPALL;
1086 /* no trotter calls, so we never use the values in the array.
1087 * We access them (so we need to define them, but ignore
1093 /* compute the kinetic energy by using the half step velocities or
1094 * the kinetic energies, depending on the order of the trotter calls */
1098 if (IR_NPT_TROTTER(ir))
1100 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1101 We start with the initial one. */
1102 /* first, a round that estimates veta. */
1103 trotter_seq[0][0] = etrtBAROV;
1105 /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
1107 /* The first half trotter update */
1108 trotter_seq[2][0] = etrtBAROV;
1109 trotter_seq[2][1] = etrtNHC;
1110 trotter_seq[2][2] = etrtBARONHC;
1112 /* The second half trotter update */
1113 trotter_seq[3][0] = etrtBARONHC;
1114 trotter_seq[3][1] = etrtNHC;
1115 trotter_seq[3][2] = etrtBAROV;
1117 /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
1120 else if (IR_NVT_TROTTER(ir))
1122 /* This is the easy version - there are only two calls, both the same.
1123 Otherwise, even easier -- no calls */
1124 trotter_seq[2][0] = etrtNHC;
1125 trotter_seq[3][0] = etrtNHC;
1127 else if (IR_NPH_TROTTER(ir))
1129 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1130 We start with the initial one. */
1131 /* first, a round that estimates veta. */
1132 trotter_seq[0][0] = etrtBAROV;
1134 /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
1136 /* The first half trotter update */
1137 trotter_seq[2][0] = etrtBAROV;
1138 trotter_seq[2][1] = etrtBARONHC;
1140 /* The second half trotter update */
1141 trotter_seq[3][0] = etrtBARONHC;
1142 trotter_seq[3][1] = etrtBAROV;
1144 /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
1147 else if (ir->eI == eiVVAK)
1149 if (IR_NPT_TROTTER(ir))
1151 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1152 We start with the initial one. */
1153 /* first, a round that estimates veta. */
1154 trotter_seq[0][0] = etrtBAROV;
1156 /* The first half trotter update, part 1 -- double update, because it commutes */
1157 trotter_seq[1][0] = etrtNHC;
1159 /* The first half trotter update, part 2 */
1160 trotter_seq[2][0] = etrtBAROV;
1161 trotter_seq[2][1] = etrtBARONHC;
1163 /* The second half trotter update, part 1 */
1164 trotter_seq[3][0] = etrtBARONHC;
1165 trotter_seq[3][1] = etrtBAROV;
1167 /* The second half trotter update */
1168 trotter_seq[4][0] = etrtNHC;
1170 else if (IR_NVT_TROTTER(ir))
1172 /* This is the easy version - there is only one call, both the same.
1173 Otherwise, even easier -- no calls */
1174 trotter_seq[1][0] = etrtNHC;
1175 trotter_seq[4][0] = etrtNHC;
1177 else if (IR_NPH_TROTTER(ir))
1179 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1180 We start with the initial one. */
1181 /* first, a round that estimates veta. */
1182 trotter_seq[0][0] = etrtBAROV;
1184 /* The first half trotter update, part 1 -- leave zero */
1185 trotter_seq[1][0] = etrtNHC;
1187 /* The first half trotter update, part 2 */
1188 trotter_seq[2][0] = etrtBAROV;
1189 trotter_seq[2][1] = etrtBARONHC;
1191 /* The second half trotter update, part 1 */
1192 trotter_seq[3][0] = etrtBARONHC;
1193 trotter_seq[3][1] = etrtBAROV;
1195 /* The second half trotter update -- blank for now */
1203 bmass = DIM*DIM; /* recommended mass parameters for isotropic barostat */
1206 snew(MassQ->QPinv, nnhpres*opts->nhchainlength);
1208 /* barostat temperature */
1209 if ((ir->tau_p > 0) && (opts->ref_t[0] > 0))
1211 reft = std::max<real>(0, opts->ref_t[0]);
1213 for (i = 0; i < nnhpres; i++)
1215 for (j = 0; j < nh; j++)
1225 MassQ->QPinv[i*opts->nhchainlength+j] = 1.0/(sqr(opts->tau_t[0]/M_2PI)*qmass*kT);
1231 for (i = 0; i < nnhpres; i++)
1233 for (j = 0; j < nh; j++)
1235 MassQ->QPinv[i*nh+j] = 0.0;
1242 real NPT_energy(t_inputrec *ir, t_state *state, t_extmass *MassQ)
1246 real ener_npt, reft, kT;
1250 int nh = state->nhchainlength;
1254 /* now we compute the contribution of the pressure to the conserved quantity*/
1256 if (ir->epc == epcMTTK)
1258 /* find the volume, and the kinetic energy of the volume */
1264 /* contribution from the pressure momenenta */
1265 ener_npt += 0.5*sqr(state->veta)/MassQ->Winv;
1267 /* contribution from the PV term */
1268 vol = det(state->box);
1269 ener_npt += vol*trace(ir->ref_p)/(DIM*PRESFAC);
1272 case epctANISOTROPIC:
1276 case epctSURFACETENSION:
1279 case epctSEMIISOTROPIC:
1287 if (IR_NPT_TROTTER(ir) || IR_NPH_TROTTER(ir))
1289 /* add the energy from the barostat thermostat chain */
1290 for (i = 0; i < state->nnhpres; i++)
1293 /* note -- assumes only one degree of freedom that is thermostatted in barostat */
1294 ivxi = &state->nhpres_vxi[i*nh];
1295 ixi = &state->nhpres_xi[i*nh];
1296 iQinv = &(MassQ->QPinv[i*nh]);
1297 reft = std::max<real>(ir->opts.ref_t[0], 0.0); /* using 'System' temperature */
1300 for (j = 0; j < nh; j++)
1304 ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1305 /* contribution from the thermal variable of the NH chain */
1306 ener_npt += ixi[j]*kT;
1310 fprintf(debug, "P-T-group: %10d Chain %4d ThermV: %15.8f ThermX: %15.8f", i, j, ivxi[j], ixi[j]);
1318 for (i = 0; i < ir->opts.ngtc; i++)
1320 ixi = &state->nosehoover_xi[i*nh];
1321 ivxi = &state->nosehoover_vxi[i*nh];
1322 iQinv = &(MassQ->Qinv[i*nh]);
1324 nd = ir->opts.nrdf[i];
1325 reft = std::max<real>(ir->opts.ref_t[i], 0);
1330 if (IR_NVT_TROTTER(ir))
1332 /* contribution from the thermal momenta of the NH chain */
1333 for (j = 0; j < nh; j++)
1337 ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1338 /* contribution from the thermal variable of the NH chain */
1347 ener_npt += ndj*ixi[j]*kT;
1351 else /* Other non Trotter temperature NH control -- no chains yet. */
1353 ener_npt += 0.5*BOLTZ*nd*sqr(ivxi[0])/iQinv[0];
1354 ener_npt += nd*ixi[0]*kT;
1362 static real vrescale_gamdev(real ia,
1363 gmx_int64_t step, gmx_int64_t *count,
1364 gmx_int64_t seed1, gmx_int64_t seed2)
1365 /* Gamma distribution, adapted from numerical recipes */
1367 real am, e, s, v1, v2, x, y;
1378 gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1380 v2 = 2.0*rnd[1] - 1.0;
1382 while (v1*v1 + v2*v2 > 1.0 ||
1383 v1*v1*GMX_REAL_MAX < 3.0*ia);
1384 /* The last check above ensures that both x (3.0 > 2.0 in s)
1385 * and the pre-factor for e do not go out of range.
1389 s = sqrt(2.0*am + 1.0);
1394 e = (1.0 + y*y)*exp(am*log(x/am) - s*y);
1396 gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1403 static real gaussian_count(gmx_int64_t step, gmx_int64_t *count,
1404 gmx_int64_t seed1, gmx_int64_t seed2)
1406 double rnd[2], x, y, r;
1410 gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1411 x = 2.0*rnd[0] - 1.0;
1412 y = 2.0*rnd[1] - 1.0;
1415 while (r > 1.0 || r == 0.0);
1417 r = sqrt(-2.0*log(r)/r);
1422 static real vrescale_sumnoises(real nn,
1423 gmx_int64_t step, gmx_int64_t *count,
1424 gmx_int64_t seed1, gmx_int64_t seed2)
1427 * Returns the sum of nn independent gaussian noises squared
1428 * (i.e. equivalent to summing the square of the return values
1429 * of nn calls to gmx_rng_gaussian_real).
1431 const real ndeg_tol = 0.0001;
1434 if (nn < 2 + ndeg_tol)
1439 nn_int = (int)(nn + 0.5);
1441 if (nn - nn_int < -ndeg_tol || nn - nn_int > ndeg_tol)
1443 gmx_fatal(FARGS, "The v-rescale thermostat was called with a group with #DOF=%f, but for #DOF<3 only integer #DOF are supported", nn + 1);
1447 for (i = 0; i < nn_int; i++)
1449 gauss = gaussian_count(step, count, seed1, seed2);
1456 /* Use a gamma distribution for any real nn > 2 */
1457 r = 2.0*vrescale_gamdev(0.5*nn, step, count, seed1, seed2);
1463 static real vrescale_resamplekin(real kk, real sigma, real ndeg, real taut,
1464 gmx_int64_t step, gmx_int64_t seed)
1467 * Generates a new value for the kinetic energy,
1468 * according to Bussi et al JCP (2007), Eq. (A7)
1469 * kk: present value of the kinetic energy of the atoms to be thermalized (in arbitrary units)
1470 * sigma: target average value of the kinetic energy (ndeg k_b T/2) (in the same units as kk)
1471 * ndeg: number of degrees of freedom of the atoms to be thermalized
1472 * taut: relaxation time of the thermostat, in units of 'how often this routine is called'
1474 /* rnd_count tracks the step-local state for the cycle random
1477 gmx_int64_t rnd_count = 0;
1478 real factor, rr, ekin_new;
1482 factor = exp(-1.0/taut);
1489 rr = gaussian_count(step, &rnd_count, seed, RND_SEED_VRESCALE);
1493 (1.0 - factor)*(sigma*(vrescale_sumnoises(ndeg-1, step, &rnd_count, seed, RND_SEED_VRESCALE) + rr*rr)/ndeg - kk) +
1494 2.0*rr*sqrt(kk*sigma/ndeg*(1.0 - factor)*factor);
1499 void vrescale_tcoupl(t_inputrec *ir, gmx_int64_t step,
1500 gmx_ekindata_t *ekind, real dt,
1501 double therm_integral[])
1505 real Ek, Ek_ref1, Ek_ref, Ek_new;
1509 for (i = 0; (i < opts->ngtc); i++)
1513 Ek = trace(ekind->tcstat[i].ekinf);
1517 Ek = trace(ekind->tcstat[i].ekinh);
1520 if (opts->tau_t[i] >= 0 && opts->nrdf[i] > 0 && Ek > 0)
1522 Ek_ref1 = 0.5*opts->ref_t[i]*BOLTZ;
1523 Ek_ref = Ek_ref1*opts->nrdf[i];
1525 Ek_new = vrescale_resamplekin(Ek, Ek_ref, opts->nrdf[i],
1529 /* Analytically Ek_new>=0, but we check for rounding errors */
1532 ekind->tcstat[i].lambda = 0.0;
1536 ekind->tcstat[i].lambda = sqrt(Ek_new/Ek);
1539 therm_integral[i] -= Ek_new - Ek;
1543 fprintf(debug, "TC: group %d: Ekr %g, Ek %g, Ek_new %g, Lambda: %g\n",
1544 i, Ek_ref, Ek, Ek_new, ekind->tcstat[i].lambda);
1549 ekind->tcstat[i].lambda = 1.0;
1554 real vrescale_energy(t_grpopts *opts, double therm_integral[])
1560 for (i = 0; i < opts->ngtc; i++)
1562 ener += therm_integral[i];
1568 void rescale_velocities(gmx_ekindata_t *ekind, t_mdatoms *mdatoms,
1569 int start, int end, rvec v[])
1572 t_grp_tcstat *tcstat;
1573 unsigned short *cACC, *cTC;
1578 tcstat = ekind->tcstat;
1583 gstat = ekind->grpstat;
1584 cACC = mdatoms->cACC;
1588 for (n = start; n < end; n++)
1598 /* Only scale the velocity component relative to the COM velocity */
1599 rvec_sub(v[n], gstat[ga].u, vrel);
1600 lg = tcstat[gt].lambda;
1601 for (d = 0; d < DIM; d++)
1603 v[n][d] = gstat[ga].u[d] + lg*vrel[d];
1610 for (n = start; n < end; n++)
1616 lg = tcstat[gt].lambda;
1617 for (d = 0; d < DIM; d++)
1626 /* set target temperatures if we are annealing */
1627 void update_annealing_target_temp(t_grpopts *opts, real t)
1629 int i, j, n, npoints;
1630 real pert, thist = 0, x;
1632 for (i = 0; i < opts->ngtc; i++)
1634 npoints = opts->anneal_npoints[i];
1635 switch (opts->annealing[i])
1640 /* calculate time modulo the period */
1641 pert = opts->anneal_time[i][npoints-1];
1642 n = static_cast<int>(t / pert);
1643 thist = t - n*pert; /* modulo time */
1644 /* Make sure rounding didn't get us outside the interval */
1645 if (fabs(thist-pert) < GMX_REAL_EPS*100)
1654 gmx_fatal(FARGS, "Death horror in update_annealing_target_temp (i=%d/%d npoints=%d)", i, opts->ngtc, npoints);
1656 /* We are doing annealing for this group if we got here,
1657 * and we have the (relative) time as thist.
1658 * calculate target temp */
1660 while ((j < npoints-1) && (thist > (opts->anneal_time[i][j+1])))
1666 /* Found our position between points j and j+1.
1667 * Interpolate: x is the amount from j+1, (1-x) from point j
1668 * First treat possible jumps in temperature as a special case.
1670 if ((opts->anneal_time[i][j+1]-opts->anneal_time[i][j]) < GMX_REAL_EPS*100)
1672 opts->ref_t[i] = opts->anneal_temp[i][j+1];
1676 x = ((thist-opts->anneal_time[i][j])/
1677 (opts->anneal_time[i][j+1]-opts->anneal_time[i][j]));
1678 opts->ref_t[i] = x*opts->anneal_temp[i][j+1]+(1-x)*opts->anneal_temp[i][j];
1683 opts->ref_t[i] = opts->anneal_temp[i][npoints-1];