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 == etcANDERSENMASSIVE)
762 /* Randomize particle always */
767 /* Randomize particle probabilistically */
770 gmx_rng_cycle_2uniform(step*2, ng, ir->andersen_seed, RND_SEED_ANDERSEN, uniform);
771 bRandomize = (uniform[0] < rate);
778 scal = sqrt(boltzfac[gc]*md->invmass[i]);
779 gmx_rng_cycle_3gaussian_table(step*2+1, ng, ir->andersen_seed, RND_SEED_ANDERSEN, gauss);
780 for (d = 0; d < DIM; d++)
782 state->v[i][d] = scal*gauss[d];
790 void nosehoover_tcoupl(t_grpopts *opts, gmx_ekindata_t *ekind, real dt,
791 double xi[], double vxi[], t_extmass *MassQ)
796 /* note that this routine does not include Nose-hoover chains yet. Should be easy to add. */
798 for (i = 0; (i < opts->ngtc); i++)
800 reft = std::max<real>(0, opts->ref_t[i]);
802 vxi[i] += dt*MassQ->Qinv[i]*(ekind->tcstat[i].Th - reft);
803 xi[i] += dt*(oldvxi + vxi[i])*0.5;
807 t_state *init_bufstate(const t_state *template_state)
810 int nc = template_state->nhchainlength;
812 snew(state->nosehoover_xi, nc*template_state->ngtc);
813 snew(state->nosehoover_vxi, nc*template_state->ngtc);
814 snew(state->therm_integral, template_state->ngtc);
815 snew(state->nhpres_xi, nc*template_state->nnhpres);
816 snew(state->nhpres_vxi, nc*template_state->nnhpres);
821 void destroy_bufstate(t_state *state)
825 sfree(state->nosehoover_xi);
826 sfree(state->nosehoover_vxi);
827 sfree(state->therm_integral);
828 sfree(state->nhpres_xi);
829 sfree(state->nhpres_vxi);
833 void trotter_update(t_inputrec *ir, gmx_int64_t step, gmx_ekindata_t *ekind,
834 gmx_enerdata_t *enerd, t_state *state,
835 tensor vir, t_mdatoms *md,
836 t_extmass *MassQ, int **trotter_seqlist, int trotter_seqno)
839 int n, i, d, ngtc, gc = 0;
840 t_grp_tcstat *tcstat;
842 gmx_int64_t step_eff;
844 double *scalefac, dtc;
846 rvec sumv = {0, 0, 0};
849 if (trotter_seqno <= ettTSEQ2)
851 step_eff = step-1; /* the velocity verlet calls are actually out of order -- the first half step
852 is actually the last half step from the previous step. Thus the first half step
853 actually corresponds to the n-1 step*/
861 bCouple = (ir->nsttcouple == 1 ||
862 do_per_step(step_eff+ir->nsttcouple, ir->nsttcouple));
864 trotter_seq = trotter_seqlist[trotter_seqno];
866 if ((trotter_seq[0] == etrtSKIPALL) || (!bCouple))
870 dtc = ir->nsttcouple*ir->delta_t; /* This is OK for NPT, because nsttcouple == nstpcouple is enforcesd */
871 opts = &(ir->opts); /* just for ease of referencing */
874 snew(scalefac, opts->ngtc);
875 for (i = 0; i < ngtc; i++)
879 /* execute the series of trotter updates specified in the trotterpart array */
881 for (i = 0; i < NTROTTERPARTS; i++)
883 /* allow for doubled intgrators by doubling dt instead of making 2 calls */
884 if ((trotter_seq[i] == etrtBAROV2) || (trotter_seq[i] == etrtBARONHC2) || (trotter_seq[i] == etrtNHC2))
893 switch (trotter_seq[i])
897 boxv_trotter(ir, &(state->veta), dt, state->box, ekind, vir,
898 enerd->term[F_PDISPCORR], MassQ);
902 NHC_trotter(opts, state->nnhpres, ekind, dt, state->nhpres_xi,
903 state->nhpres_vxi, NULL, &(state->veta), MassQ, FALSE);
907 NHC_trotter(opts, opts->ngtc, ekind, dt, state->nosehoover_xi,
908 state->nosehoover_vxi, scalefac, NULL, MassQ, (ir->eI == eiVV));
909 /* need to rescale the kinetic energies and velocities here. Could
910 scale the velocities later, but we need them scaled in order to
911 produce the correct outputs, so we'll scale them here. */
913 for (i = 0; i < ngtc; i++)
915 tcstat = &ekind->tcstat[i];
916 tcstat->vscale_nhc = scalefac[i];
917 tcstat->ekinscaleh_nhc *= (scalefac[i]*scalefac[i]);
918 tcstat->ekinscalef_nhc *= (scalefac[i]*scalefac[i]);
920 /* now that we've scaled the groupwise velocities, we can add them up to get the total */
921 /* but do we actually need the total? */
923 /* modify the velocities as well */
924 for (n = 0; n < md->homenr; n++)
926 if (md->cTC) /* does this conditional need to be here? is this always true?*/
930 for (d = 0; d < DIM; d++)
932 state->v[n][d] *= scalefac[gc];
937 for (d = 0; d < DIM; d++)
939 sumv[d] += (state->v[n][d])/md->invmass[n];
948 /* check for conserved momentum -- worth looking at this again eventually, but not working right now.*/
954 for (d = 0; d < DIM; d++)
956 consk[d] = sumv[d]*exp((1 + 1.0/opts->nrdf[0])*((1.0/DIM)*log(det(state->box)/state->vol0)) + state->nosehoover_xi[0]);
958 fprintf(debug, "Conserved kappa: %15.8f %15.8f %15.8f\n", consk[0], consk[1], consk[2]);
966 extern void init_npt_masses(t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bInit)
968 int n, i, j, d, ngtc, nh;
970 real reft, kT, ndj, nd;
972 opts = &(ir->opts); /* just for ease of referencing */
973 ngtc = ir->opts.ngtc;
974 nh = state->nhchainlength;
980 snew(MassQ->Qinv, ngtc);
982 for (i = 0; (i < ngtc); i++)
984 if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
986 MassQ->Qinv[i] = 1.0/(sqr(opts->tau_t[i]/M_2PI)*opts->ref_t[i]);
990 MassQ->Qinv[i] = 0.0;
994 else if (EI_VV(ir->eI))
996 /* Set pressure variables */
1000 if (state->vol0 == 0)
1002 state->vol0 = det(state->box);
1003 /* because we start by defining a fixed
1004 compressibility, we need the volume at this
1005 compressibility to solve the problem. */
1009 /* units are nm^3 * ns^2 / (nm^3 * bar / kJ/mol) = kJ/mol */
1010 /* Consider evaluating eventually if this the right mass to use. All are correct, some might be more stable */
1011 MassQ->Winv = (PRESFAC*trace(ir->compress)*BOLTZ*opts->ref_t[0])/(DIM*state->vol0*sqr(ir->tau_p/M_2PI));
1012 /* An alternate mass definition, from Tuckerman et al. */
1013 /* MassQ->Winv = 1.0/(sqr(ir->tau_p/M_2PI)*(opts->nrdf[0]+DIM)*BOLTZ*opts->ref_t[0]); */
1014 for (d = 0; d < DIM; d++)
1016 for (n = 0; n < DIM; n++)
1018 MassQ->Winvm[d][n] = PRESFAC*ir->compress[d][n]/(state->vol0*sqr(ir->tau_p/M_2PI));
1019 /* not clear this is correct yet for the anisotropic case. Will need to reevaluate
1020 before using MTTK for anisotropic states.*/
1023 /* Allocate space for thermostat variables */
1026 snew(MassQ->Qinv, ngtc*nh);
1029 /* now, set temperature variables */
1030 for (i = 0; i < ngtc; i++)
1032 if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
1034 reft = std::max<real>(0, opts->ref_t[i]);
1037 for (j = 0; j < nh; j++)
1047 MassQ->Qinv[i*nh+j] = 1.0/(sqr(opts->tau_t[i]/M_2PI)*ndj*kT);
1052 for (j = 0; j < nh; j++)
1054 MassQ->Qinv[i*nh+j] = 0.0;
1061 int **init_npt_vars(t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bTrotter)
1063 int i, j, nnhpres, nh;
1065 real bmass, qmass, reft, kT;
1068 opts = &(ir->opts); /* just for ease of referencing */
1069 nnhpres = state->nnhpres;
1070 nh = state->nhchainlength;
1072 init_npt_masses(ir, state, MassQ, TRUE);
1074 /* first, initialize clear all the trotter calls */
1075 snew(trotter_seq, ettTSEQMAX);
1076 for (i = 0; i < ettTSEQMAX; i++)
1078 snew(trotter_seq[i], NTROTTERPARTS);
1079 for (j = 0; j < NTROTTERPARTS; j++)
1081 trotter_seq[i][j] = etrtNONE;
1083 trotter_seq[i][0] = etrtSKIPALL;
1088 /* no trotter calls, so we never use the values in the array.
1089 * We access them (so we need to define them, but ignore
1095 /* compute the kinetic energy by using the half step velocities or
1096 * the kinetic energies, depending on the order of the trotter calls */
1100 if (IR_NPT_TROTTER(ir))
1102 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1103 We start with the initial one. */
1104 /* first, a round that estimates veta. */
1105 trotter_seq[0][0] = etrtBAROV;
1107 /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
1109 /* The first half trotter update */
1110 trotter_seq[2][0] = etrtBAROV;
1111 trotter_seq[2][1] = etrtNHC;
1112 trotter_seq[2][2] = etrtBARONHC;
1114 /* The second half trotter update */
1115 trotter_seq[3][0] = etrtBARONHC;
1116 trotter_seq[3][1] = etrtNHC;
1117 trotter_seq[3][2] = etrtBAROV;
1119 /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
1122 else if (IR_NVT_TROTTER(ir))
1124 /* This is the easy version - there are only two calls, both the same.
1125 Otherwise, even easier -- no calls */
1126 trotter_seq[2][0] = etrtNHC;
1127 trotter_seq[3][0] = etrtNHC;
1129 else if (IR_NPH_TROTTER(ir))
1131 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1132 We start with the initial one. */
1133 /* first, a round that estimates veta. */
1134 trotter_seq[0][0] = etrtBAROV;
1136 /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
1138 /* The first half trotter update */
1139 trotter_seq[2][0] = etrtBAROV;
1140 trotter_seq[2][1] = etrtBARONHC;
1142 /* The second half trotter update */
1143 trotter_seq[3][0] = etrtBARONHC;
1144 trotter_seq[3][1] = etrtBAROV;
1146 /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
1149 else if (ir->eI == eiVVAK)
1151 if (IR_NPT_TROTTER(ir))
1153 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1154 We start with the initial one. */
1155 /* first, a round that estimates veta. */
1156 trotter_seq[0][0] = etrtBAROV;
1158 /* The first half trotter update, part 1 -- double update, because it commutes */
1159 trotter_seq[1][0] = etrtNHC;
1161 /* The first half trotter update, part 2 */
1162 trotter_seq[2][0] = etrtBAROV;
1163 trotter_seq[2][1] = etrtBARONHC;
1165 /* The second half trotter update, part 1 */
1166 trotter_seq[3][0] = etrtBARONHC;
1167 trotter_seq[3][1] = etrtBAROV;
1169 /* The second half trotter update */
1170 trotter_seq[4][0] = etrtNHC;
1172 else if (IR_NVT_TROTTER(ir))
1174 /* This is the easy version - there is only one call, both the same.
1175 Otherwise, even easier -- no calls */
1176 trotter_seq[1][0] = etrtNHC;
1177 trotter_seq[4][0] = etrtNHC;
1179 else if (IR_NPH_TROTTER(ir))
1181 /* This is the complicated version - there are 4 possible calls, depending on ordering.
1182 We start with the initial one. */
1183 /* first, a round that estimates veta. */
1184 trotter_seq[0][0] = etrtBAROV;
1186 /* The first half trotter update, part 1 -- leave zero */
1187 trotter_seq[1][0] = etrtNHC;
1189 /* The first half trotter update, part 2 */
1190 trotter_seq[2][0] = etrtBAROV;
1191 trotter_seq[2][1] = etrtBARONHC;
1193 /* The second half trotter update, part 1 */
1194 trotter_seq[3][0] = etrtBARONHC;
1195 trotter_seq[3][1] = etrtBAROV;
1197 /* The second half trotter update -- blank for now */
1205 bmass = DIM*DIM; /* recommended mass parameters for isotropic barostat */
1208 snew(MassQ->QPinv, nnhpres*opts->nhchainlength);
1210 /* barostat temperature */
1211 if ((ir->tau_p > 0) && (opts->ref_t[0] > 0))
1213 reft = std::max<real>(0, opts->ref_t[0]);
1215 for (i = 0; i < nnhpres; i++)
1217 for (j = 0; j < nh; j++)
1227 MassQ->QPinv[i*opts->nhchainlength+j] = 1.0/(sqr(opts->tau_t[0]/M_2PI)*qmass*kT);
1233 for (i = 0; i < nnhpres; i++)
1235 for (j = 0; j < nh; j++)
1237 MassQ->QPinv[i*nh+j] = 0.0;
1244 real NPT_energy(t_inputrec *ir, t_state *state, t_extmass *MassQ)
1248 real ener_npt, reft, kT;
1252 int nh = state->nhchainlength;
1256 /* now we compute the contribution of the pressure to the conserved quantity*/
1258 if (ir->epc == epcMTTK)
1260 /* find the volume, and the kinetic energy of the volume */
1266 /* contribution from the pressure momenenta */
1267 ener_npt += 0.5*sqr(state->veta)/MassQ->Winv;
1269 /* contribution from the PV term */
1270 vol = det(state->box);
1271 ener_npt += vol*trace(ir->ref_p)/(DIM*PRESFAC);
1274 case epctANISOTROPIC:
1278 case epctSURFACETENSION:
1281 case epctSEMIISOTROPIC:
1289 if (IR_NPT_TROTTER(ir) || IR_NPH_TROTTER(ir))
1291 /* add the energy from the barostat thermostat chain */
1292 for (i = 0; i < state->nnhpres; i++)
1295 /* note -- assumes only one degree of freedom that is thermostatted in barostat */
1296 ivxi = &state->nhpres_vxi[i*nh];
1297 ixi = &state->nhpres_xi[i*nh];
1298 iQinv = &(MassQ->QPinv[i*nh]);
1299 reft = std::max<real>(ir->opts.ref_t[0], 0.0); /* using 'System' temperature */
1302 for (j = 0; j < nh; j++)
1306 ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1307 /* contribution from the thermal variable of the NH chain */
1308 ener_npt += ixi[j]*kT;
1312 fprintf(debug, "P-T-group: %10d Chain %4d ThermV: %15.8f ThermX: %15.8f", i, j, ivxi[j], ixi[j]);
1320 for (i = 0; i < ir->opts.ngtc; i++)
1322 ixi = &state->nosehoover_xi[i*nh];
1323 ivxi = &state->nosehoover_vxi[i*nh];
1324 iQinv = &(MassQ->Qinv[i*nh]);
1326 nd = ir->opts.nrdf[i];
1327 reft = std::max<real>(ir->opts.ref_t[i], 0);
1332 if (IR_NVT_TROTTER(ir))
1334 /* contribution from the thermal momenta of the NH chain */
1335 for (j = 0; j < nh; j++)
1339 ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1340 /* contribution from the thermal variable of the NH chain */
1349 ener_npt += ndj*ixi[j]*kT;
1353 else /* Other non Trotter temperature NH control -- no chains yet. */
1355 ener_npt += 0.5*BOLTZ*nd*sqr(ivxi[0])/iQinv[0];
1356 ener_npt += nd*ixi[0]*kT;
1364 static real vrescale_gamdev(real ia,
1365 gmx_int64_t step, gmx_int64_t *count,
1366 gmx_int64_t seed1, gmx_int64_t seed2)
1367 /* Gamma distribution, adapted from numerical recipes */
1369 real am, e, s, v1, v2, x, y;
1380 gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1382 v2 = 2.0*rnd[1] - 1.0;
1384 while (v1*v1 + v2*v2 > 1.0 ||
1385 v1*v1*GMX_REAL_MAX < 3.0*ia);
1386 /* The last check above ensures that both x (3.0 > 2.0 in s)
1387 * and the pre-factor for e do not go out of range.
1391 s = sqrt(2.0*am + 1.0);
1396 e = (1.0 + y*y)*exp(am*log(x/am) - s*y);
1398 gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1405 static real gaussian_count(gmx_int64_t step, gmx_int64_t *count,
1406 gmx_int64_t seed1, gmx_int64_t seed2)
1408 double rnd[2], x, y, r;
1412 gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1413 x = 2.0*rnd[0] - 1.0;
1414 y = 2.0*rnd[1] - 1.0;
1417 while (r > 1.0 || r == 0.0);
1419 r = sqrt(-2.0*log(r)/r);
1424 static real vrescale_sumnoises(real nn,
1425 gmx_int64_t step, gmx_int64_t *count,
1426 gmx_int64_t seed1, gmx_int64_t seed2)
1429 * Returns the sum of nn independent gaussian noises squared
1430 * (i.e. equivalent to summing the square of the return values
1431 * of nn calls to gmx_rng_gaussian_real).
1433 const real ndeg_tol = 0.0001;
1436 if (nn < 2 + ndeg_tol)
1441 nn_int = (int)(nn + 0.5);
1443 if (nn - nn_int < -ndeg_tol || nn - nn_int > ndeg_tol)
1445 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);
1449 for (i = 0; i < nn_int; i++)
1451 gauss = gaussian_count(step, count, seed1, seed2);
1458 /* Use a gamma distribution for any real nn > 2 */
1459 r = 2.0*vrescale_gamdev(0.5*nn, step, count, seed1, seed2);
1465 static real vrescale_resamplekin(real kk, real sigma, real ndeg, real taut,
1466 gmx_int64_t step, gmx_int64_t seed)
1469 * Generates a new value for the kinetic energy,
1470 * according to Bussi et al JCP (2007), Eq. (A7)
1471 * kk: present value of the kinetic energy of the atoms to be thermalized (in arbitrary units)
1472 * sigma: target average value of the kinetic energy (ndeg k_b T/2) (in the same units as kk)
1473 * ndeg: number of degrees of freedom of the atoms to be thermalized
1474 * taut: relaxation time of the thermostat, in units of 'how often this routine is called'
1476 /* rnd_count tracks the step-local state for the cycle random
1479 gmx_int64_t rnd_count = 0;
1480 real factor, rr, ekin_new;
1484 factor = exp(-1.0/taut);
1491 rr = gaussian_count(step, &rnd_count, seed, RND_SEED_VRESCALE);
1495 (1.0 - factor)*(sigma*(vrescale_sumnoises(ndeg-1, step, &rnd_count, seed, RND_SEED_VRESCALE) + rr*rr)/ndeg - kk) +
1496 2.0*rr*sqrt(kk*sigma/ndeg*(1.0 - factor)*factor);
1501 void vrescale_tcoupl(t_inputrec *ir, gmx_int64_t step,
1502 gmx_ekindata_t *ekind, real dt,
1503 double therm_integral[])
1507 real Ek, Ek_ref1, Ek_ref, Ek_new;
1511 for (i = 0; (i < opts->ngtc); i++)
1515 Ek = trace(ekind->tcstat[i].ekinf);
1519 Ek = trace(ekind->tcstat[i].ekinh);
1522 if (opts->tau_t[i] >= 0 && opts->nrdf[i] > 0 && Ek > 0)
1524 Ek_ref1 = 0.5*opts->ref_t[i]*BOLTZ;
1525 Ek_ref = Ek_ref1*opts->nrdf[i];
1527 Ek_new = vrescale_resamplekin(Ek, Ek_ref, opts->nrdf[i],
1531 /* Analytically Ek_new>=0, but we check for rounding errors */
1534 ekind->tcstat[i].lambda = 0.0;
1538 ekind->tcstat[i].lambda = sqrt(Ek_new/Ek);
1541 therm_integral[i] -= Ek_new - Ek;
1545 fprintf(debug, "TC: group %d: Ekr %g, Ek %g, Ek_new %g, Lambda: %g\n",
1546 i, Ek_ref, Ek, Ek_new, ekind->tcstat[i].lambda);
1551 ekind->tcstat[i].lambda = 1.0;
1556 real vrescale_energy(t_grpopts *opts, double therm_integral[])
1562 for (i = 0; i < opts->ngtc; i++)
1564 ener += therm_integral[i];
1570 void rescale_velocities(gmx_ekindata_t *ekind, t_mdatoms *mdatoms,
1571 int start, int end, rvec v[])
1574 t_grp_tcstat *tcstat;
1575 unsigned short *cACC, *cTC;
1580 tcstat = ekind->tcstat;
1585 gstat = ekind->grpstat;
1586 cACC = mdatoms->cACC;
1590 for (n = start; n < end; n++)
1600 /* Only scale the velocity component relative to the COM velocity */
1601 rvec_sub(v[n], gstat[ga].u, vrel);
1602 lg = tcstat[gt].lambda;
1603 for (d = 0; d < DIM; d++)
1605 v[n][d] = gstat[ga].u[d] + lg*vrel[d];
1612 for (n = start; n < end; n++)
1618 lg = tcstat[gt].lambda;
1619 for (d = 0; d < DIM; d++)
1628 /* set target temperatures if we are annealing */
1629 void update_annealing_target_temp(t_grpopts *opts, real t)
1631 int i, j, n, npoints;
1632 real pert, thist = 0, x;
1634 for (i = 0; i < opts->ngtc; i++)
1636 npoints = opts->anneal_npoints[i];
1637 switch (opts->annealing[i])
1642 /* calculate time modulo the period */
1643 pert = opts->anneal_time[i][npoints-1];
1644 n = static_cast<int>(t / pert);
1645 thist = t - n*pert; /* modulo time */
1646 /* Make sure rounding didn't get us outside the interval */
1647 if (fabs(thist-pert) < GMX_REAL_EPS*100)
1656 gmx_fatal(FARGS, "Death horror in update_annealing_target_temp (i=%d/%d npoints=%d)", i, opts->ngtc, npoints);
1658 /* We are doing annealing for this group if we got here,
1659 * and we have the (relative) time as thist.
1660 * calculate target temp */
1662 while ((j < npoints-1) && (thist > (opts->anneal_time[i][j+1])))
1668 /* Found our position between points j and j+1.
1669 * Interpolate: x is the amount from j+1, (1-x) from point j
1670 * First treat possible jumps in temperature as a special case.
1672 if ((opts->anneal_time[i][j+1]-opts->anneal_time[i][j]) < GMX_REAL_EPS*100)
1674 opts->ref_t[i] = opts->anneal_temp[i][j+1];
1678 x = ((thist-opts->anneal_time[i][j])/
1679 (opts->anneal_time[i][j+1]-opts->anneal_time[i][j]));
1680 opts->ref_t[i] = x*opts->anneal_temp[i][j+1]+(1-x)*opts->anneal_temp[i][j];
1685 opts->ref_t[i] = opts->anneal_temp[i][npoints-1];