Fix Trotter integration
[alexxy/gromacs.git] / src / gromacs / mdlib / coupling.c
1 /*
2  * This file is part of the GROMACS molecular simulation package.
3  *
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.
10  *
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.
15  *
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.
20  *
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.
25  *
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.
33  *
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.
36  */
37 #ifdef HAVE_CONFIG_H
38 #include <config.h>
39 #endif
40 #include <assert.h>
41
42 #include "typedefs.h"
43 #include "types/commrec.h"
44 #include "gromacs/utility/smalloc.h"
45 #include "update.h"
46 #include "vec.h"
47 #include "macros.h"
48 #include "physics.h"
49 #include "names.h"
50 #include "gmx_fatal.h"
51 #include "txtdump.h"
52 #include "nrnb.h"
53 #include "gromacs/random/random.h"
54 #include "update.h"
55 #include "mdrun.h"
56
57 #define NTROTTERPARTS 3
58
59 /* Suzuki-Yoshida Constants, for n=3 and n=5, for symplectic integration  */
60 /* for n=1, w0 = 1 */
61 /* for n=3, w0 = w2 = 1/(2-2^-(1/3)), w1 = 1-2*w0 */
62 /* for n=5, w0 = w1 = w3 = w4 = 1/(4-4^-(1/3)), w1 = 1-4*w0 */
63
64 #define MAX_SUZUKI_YOSHIDA_NUM 5
65 #define SUZUKI_YOSHIDA_NUM  5
66
67 static const double  sy_const_1[] = { 1. };
68 static const double  sy_const_3[] = { 0.828981543588751, -0.657963087177502, 0.828981543588751 };
69 static const double  sy_const_5[] = { 0.2967324292201065, 0.2967324292201065, -0.186929716880426, 0.2967324292201065, 0.2967324292201065 };
70
71 static const double* sy_const[] = {
72     NULL,
73     sy_const_1,
74     NULL,
75     sy_const_3,
76     NULL,
77     sy_const_5
78 };
79
80 /*
81    static const double sy_const[MAX_SUZUKI_YOSHIDA_NUM+1][MAX_SUZUKI_YOSHIDA_NUM+1] = {
82     {},
83     {1},
84     {},
85     {0.828981543588751,-0.657963087177502,0.828981543588751},
86     {},
87     {0.2967324292201065,0.2967324292201065,-0.186929716880426,0.2967324292201065,0.2967324292201065}
88    };*/
89
90 /* these integration routines are only referenced inside this file */
91 static void NHC_trotter(t_grpopts *opts, int nvar, gmx_ekindata_t *ekind, real dtfull,
92                         double xi[], double vxi[], double scalefac[], real *veta, t_extmass *MassQ, gmx_bool bEkinAveVel)
93
94 {
95     /* general routine for both barostat and thermostat nose hoover chains */
96
97     int           i, j, mi, mj, jmax;
98     double        Ekin, Efac, reft, kT, nd;
99     double        dt;
100     t_grp_tcstat *tcstat;
101     double       *ivxi, *ixi;
102     double       *iQinv;
103     double       *GQ;
104     gmx_bool      bBarostat;
105     int           mstepsi, mstepsj;
106     int           ns = SUZUKI_YOSHIDA_NUM; /* set the degree of integration in the types/state.h file */
107     int           nh = opts->nhchainlength;
108
109     snew(GQ, nh);
110     mstepsi = mstepsj = ns;
111
112 /* if scalefac is NULL, we are doing the NHC of the barostat */
113
114     bBarostat = FALSE;
115     if (scalefac == NULL)
116     {
117         bBarostat = TRUE;
118     }
119
120     for (i = 0; i < nvar; i++)
121     {
122
123         /* make it easier to iterate by selecting
124            out the sub-array that corresponds to this T group */
125
126         ivxi = &vxi[i*nh];
127         ixi  = &xi[i*nh];
128         if (bBarostat)
129         {
130             iQinv = &(MassQ->QPinv[i*nh]);
131             nd    = 1.0; /* THIS WILL CHANGE IF NOT ISOTROPIC */
132             reft  = max(0.0, opts->ref_t[0]);
133             Ekin  = sqr(*veta)/MassQ->Winv;
134         }
135         else
136         {
137             iQinv  = &(MassQ->Qinv[i*nh]);
138             tcstat = &ekind->tcstat[i];
139             nd     = opts->nrdf[i];
140             reft   = max(0.0, opts->ref_t[i]);
141             if (bEkinAveVel)
142             {
143                 Ekin = 2*trace(tcstat->ekinf)*tcstat->ekinscalef_nhc;
144             }
145             else
146             {
147                 Ekin = 2*trace(tcstat->ekinh)*tcstat->ekinscaleh_nhc;
148             }
149         }
150         kT = BOLTZ*reft;
151
152         for (mi = 0; mi < mstepsi; mi++)
153         {
154             for (mj = 0; mj < mstepsj; mj++)
155             {
156                 /* weighting for this step using Suzuki-Yoshida integration - fixed at 5 */
157                 dt = sy_const[ns][mj] * dtfull / mstepsi;
158
159                 /* compute the thermal forces */
160                 GQ[0] = iQinv[0]*(Ekin - nd*kT);
161
162                 for (j = 0; j < nh-1; j++)
163                 {
164                     if (iQinv[j+1] > 0)
165                     {
166                         /* we actually don't need to update here if we save the
167                            state of the GQ, but it's easier to just recompute*/
168                         GQ[j+1] = iQinv[j+1]*((sqr(ivxi[j])/iQinv[j])-kT);
169                     }
170                     else
171                     {
172                         GQ[j+1] = 0;
173                     }
174                 }
175
176                 ivxi[nh-1] += 0.25*dt*GQ[nh-1];
177                 for (j = nh-1; j > 0; j--)
178                 {
179                     Efac      = exp(-0.125*dt*ivxi[j]);
180                     ivxi[j-1] = Efac*(ivxi[j-1]*Efac + 0.25*dt*GQ[j-1]);
181                 }
182
183                 Efac = exp(-0.5*dt*ivxi[0]);
184                 if (bBarostat)
185                 {
186                     *veta *= Efac;
187                 }
188                 else
189                 {
190                     scalefac[i] *= Efac;
191                 }
192                 Ekin *= (Efac*Efac);
193
194                 /* Issue - if the KE is an average of the last and the current temperatures, then we might not be
195                    able to scale the kinetic energy directly with this factor.  Might take more bookkeeping -- have to
196                    think about this a bit more . . . */
197
198                 GQ[0] = iQinv[0]*(Ekin - nd*kT);
199
200                 /* update thermostat positions */
201                 for (j = 0; j < nh; j++)
202                 {
203                     ixi[j] += 0.5*dt*ivxi[j];
204                 }
205
206                 for (j = 0; j < nh-1; j++)
207                 {
208                     Efac    = exp(-0.125*dt*ivxi[j+1]);
209                     ivxi[j] = Efac*(ivxi[j]*Efac + 0.25*dt*GQ[j]);
210                     if (iQinv[j+1] > 0)
211                     {
212                         GQ[j+1] = iQinv[j+1]*((sqr(ivxi[j])/iQinv[j])-kT);
213                     }
214                     else
215                     {
216                         GQ[j+1] = 0;
217                     }
218                 }
219                 ivxi[nh-1] += 0.25*dt*GQ[nh-1];
220             }
221         }
222     }
223     sfree(GQ);
224 }
225
226 static void boxv_trotter(t_inputrec *ir, real *veta, real dt, tensor box,
227                          gmx_ekindata_t *ekind, tensor vir, real pcorr, t_extmass *MassQ)
228 {
229
230     real   pscal;
231     double alpha;
232     int    i, j, d, n, nwall;
233     real   T, GW, vol;
234     tensor Winvm, ekinmod, localpres;
235
236     /* The heat bath is coupled to a separate barostat, the last temperature group.  In the
237        2006 Tuckerman et al paper., the order is iL_{T_baro} iL {T_part}
238      */
239
240     if (ir->epct == epctSEMIISOTROPIC)
241     {
242         nwall = 2;
243     }
244     else
245     {
246         nwall = 3;
247     }
248
249     /* eta is in pure units.  veta is in units of ps^-1. GW is in
250        units of ps^-2.  However, eta has a reference of 1 nm^3, so care must be
251        taken to use only RATIOS of eta in updating the volume. */
252
253     /* we take the partial pressure tensors, modify the
254        kinetic energy tensor, and recovert to pressure */
255
256     if (ir->opts.nrdf[0] == 0)
257     {
258         gmx_fatal(FARGS, "Barostat is coupled to a T-group with no degrees of freedom\n");
259     }
260     /* alpha factor for phase space volume, then multiply by the ekin scaling factor.  */
261     alpha  = 1.0 + DIM/((double)ir->opts.nrdf[0]);
262     alpha *= ekind->tcstat[0].ekinscalef_nhc;
263     msmul(ekind->ekin, alpha, ekinmod);
264     /* for now, we use Elr = 0, because if you want to get it right, you
265        really should be using PME. Maybe print a warning? */
266
267     pscal   = calc_pres(ir->ePBC, nwall, box, ekinmod, vir, localpres)+pcorr;
268
269     vol = det(box);
270     GW  = (vol*(MassQ->Winv/PRESFAC))*(DIM*pscal - trace(ir->ref_p));  /* W is in ps^2 * bar * nm^3 */
271
272     *veta += 0.5*dt*GW;
273 }
274
275 /*
276  * This file implements temperature and pressure coupling algorithms:
277  * For now only the Weak coupling and the modified weak coupling.
278  *
279  * Furthermore computation of pressure and temperature is done here
280  *
281  */
282
283 real calc_pres(int ePBC, int nwall, matrix box, tensor ekin, tensor vir,
284                tensor pres)
285 {
286     int  n, m;
287     real fac;
288
289     if (ePBC == epbcNONE || (ePBC == epbcXY && nwall != 2))
290     {
291         clear_mat(pres);
292     }
293     else
294     {
295         /* Uitzoeken welke ekin hier van toepassing is, zie Evans & Morris - E.
296          * Wrs. moet de druktensor gecorrigeerd worden voor de netto stroom in
297          * het systeem...
298          */
299
300         fac = PRESFAC*2.0/det(box);
301         for (n = 0; (n < DIM); n++)
302         {
303             for (m = 0; (m < DIM); m++)
304             {
305                 pres[n][m] = (ekin[n][m] - vir[n][m])*fac;
306             }
307         }
308
309         if (debug)
310         {
311             pr_rvecs(debug, 0, "PC: pres", pres, DIM);
312             pr_rvecs(debug, 0, "PC: ekin", ekin, DIM);
313             pr_rvecs(debug, 0, "PC: vir ", vir, DIM);
314             pr_rvecs(debug, 0, "PC: box ", box, DIM);
315         }
316     }
317     return trace(pres)/DIM;
318 }
319
320 real calc_temp(real ekin, real nrdf)
321 {
322     if (nrdf > 0)
323     {
324         return (2.0*ekin)/(nrdf*BOLTZ);
325     }
326     else
327     {
328         return 0;
329     }
330 }
331
332 void parrinellorahman_pcoupl(FILE *fplog, gmx_int64_t step,
333                              t_inputrec *ir, real dt, tensor pres,
334                              tensor box, tensor box_rel, tensor boxv,
335                              tensor M, matrix mu, gmx_bool bFirstStep)
336 {
337     /* This doesn't do any coordinate updating. It just
338      * integrates the box vector equations from the calculated
339      * acceleration due to pressure difference. We also compute
340      * the tensor M which is used in update to couple the particle
341      * coordinates to the box vectors.
342      *
343      * In Nose and Klein (Mol.Phys 50 (1983) no 5., p 1055) this is
344      * given as
345      *            -1    .           .     -1
346      * M_nk = (h')   * (h' * h + h' h) * h
347      *
348      * with the dots denoting time derivatives and h is the transformation from
349      * the scaled frame to the real frame, i.e. the TRANSPOSE of the box.
350      * This also goes for the pressure and M tensors - they are transposed relative
351      * to ours. Our equation thus becomes:
352      *
353      *                  -1       .    .           -1
354      * M_gmx = M_nk' = b  * (b * b' + b * b') * b'
355      *
356      * where b is the gromacs box matrix.
357      * Our box accelerations are given by
358      *   ..                                    ..
359      *   b = vol/W inv(box') * (P-ref_P)     (=h')
360      */
361
362     int    d, n;
363     tensor winv;
364     real   vol = box[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
365     real   atot, arel, change, maxchange, xy_pressure;
366     tensor invbox, pdiff, t1, t2;
367
368     real   maxl;
369
370     m_inv_ur0(box, invbox);
371
372     if (!bFirstStep)
373     {
374         /* Note that PRESFAC does not occur here.
375          * The pressure and compressibility always occur as a product,
376          * therefore the pressure unit drops out.
377          */
378         maxl = max(box[XX][XX], box[YY][YY]);
379         maxl = max(maxl, box[ZZ][ZZ]);
380         for (d = 0; d < DIM; d++)
381         {
382             for (n = 0; n < DIM; n++)
383             {
384                 winv[d][n] =
385                     (4*M_PI*M_PI*ir->compress[d][n])/(3*ir->tau_p*ir->tau_p*maxl);
386             }
387         }
388
389         m_sub(pres, ir->ref_p, pdiff);
390
391         if (ir->epct == epctSURFACETENSION)
392         {
393             /* Unlike Berendsen coupling it might not be trivial to include a z
394              * pressure correction here? On the other hand we don't scale the
395              * box momentarily, but change accelerations, so it might not be crucial.
396              */
397             xy_pressure = 0.5*(pres[XX][XX]+pres[YY][YY]);
398             for (d = 0; d < ZZ; d++)
399             {
400                 pdiff[d][d] = (xy_pressure-(pres[ZZ][ZZ]-ir->ref_p[d][d]/box[d][d]));
401             }
402         }
403
404         tmmul(invbox, pdiff, t1);
405         /* Move the off-diagonal elements of the 'force' to one side to ensure
406          * that we obey the box constraints.
407          */
408         for (d = 0; d < DIM; d++)
409         {
410             for (n = 0; n < d; n++)
411             {
412                 t1[d][n] += t1[n][d];
413                 t1[n][d]  = 0;
414             }
415         }
416
417         switch (ir->epct)
418         {
419             case epctANISOTROPIC:
420                 for (d = 0; d < DIM; d++)
421                 {
422                     for (n = 0; n <= d; n++)
423                     {
424                         t1[d][n] *= winv[d][n]*vol;
425                     }
426                 }
427                 break;
428             case epctISOTROPIC:
429                 /* calculate total volume acceleration */
430                 atot = box[XX][XX]*box[YY][YY]*t1[ZZ][ZZ]+
431                     box[XX][XX]*t1[YY][YY]*box[ZZ][ZZ]+
432                     t1[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
433                 arel = atot/(3*vol);
434                 /* set all RELATIVE box accelerations equal, and maintain total V
435                  * change speed */
436                 for (d = 0; d < DIM; d++)
437                 {
438                     for (n = 0; n <= d; n++)
439                     {
440                         t1[d][n] = winv[0][0]*vol*arel*box[d][n];
441                     }
442                 }
443                 break;
444             case epctSEMIISOTROPIC:
445             case epctSURFACETENSION:
446                 /* Note the correction to pdiff above for surftens. coupling  */
447
448                 /* calculate total XY volume acceleration */
449                 atot = box[XX][XX]*t1[YY][YY]+t1[XX][XX]*box[YY][YY];
450                 arel = atot/(2*box[XX][XX]*box[YY][YY]);
451                 /* set RELATIVE XY box accelerations equal, and maintain total V
452                  * change speed. Dont change the third box vector accelerations */
453                 for (d = 0; d < ZZ; d++)
454                 {
455                     for (n = 0; n <= d; n++)
456                     {
457                         t1[d][n] = winv[d][n]*vol*arel*box[d][n];
458                     }
459                 }
460                 for (n = 0; n < DIM; n++)
461                 {
462                     t1[ZZ][n] *= winv[d][n]*vol;
463                 }
464                 break;
465             default:
466                 gmx_fatal(FARGS, "Parrinello-Rahman pressure coupling type %s "
467                           "not supported yet\n", EPCOUPLTYPETYPE(ir->epct));
468                 break;
469         }
470
471         maxchange = 0;
472         for (d = 0; d < DIM; d++)
473         {
474             for (n = 0; n <= d; n++)
475             {
476                 boxv[d][n] += dt*t1[d][n];
477
478                 /* We do NOT update the box vectors themselves here, since
479                  * we need them for shifting later. It is instead done last
480                  * in the update() routine.
481                  */
482
483                 /* Calculate the change relative to diagonal elements-
484                    since it's perfectly ok for the off-diagonal ones to
485                    be zero it doesn't make sense to check the change relative
486                    to its current size.
487                  */
488
489                 change = fabs(dt*boxv[d][n]/box[d][d]);
490
491                 if (change > maxchange)
492                 {
493                     maxchange = change;
494                 }
495             }
496         }
497
498         if (maxchange > 0.01 && fplog)
499         {
500             char buf[22];
501             fprintf(fplog,
502                     "\nStep %s  Warning: Pressure scaling more than 1%%. "
503                     "This may mean your system\n is not yet equilibrated. "
504                     "Use of Parrinello-Rahman pressure coupling during\n"
505                     "equilibration can lead to simulation instability, "
506                     "and is discouraged.\n",
507                     gmx_step_str(step, buf));
508         }
509     }
510
511     preserve_box_shape(ir, box_rel, boxv);
512
513     mtmul(boxv, box, t1);   /* t1=boxv * b' */
514     mmul(invbox, t1, t2);
515     mtmul(t2, invbox, M);
516
517     /* Determine the scaling matrix mu for the coordinates */
518     for (d = 0; d < DIM; d++)
519     {
520         for (n = 0; n <= d; n++)
521         {
522             t1[d][n] = box[d][n] + dt*boxv[d][n];
523         }
524     }
525     preserve_box_shape(ir, box_rel, t1);
526     /* t1 is the box at t+dt, determine mu as the relative change */
527     mmul_ur0(invbox, t1, mu);
528 }
529
530 void berendsen_pcoupl(FILE *fplog, gmx_int64_t step,
531                       t_inputrec *ir, real dt, tensor pres, matrix box,
532                       matrix mu)
533 {
534     int     d, n;
535     real    scalar_pressure, xy_pressure, p_corr_z;
536     char   *ptr, buf[STRLEN];
537
538     /*
539      *  Calculate the scaling matrix mu
540      */
541     scalar_pressure = 0;
542     xy_pressure     = 0;
543     for (d = 0; d < DIM; d++)
544     {
545         scalar_pressure += pres[d][d]/DIM;
546         if (d != ZZ)
547         {
548             xy_pressure += pres[d][d]/(DIM-1);
549         }
550     }
551     /* Pressure is now in bar, everywhere. */
552 #define factor(d, m) (ir->compress[d][m]*dt/ir->tau_p)
553
554     /* mu has been changed from pow(1+...,1/3) to 1+.../3, since this is
555      * necessary for triclinic scaling
556      */
557     clear_mat(mu);
558     switch (ir->epct)
559     {
560         case epctISOTROPIC:
561             for (d = 0; d < DIM; d++)
562             {
563                 mu[d][d] = 1.0 - factor(d, d)*(ir->ref_p[d][d] - scalar_pressure) /DIM;
564             }
565             break;
566         case epctSEMIISOTROPIC:
567             for (d = 0; d < ZZ; d++)
568             {
569                 mu[d][d] = 1.0 - factor(d, d)*(ir->ref_p[d][d]-xy_pressure)/DIM;
570             }
571             mu[ZZ][ZZ] =
572                 1.0 - factor(ZZ, ZZ)*(ir->ref_p[ZZ][ZZ] - pres[ZZ][ZZ])/DIM;
573             break;
574         case epctANISOTROPIC:
575             for (d = 0; d < DIM; d++)
576             {
577                 for (n = 0; n < DIM; n++)
578                 {
579                     mu[d][n] = (d == n ? 1.0 : 0.0)
580                         -factor(d, n)*(ir->ref_p[d][n] - pres[d][n])/DIM;
581                 }
582             }
583             break;
584         case epctSURFACETENSION:
585             /* ir->ref_p[0/1] is the reference surface-tension times *
586              * the number of surfaces                                */
587             if (ir->compress[ZZ][ZZ])
588             {
589                 p_corr_z = dt/ir->tau_p*(ir->ref_p[ZZ][ZZ] - pres[ZZ][ZZ]);
590             }
591             else
592             {
593                 /* when the compressibity is zero, set the pressure correction   *
594                  * in the z-direction to zero to get the correct surface tension */
595                 p_corr_z = 0;
596             }
597             mu[ZZ][ZZ] = 1.0 - ir->compress[ZZ][ZZ]*p_corr_z;
598             for (d = 0; d < DIM-1; d++)
599             {
600                 mu[d][d] = 1.0 + factor(d, d)*(ir->ref_p[d][d]/(mu[ZZ][ZZ]*box[ZZ][ZZ])
601                                                - (pres[ZZ][ZZ]+p_corr_z - xy_pressure))/(DIM-1);
602             }
603             break;
604         default:
605             gmx_fatal(FARGS, "Berendsen pressure coupling type %s not supported yet\n",
606                       EPCOUPLTYPETYPE(ir->epct));
607             break;
608     }
609     /* To fullfill the orientation restrictions on triclinic boxes
610      * we will set mu_yx, mu_zx and mu_zy to 0 and correct
611      * the other elements of mu to first order.
612      */
613     mu[YY][XX] += mu[XX][YY];
614     mu[ZZ][XX] += mu[XX][ZZ];
615     mu[ZZ][YY] += mu[YY][ZZ];
616     mu[XX][YY]  = 0;
617     mu[XX][ZZ]  = 0;
618     mu[YY][ZZ]  = 0;
619
620     if (debug)
621     {
622         pr_rvecs(debug, 0, "PC: pres ", pres, 3);
623         pr_rvecs(debug, 0, "PC: mu   ", mu, 3);
624     }
625
626     if (mu[XX][XX] < 0.99 || mu[XX][XX] > 1.01 ||
627         mu[YY][YY] < 0.99 || mu[YY][YY] > 1.01 ||
628         mu[ZZ][ZZ] < 0.99 || mu[ZZ][ZZ] > 1.01)
629     {
630         char buf2[22];
631         sprintf(buf, "\nStep %s  Warning: pressure scaling more than 1%%, "
632                 "mu: %g %g %g\n",
633                 gmx_step_str(step, buf2), mu[XX][XX], mu[YY][YY], mu[ZZ][ZZ]);
634         if (fplog)
635         {
636             fprintf(fplog, "%s", buf);
637         }
638         fprintf(stderr, "%s", buf);
639     }
640 }
641
642 void berendsen_pscale(t_inputrec *ir, matrix mu,
643                       matrix box, matrix box_rel,
644                       int start, int nr_atoms,
645                       rvec x[], unsigned short cFREEZE[],
646                       t_nrnb *nrnb)
647 {
648     ivec   *nFreeze = ir->opts.nFreeze;
649     int     n, d, g = 0;
650
651     /* Scale the positions */
652     for (n = start; n < start+nr_atoms; n++)
653     {
654         if (cFREEZE)
655         {
656             g = cFREEZE[n];
657         }
658
659         if (!nFreeze[g][XX])
660         {
661             x[n][XX] = mu[XX][XX]*x[n][XX]+mu[YY][XX]*x[n][YY]+mu[ZZ][XX]*x[n][ZZ];
662         }
663         if (!nFreeze[g][YY])
664         {
665             x[n][YY] = mu[YY][YY]*x[n][YY]+mu[ZZ][YY]*x[n][ZZ];
666         }
667         if (!nFreeze[g][ZZ])
668         {
669             x[n][ZZ] = mu[ZZ][ZZ]*x[n][ZZ];
670         }
671     }
672     /* compute final boxlengths */
673     for (d = 0; d < DIM; d++)
674     {
675         box[d][XX] = mu[XX][XX]*box[d][XX]+mu[YY][XX]*box[d][YY]+mu[ZZ][XX]*box[d][ZZ];
676         box[d][YY] = mu[YY][YY]*box[d][YY]+mu[ZZ][YY]*box[d][ZZ];
677         box[d][ZZ] = mu[ZZ][ZZ]*box[d][ZZ];
678     }
679
680     preserve_box_shape(ir, box_rel, box);
681
682     /* (un)shifting should NOT be done after this,
683      * since the box vectors might have changed
684      */
685     inc_nrnb(nrnb, eNR_PCOUPL, nr_atoms);
686 }
687
688 void berendsen_tcoupl(t_inputrec *ir, gmx_ekindata_t *ekind, real dt)
689 {
690     t_grpopts *opts;
691     int        i;
692     real       T, reft = 0, lll;
693
694     opts = &ir->opts;
695
696     for (i = 0; (i < opts->ngtc); i++)
697     {
698         if (ir->eI == eiVV)
699         {
700             T = ekind->tcstat[i].T;
701         }
702         else
703         {
704             T = ekind->tcstat[i].Th;
705         }
706
707         if ((opts->tau_t[i] > 0) && (T > 0.0))
708         {
709             reft                    = max(0.0, opts->ref_t[i]);
710             lll                     = sqrt(1.0 + (dt/opts->tau_t[i])*(reft/T-1.0));
711             ekind->tcstat[i].lambda = max(min(lll, 1.25), 0.8);
712         }
713         else
714         {
715             ekind->tcstat[i].lambda = 1.0;
716         }
717
718         if (debug)
719         {
720             fprintf(debug, "TC: group %d: T: %g, Lambda: %g\n",
721                     i, T, ekind->tcstat[i].lambda);
722         }
723     }
724 }
725
726 void andersen_tcoupl(t_inputrec *ir, gmx_int64_t step,
727                      const t_commrec *cr, const t_mdatoms *md, t_state *state, real rate, const gmx_bool *randomize, const real *boltzfac)
728 {
729     const int *gatindex = (DOMAINDECOMP(cr) ? cr->dd->gatindex : NULL);
730     int        i;
731     int        gc = 0;
732
733     /* randomize the velocities of the selected particles */
734
735     for (i = 0; i < md->homenr; i++)  /* now loop over the list of atoms */
736     {
737         int      ng = gatindex ? gatindex[i] : i;
738         gmx_bool bRandomize;
739
740         if (md->cTC)
741         {
742             gc = md->cTC[i];  /* assign the atom to a temperature group if there are more than one */
743         }
744         if (randomize[gc])
745         {
746             if (ir->etc == etcANDERSENMASSIVE)
747             {
748                 /* Randomize particle always */
749                 bRandomize = TRUE;
750             }
751             else
752             {
753                 /* Randomize particle probabilistically */
754                 double uniform[2];
755
756                 gmx_rng_cycle_2uniform(step*2, ng, ir->andersen_seed, RND_SEED_ANDERSEN, uniform);
757                 bRandomize = (uniform[0] < rate);
758             }
759             if (bRandomize)
760             {
761                 real scal, gauss[3];
762                 int  d;
763
764                 scal = sqrt(boltzfac[gc]*md->invmass[i]);
765                 gmx_rng_cycle_3gaussian_table(step*2+1, ng, ir->andersen_seed, RND_SEED_ANDERSEN, gauss);
766                 for (d = 0; d < DIM; d++)
767                 {
768                     state->v[i][d] = scal*gauss[d];
769                 }
770             }
771         }
772     }
773 }
774
775
776 void nosehoover_tcoupl(t_grpopts *opts, gmx_ekindata_t *ekind, real dt,
777                        double xi[], double vxi[], t_extmass *MassQ)
778 {
779     int   i;
780     real  reft, oldvxi;
781
782     /* note that this routine does not include Nose-hoover chains yet. Should be easy to add. */
783
784     for (i = 0; (i < opts->ngtc); i++)
785     {
786         reft     = max(0.0, opts->ref_t[i]);
787         oldvxi   = vxi[i];
788         vxi[i]  += dt*MassQ->Qinv[i]*(ekind->tcstat[i].Th - reft);
789         xi[i]   += dt*(oldvxi + vxi[i])*0.5;
790     }
791 }
792
793 t_state *init_bufstate(const t_state *template_state)
794 {
795     t_state *state;
796     int      nc = template_state->nhchainlength;
797     snew(state, 1);
798     snew(state->nosehoover_xi, nc*template_state->ngtc);
799     snew(state->nosehoover_vxi, nc*template_state->ngtc);
800     snew(state->therm_integral, template_state->ngtc);
801     snew(state->nhpres_xi, nc*template_state->nnhpres);
802     snew(state->nhpres_vxi, nc*template_state->nnhpres);
803
804     return state;
805 }
806
807 void destroy_bufstate(t_state *state)
808 {
809     sfree(state->x);
810     sfree(state->v);
811     sfree(state->nosehoover_xi);
812     sfree(state->nosehoover_vxi);
813     sfree(state->therm_integral);
814     sfree(state->nhpres_xi);
815     sfree(state->nhpres_vxi);
816     sfree(state);
817 }
818
819 void trotter_update(t_inputrec *ir, gmx_int64_t step, gmx_ekindata_t *ekind,
820                     gmx_enerdata_t *enerd, t_state *state,
821                     tensor vir, t_mdatoms *md,
822                     t_extmass *MassQ, int **trotter_seqlist, int trotter_seqno)
823 {
824
825     int             n, i, j, d, ntgrp, ngtc, gc = 0, t;
826     t_grp_tcstat   *tcstat;
827     t_grpopts      *opts;
828     gmx_int64_t     step_eff;
829     real            ecorr, pcorr, dvdlcorr;
830     real            bmass, qmass, reft, kT, dt, nd;
831     tensor          dumpres, dumvir;
832     double         *scalefac, dtc;
833     int            *trotter_seq;
834     rvec            sumv = {0, 0, 0}, consk;
835     gmx_bool        bCouple;
836
837     if (trotter_seqno <= ettTSEQ2)
838     {
839         step_eff = step-1;  /* the velocity verlet calls are actually out of order -- the first half step
840                                is actually the last half step from the previous step.  Thus the first half step
841                                actually corresponds to the n-1 step*/
842
843     }
844     else
845     {
846         step_eff = step;
847     }
848
849     bCouple = (ir->nsttcouple == 1 ||
850                do_per_step(step_eff+ir->nsttcouple, ir->nsttcouple));
851
852     trotter_seq = trotter_seqlist[trotter_seqno];
853
854     if ((trotter_seq[0] == etrtSKIPALL) || (!bCouple))
855     {
856         return;
857     }
858     dtc  = ir->nsttcouple*ir->delta_t; /* This is OK for NPT, because nsttcouple == nstpcouple is enforcesd */
859     opts = &(ir->opts);                /* just for ease of referencing */
860     ngtc = opts->ngtc;
861     assert(ngtc > 0);
862     snew(scalefac, opts->ngtc);
863     for (i = 0; i < ngtc; i++)
864     {
865         scalefac[i] = 1;
866     }
867     /* execute the series of trotter updates specified in the trotterpart array */
868
869     for (i = 0; i < NTROTTERPARTS; i++)
870     {
871         /* allow for doubled intgrators by doubling dt instead of making 2 calls */
872         if ((trotter_seq[i] == etrtBAROV2) || (trotter_seq[i] == etrtBARONHC2) || (trotter_seq[i] == etrtNHC2))
873         {
874             dt = 2 * dtc;
875         }
876         else
877         {
878             dt = dtc;
879         }
880
881         switch (trotter_seq[i])
882         {
883             case etrtBAROV:
884             case etrtBAROV2:
885                 boxv_trotter(ir, &(state->veta), dt, state->box, ekind, vir,
886                              enerd->term[F_PDISPCORR], MassQ);
887                 break;
888             case etrtBARONHC:
889             case etrtBARONHC2:
890                 NHC_trotter(opts, state->nnhpres, ekind, dt, state->nhpres_xi,
891                             state->nhpres_vxi, NULL, &(state->veta), MassQ, FALSE);
892                 break;
893             case etrtNHC:
894             case etrtNHC2:
895                 NHC_trotter(opts, opts->ngtc, ekind, dt, state->nosehoover_xi,
896                             state->nosehoover_vxi, scalefac, NULL, MassQ, (ir->eI == eiVV));
897                 /* need to rescale the kinetic energies and velocities here.  Could
898                    scale the velocities later, but we need them scaled in order to
899                    produce the correct outputs, so we'll scale them here. */
900
901                 for (t = 0; t < ngtc; t++)
902                 {
903                     tcstat                  = &ekind->tcstat[t];
904                     tcstat->vscale_nhc      = scalefac[t];
905                     tcstat->ekinscaleh_nhc *= (scalefac[t]*scalefac[t]);
906                     tcstat->ekinscalef_nhc *= (scalefac[t]*scalefac[t]);
907                 }
908                 /* now that we've scaled the groupwise velocities, we can add them up to get the total */
909                 /* but do we actually need the total? */
910
911                 /* modify the velocities as well */
912                 for (n = 0; n < md->homenr; n++)
913                 {
914                     if (md->cTC) /* does this conditional need to be here? is this always true?*/
915                     {
916                         gc = md->cTC[n];
917                     }
918                     for (d = 0; d < DIM; d++)
919                     {
920                         state->v[n][d] *= scalefac[gc];
921                     }
922
923                     if (debug)
924                     {
925                         for (d = 0; d < DIM; d++)
926                         {
927                             sumv[d] += (state->v[n][d])/md->invmass[n];
928                         }
929                     }
930                 }
931                 break;
932             default:
933                 break;
934         }
935     }
936     /* check for conserved momentum -- worth looking at this again eventually, but not working right now.*/
937 #if 0
938     if (debug)
939     {
940         if (bFirstHalf)
941         {
942             for (d = 0; d < DIM; d++)
943             {
944                 consk[d] = sumv[d]*exp((1 + 1.0/opts->nrdf[0])*((1.0/DIM)*log(det(state->box)/state->vol0)) + state->nosehoover_xi[0]);
945             }
946             fprintf(debug, "Conserved kappa: %15.8f %15.8f %15.8f\n", consk[0], consk[1], consk[2]);
947         }
948     }
949 #endif
950     sfree(scalefac);
951 }
952
953
954 extern void init_npt_masses(t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bInit)
955 {
956     int           n, i, j, d, ntgrp, ngtc, nnhpres, nh, gc = 0;
957     t_grp_tcstat *tcstat;
958     t_grpopts    *opts;
959     real          ecorr, pcorr, dvdlcorr;
960     real          bmass, qmass, reft, kT, dt, ndj, nd;
961     tensor        dumpres, dumvir;
962
963     opts    = &(ir->opts); /* just for ease of referencing */
964     ngtc    = ir->opts.ngtc;
965     nnhpres = state->nnhpres;
966     nh      = state->nhchainlength;
967
968     if (ir->eI == eiMD)
969     {
970         if (bInit)
971         {
972             snew(MassQ->Qinv, ngtc);
973         }
974         for (i = 0; (i < ngtc); i++)
975         {
976             if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
977             {
978                 MassQ->Qinv[i] = 1.0/(sqr(opts->tau_t[i]/M_2PI)*opts->ref_t[i]);
979             }
980             else
981             {
982                 MassQ->Qinv[i] = 0.0;
983             }
984         }
985     }
986     else if (EI_VV(ir->eI))
987     {
988         /* Set pressure variables */
989
990         if (bInit)
991         {
992             if (state->vol0 == 0)
993             {
994                 state->vol0 = det(state->box);
995                 /* because we start by defining a fixed
996                    compressibility, we need the volume at this
997                    compressibility to solve the problem. */
998             }
999         }
1000
1001         /* units are nm^3 * ns^2 / (nm^3 * bar / kJ/mol) = kJ/mol  */
1002         /* Consider evaluating eventually if this the right mass to use.  All are correct, some might be more stable  */
1003         MassQ->Winv = (PRESFAC*trace(ir->compress)*BOLTZ*opts->ref_t[0])/(DIM*state->vol0*sqr(ir->tau_p/M_2PI));
1004         /* An alternate mass definition, from Tuckerman et al. */
1005         /* MassQ->Winv = 1.0/(sqr(ir->tau_p/M_2PI)*(opts->nrdf[0]+DIM)*BOLTZ*opts->ref_t[0]); */
1006         for (d = 0; d < DIM; d++)
1007         {
1008             for (n = 0; n < DIM; n++)
1009             {
1010                 MassQ->Winvm[d][n] = PRESFAC*ir->compress[d][n]/(state->vol0*sqr(ir->tau_p/M_2PI));
1011                 /* not clear this is correct yet for the anisotropic case. Will need to reevaluate
1012                    before using MTTK for anisotropic states.*/
1013             }
1014         }
1015         /* Allocate space for thermostat variables */
1016         if (bInit)
1017         {
1018             snew(MassQ->Qinv, ngtc*nh);
1019         }
1020
1021         /* now, set temperature variables */
1022         for (i = 0; i < ngtc; i++)
1023         {
1024             if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
1025             {
1026                 reft = max(0.0, opts->ref_t[i]);
1027                 nd   = opts->nrdf[i];
1028                 kT   = BOLTZ*reft;
1029                 for (j = 0; j < nh; j++)
1030                 {
1031                     if (j == 0)
1032                     {
1033                         ndj = nd;
1034                     }
1035                     else
1036                     {
1037                         ndj = 1;
1038                     }
1039                     MassQ->Qinv[i*nh+j]   = 1.0/(sqr(opts->tau_t[i]/M_2PI)*ndj*kT);
1040                 }
1041             }
1042             else
1043             {
1044                 reft = 0.0;
1045                 for (j = 0; j < nh; j++)
1046                 {
1047                     MassQ->Qinv[i*nh+j] = 0.0;
1048                 }
1049             }
1050         }
1051     }
1052 }
1053
1054 int **init_npt_vars(t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bTrotter)
1055 {
1056     int           n, i, j, d, ntgrp, ngtc, nnhpres, nh, gc = 0;
1057     t_grp_tcstat *tcstat;
1058     t_grpopts    *opts;
1059     real          ecorr, pcorr, dvdlcorr;
1060     real          bmass, qmass, reft, kT, dt, ndj, nd;
1061     tensor        dumpres, dumvir;
1062     int         **trotter_seq;
1063
1064     opts    = &(ir->opts); /* just for ease of referencing */
1065     ngtc    = state->ngtc;
1066     nnhpres = state->nnhpres;
1067     nh      = state->nhchainlength;
1068
1069     init_npt_masses(ir, state, MassQ, TRUE);
1070
1071     /* first, initialize clear all the trotter calls */
1072     snew(trotter_seq, ettTSEQMAX);
1073     for (i = 0; i < ettTSEQMAX; i++)
1074     {
1075         snew(trotter_seq[i], NTROTTERPARTS);
1076         for (j = 0; j < NTROTTERPARTS; j++)
1077         {
1078             trotter_seq[i][j] = etrtNONE;
1079         }
1080         trotter_seq[i][0] = etrtSKIPALL;
1081     }
1082
1083     if (!bTrotter)
1084     {
1085         /* no trotter calls, so we never use the values in the array.
1086          * We access them (so we need to define them, but ignore
1087          * then.*/
1088
1089         return trotter_seq;
1090     }
1091
1092     /* compute the kinetic energy by using the half step velocities or
1093      * the kinetic energies, depending on the order of the trotter calls */
1094
1095     if (ir->eI == eiVV)
1096     {
1097         if (IR_NPT_TROTTER(ir))
1098         {
1099             /* This is the complicated version - there are 4 possible calls, depending on ordering.
1100                We start with the initial one. */
1101             /* first, a round that estimates veta. */
1102             trotter_seq[0][0] = etrtBAROV;
1103
1104             /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
1105
1106             /* The first half trotter update */
1107             trotter_seq[2][0] = etrtBAROV;
1108             trotter_seq[2][1] = etrtNHC;
1109             trotter_seq[2][2] = etrtBARONHC;
1110
1111             /* The second half trotter update */
1112             trotter_seq[3][0] = etrtBARONHC;
1113             trotter_seq[3][1] = etrtNHC;
1114             trotter_seq[3][2] = etrtBAROV;
1115
1116             /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
1117
1118         }
1119         else if (IR_NVT_TROTTER(ir))
1120         {
1121             /* This is the easy version - there are only two calls, both the same.
1122                Otherwise, even easier -- no calls  */
1123             trotter_seq[2][0] = etrtNHC;
1124             trotter_seq[3][0] = etrtNHC;
1125         }
1126         else if (IR_NPH_TROTTER(ir))
1127         {
1128             /* This is the complicated version - there are 4 possible calls, depending on ordering.
1129                We start with the initial one. */
1130             /* first, a round that estimates veta. */
1131             trotter_seq[0][0] = etrtBAROV;
1132
1133             /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
1134
1135             /* The first half trotter update */
1136             trotter_seq[2][0] = etrtBAROV;
1137             trotter_seq[2][1] = etrtBARONHC;
1138
1139             /* The second half trotter update */
1140             trotter_seq[3][0] = etrtBARONHC;
1141             trotter_seq[3][1] = etrtBAROV;
1142
1143             /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
1144         }
1145     }
1146     else if (ir->eI == eiVVAK)
1147     {
1148         if (IR_NPT_TROTTER(ir))
1149         {
1150             /* This is the complicated version - there are 4 possible calls, depending on ordering.
1151                We start with the initial one. */
1152             /* first, a round that estimates veta. */
1153             trotter_seq[0][0] = etrtBAROV;
1154
1155             /* The first half trotter update, part 1 -- double update, because it commutes */
1156             trotter_seq[1][0] = etrtNHC;
1157
1158             /* The first half trotter update, part 2 */
1159             trotter_seq[2][0] = etrtBAROV;
1160             trotter_seq[2][1] = etrtBARONHC;
1161
1162             /* The second half trotter update, part 1 */
1163             trotter_seq[3][0] = etrtBARONHC;
1164             trotter_seq[3][1] = etrtBAROV;
1165
1166             /* The second half trotter update */
1167             trotter_seq[4][0] = etrtNHC;
1168         }
1169         else if (IR_NVT_TROTTER(ir))
1170         {
1171             /* This is the easy version - there is only one call, both the same.
1172                Otherwise, even easier -- no calls  */
1173             trotter_seq[1][0] = etrtNHC;
1174             trotter_seq[4][0] = etrtNHC;
1175         }
1176         else if (IR_NPH_TROTTER(ir))
1177         {
1178             /* This is the complicated version - there are 4 possible calls, depending on ordering.
1179                We start with the initial one. */
1180             /* first, a round that estimates veta. */
1181             trotter_seq[0][0] = etrtBAROV;
1182
1183             /* The first half trotter update, part 1 -- leave zero */
1184             trotter_seq[1][0] = etrtNHC;
1185
1186             /* The first half trotter update, part 2 */
1187             trotter_seq[2][0] = etrtBAROV;
1188             trotter_seq[2][1] = etrtBARONHC;
1189
1190             /* The second half trotter update, part 1 */
1191             trotter_seq[3][0] = etrtBARONHC;
1192             trotter_seq[3][1] = etrtBAROV;
1193
1194             /* The second half trotter update -- blank for now */
1195         }
1196     }
1197
1198     switch (ir->epct)
1199     {
1200         case epctISOTROPIC:
1201         default:
1202             bmass = DIM*DIM; /* recommended mass parameters for isotropic barostat */
1203     }
1204
1205     snew(MassQ->QPinv, nnhpres*opts->nhchainlength);
1206
1207     /* barostat temperature */
1208     if ((ir->tau_p > 0) && (opts->ref_t[0] > 0))
1209     {
1210         reft = max(0.0, opts->ref_t[0]);
1211         kT   = BOLTZ*reft;
1212         for (i = 0; i < nnhpres; i++)
1213         {
1214             for (j = 0; j < nh; j++)
1215             {
1216                 if (j == 0)
1217                 {
1218                     qmass = bmass;
1219                 }
1220                 else
1221                 {
1222                     qmass = 1;
1223                 }
1224                 MassQ->QPinv[i*opts->nhchainlength+j]   = 1.0/(sqr(opts->tau_t[0]/M_2PI)*qmass*kT);
1225             }
1226         }
1227     }
1228     else
1229     {
1230         for (i = 0; i < nnhpres; i++)
1231         {
1232             for (j = 0; j < nh; j++)
1233             {
1234                 MassQ->QPinv[i*nh+j] = 0.0;
1235             }
1236         }
1237     }
1238     return trotter_seq;
1239 }
1240
1241 real NPT_energy(t_inputrec *ir, t_state *state, t_extmass *MassQ)
1242 {
1243     int     i, j, nd, ndj, bmass, qmass, ngtcall;
1244     real    ener_npt, reft, eta, kT, tau;
1245     double *ivxi, *ixi;
1246     double *iQinv;
1247     real    vol, dbaro, W, Q;
1248     int     nh = state->nhchainlength;
1249
1250     ener_npt = 0;
1251
1252     /* now we compute the contribution of the pressure to the conserved quantity*/
1253
1254     if (ir->epc == epcMTTK)
1255     {
1256         /* find the volume, and the kinetic energy of the volume */
1257
1258         switch (ir->epct)
1259         {
1260
1261             case epctISOTROPIC:
1262                 /* contribution from the pressure momenenta */
1263                 ener_npt += 0.5*sqr(state->veta)/MassQ->Winv;
1264
1265                 /* contribution from the PV term */
1266                 vol       = det(state->box);
1267                 ener_npt += vol*trace(ir->ref_p)/(DIM*PRESFAC);
1268
1269                 break;
1270             case epctANISOTROPIC:
1271
1272                 break;
1273
1274             case epctSURFACETENSION:
1275
1276                 break;
1277             case epctSEMIISOTROPIC:
1278
1279                 break;
1280             default:
1281                 break;
1282         }
1283     }
1284
1285     if (IR_NPT_TROTTER(ir) || IR_NPH_TROTTER(ir))
1286     {
1287         /* add the energy from the barostat thermostat chain */
1288         for (i = 0; i < state->nnhpres; i++)
1289         {
1290
1291             /* note -- assumes only one degree of freedom that is thermostatted in barostat */
1292             ivxi  = &state->nhpres_vxi[i*nh];
1293             ixi   = &state->nhpres_xi[i*nh];
1294             iQinv = &(MassQ->QPinv[i*nh]);
1295             reft  = max(ir->opts.ref_t[0], 0); /* using 'System' temperature */
1296             kT    = BOLTZ * reft;
1297
1298             for (j = 0; j < nh; j++)
1299             {
1300                 if (iQinv[j] > 0)
1301                 {
1302                     ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1303                     /* contribution from the thermal variable of the NH chain */
1304                     ener_npt += ixi[j]*kT;
1305                 }
1306                 if (debug)
1307                 {
1308                     fprintf(debug, "P-T-group: %10d Chain %4d ThermV: %15.8f ThermX: %15.8f", i, j, ivxi[j], ixi[j]);
1309                 }
1310             }
1311         }
1312     }
1313
1314     if (ir->etc)
1315     {
1316         for (i = 0; i < ir->opts.ngtc; i++)
1317         {
1318             ixi   = &state->nosehoover_xi[i*nh];
1319             ivxi  = &state->nosehoover_vxi[i*nh];
1320             iQinv = &(MassQ->Qinv[i*nh]);
1321
1322             nd   = ir->opts.nrdf[i];
1323             reft = max(ir->opts.ref_t[i], 0);
1324             kT   = BOLTZ * reft;
1325
1326             if (nd > 0)
1327             {
1328                 if (IR_NVT_TROTTER(ir))
1329                 {
1330                     /* contribution from the thermal momenta of the NH chain */
1331                     for (j = 0; j < nh; j++)
1332                     {
1333                         if (iQinv[j] > 0)
1334                         {
1335                             ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1336                             /* contribution from the thermal variable of the NH chain */
1337                             if (j == 0)
1338                             {
1339                                 ndj = nd;
1340                             }
1341                             else
1342                             {
1343                                 ndj = 1;
1344                             }
1345                             ener_npt += ndj*ixi[j]*kT;
1346                         }
1347                     }
1348                 }
1349                 else  /* Other non Trotter temperature NH control  -- no chains yet. */
1350                 {
1351                     ener_npt += 0.5*BOLTZ*nd*sqr(ivxi[0])/iQinv[0];
1352                     ener_npt += nd*ixi[0]*kT;
1353                 }
1354             }
1355         }
1356     }
1357     return ener_npt;
1358 }
1359
1360 static real vrescale_gamdev(real ia,
1361                             gmx_int64_t step, gmx_int64_t *count,
1362                             gmx_int64_t seed1, gmx_int64_t seed2)
1363 /* Gamma distribution, adapted from numerical recipes */
1364 {
1365     real   am, e, s, v1, v2, x, y;
1366     double rnd[2];
1367
1368     assert(ia > 1);
1369
1370     do
1371     {
1372         do
1373         {
1374             do
1375             {
1376                 gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1377                 v1 = rnd[0];
1378                 v2 = 2.0*rnd[1] - 1.0;
1379             }
1380             while (v1*v1 + v2*v2 > 1.0 ||
1381                    v1*v1*GMX_REAL_MAX < 3.0*ia);
1382             /* The last check above ensures that both x (3.0 > 2.0 in s)
1383              * and the pre-factor for e do not go out of range.
1384              */
1385             y  = v2/v1;
1386             am = ia - 1;
1387             s  = sqrt(2.0*am + 1.0);
1388             x  = s*y + am;
1389         }
1390         while (x <= 0.0);
1391
1392         e = (1.0 + y*y)*exp(am*log(x/am) - s*y);
1393
1394         gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1395     }
1396     while (rnd[0] > e);
1397
1398     return x;
1399 }
1400
1401 static real gaussian_count(gmx_int64_t step, gmx_int64_t *count,
1402                            gmx_int64_t seed1, gmx_int64_t seed2)
1403 {
1404     double rnd[2], x, y, r;
1405
1406     do
1407     {
1408         gmx_rng_cycle_2uniform(step, (*count)++, seed1, seed2, rnd);
1409         x = 2.0*rnd[0] - 1.0;
1410         y = 2.0*rnd[1] - 1.0;
1411         r = x*x + y*y;
1412     }
1413     while (r > 1.0 || r == 0.0);
1414
1415     r = sqrt(-2.0*log(r)/r);
1416
1417     return x*r;
1418 }
1419
1420 static real vrescale_sumnoises(real nn,
1421                                gmx_int64_t step, gmx_int64_t *count,
1422                                gmx_int64_t seed1, gmx_int64_t seed2)
1423 {
1424 /*
1425  * Returns the sum of nn independent gaussian noises squared
1426  * (i.e. equivalent to summing the square of the return values
1427  * of nn calls to gmx_rng_gaussian_real).
1428  */
1429     const real ndeg_tol = 0.0001;
1430     real       r;
1431
1432     if (nn < 2 + ndeg_tol)
1433     {
1434         int  nn_int, i;
1435         real gauss;
1436
1437         nn_int = (int)(nn + 0.5);
1438
1439         if (nn - nn_int < -ndeg_tol || nn - nn_int > ndeg_tol)
1440         {
1441             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);
1442         }
1443
1444         r = 0;
1445         for (i = 0; i < nn_int; i++)
1446         {
1447             gauss = gaussian_count(step, count, seed1, seed2);
1448
1449             r += gauss*gauss;
1450         }
1451     }
1452     else
1453     {
1454         /* Use a gamma distribution for any real nn > 2 */
1455         r = 2.0*vrescale_gamdev(0.5*nn, step, count, seed1, seed2);
1456     }
1457
1458     return r;
1459 }
1460
1461 static real vrescale_resamplekin(real kk, real sigma, real ndeg, real taut,
1462                                  gmx_int64_t step, gmx_int64_t seed)
1463 {
1464 /*
1465  * Generates a new value for the kinetic energy,
1466  * according to Bussi et al JCP (2007), Eq. (A7)
1467  * kk:    present value of the kinetic energy of the atoms to be thermalized (in arbitrary units)
1468  * sigma: target average value of the kinetic energy (ndeg k_b T/2)  (in the same units as kk)
1469  * ndeg:  number of degrees of freedom of the atoms to be thermalized
1470  * taut:  relaxation time of the thermostat, in units of 'how often this routine is called'
1471  */
1472     /* rnd_count tracks the step-local state for the cycle random
1473      * number generator.
1474      */
1475     gmx_int64_t rnd_count = 0;
1476     real        factor, rr, ekin_new;
1477
1478     if (taut > 0.1)
1479     {
1480         factor = exp(-1.0/taut);
1481     }
1482     else
1483     {
1484         factor = 0.0;
1485     }
1486
1487     rr = gaussian_count(step, &rnd_count, seed, RND_SEED_VRESCALE);
1488
1489     ekin_new =
1490         kk +
1491         (1.0 - factor)*(sigma*(vrescale_sumnoises(ndeg-1, step, &rnd_count, seed, RND_SEED_VRESCALE) + rr*rr)/ndeg - kk) +
1492         2.0*rr*sqrt(kk*sigma/ndeg*(1.0 - factor)*factor);
1493
1494     return ekin_new;
1495 }
1496
1497 void vrescale_tcoupl(t_inputrec *ir, gmx_int64_t step,
1498                      gmx_ekindata_t *ekind, real dt,
1499                      double therm_integral[])
1500 {
1501     t_grpopts *opts;
1502     int        i;
1503     real       Ek, Ek_ref1, Ek_ref, Ek_new;
1504
1505     opts = &ir->opts;
1506
1507     for (i = 0; (i < opts->ngtc); i++)
1508     {
1509         if (ir->eI == eiVV)
1510         {
1511             Ek = trace(ekind->tcstat[i].ekinf);
1512         }
1513         else
1514         {
1515             Ek = trace(ekind->tcstat[i].ekinh);
1516         }
1517
1518         if (opts->tau_t[i] >= 0 && opts->nrdf[i] > 0 && Ek > 0)
1519         {
1520             Ek_ref1 = 0.5*opts->ref_t[i]*BOLTZ;
1521             Ek_ref  = Ek_ref1*opts->nrdf[i];
1522
1523             Ek_new  = vrescale_resamplekin(Ek, Ek_ref, opts->nrdf[i],
1524                                            opts->tau_t[i]/dt,
1525                                            step, ir->ld_seed);
1526
1527             /* Analytically Ek_new>=0, but we check for rounding errors */
1528             if (Ek_new <= 0)
1529             {
1530                 ekind->tcstat[i].lambda = 0.0;
1531             }
1532             else
1533             {
1534                 ekind->tcstat[i].lambda = sqrt(Ek_new/Ek);
1535             }
1536
1537             therm_integral[i] -= Ek_new - Ek;
1538
1539             if (debug)
1540             {
1541                 fprintf(debug, "TC: group %d: Ekr %g, Ek %g, Ek_new %g, Lambda: %g\n",
1542                         i, Ek_ref, Ek, Ek_new, ekind->tcstat[i].lambda);
1543             }
1544         }
1545         else
1546         {
1547             ekind->tcstat[i].lambda = 1.0;
1548         }
1549     }
1550 }
1551
1552 real vrescale_energy(t_grpopts *opts, double therm_integral[])
1553 {
1554     int  i;
1555     real ener;
1556
1557     ener = 0;
1558     for (i = 0; i < opts->ngtc; i++)
1559     {
1560         ener += therm_integral[i];
1561     }
1562
1563     return ener;
1564 }
1565
1566 void rescale_velocities(gmx_ekindata_t *ekind, t_mdatoms *mdatoms,
1567                         int start, int end, rvec v[])
1568 {
1569     t_grp_acc      *gstat;
1570     t_grp_tcstat   *tcstat;
1571     unsigned short *cACC, *cTC;
1572     int             ga, gt, n, d;
1573     real            lg;
1574     rvec            vrel;
1575
1576     tcstat = ekind->tcstat;
1577     cTC    = mdatoms->cTC;
1578
1579     if (ekind->bNEMD)
1580     {
1581         gstat  = ekind->grpstat;
1582         cACC   = mdatoms->cACC;
1583
1584         ga = 0;
1585         gt = 0;
1586         for (n = start; n < end; n++)
1587         {
1588             if (cACC)
1589             {
1590                 ga   = cACC[n];
1591             }
1592             if (cTC)
1593             {
1594                 gt   = cTC[n];
1595             }
1596             /* Only scale the velocity component relative to the COM velocity */
1597             rvec_sub(v[n], gstat[ga].u, vrel);
1598             lg = tcstat[gt].lambda;
1599             for (d = 0; d < DIM; d++)
1600             {
1601                 v[n][d] = gstat[ga].u[d] + lg*vrel[d];
1602             }
1603         }
1604     }
1605     else
1606     {
1607         gt = 0;
1608         for (n = start; n < end; n++)
1609         {
1610             if (cTC)
1611             {
1612                 gt   = cTC[n];
1613             }
1614             lg = tcstat[gt].lambda;
1615             for (d = 0; d < DIM; d++)
1616             {
1617                 v[n][d] *= lg;
1618             }
1619         }
1620     }
1621 }
1622
1623
1624 /* set target temperatures if we are annealing */
1625 void update_annealing_target_temp(t_grpopts *opts, real t)
1626 {
1627     int  i, j, n, npoints;
1628     real pert, thist = 0, x;
1629
1630     for (i = 0; i < opts->ngtc; i++)
1631     {
1632         npoints = opts->anneal_npoints[i];
1633         switch (opts->annealing[i])
1634         {
1635             case eannNO:
1636                 continue;
1637             case  eannPERIODIC:
1638                 /* calculate time modulo the period */
1639                 pert  = opts->anneal_time[i][npoints-1];
1640                 n     = t / pert;
1641                 thist = t - n*pert; /* modulo time */
1642                 /* Make sure rounding didn't get us outside the interval */
1643                 if (fabs(thist-pert) < GMX_REAL_EPS*100)
1644                 {
1645                     thist = 0;
1646                 }
1647                 break;
1648             case eannSINGLE:
1649                 thist = t;
1650                 break;
1651             default:
1652                 gmx_fatal(FARGS, "Death horror in update_annealing_target_temp (i=%d/%d npoints=%d)", i, opts->ngtc, npoints);
1653         }
1654         /* We are doing annealing for this group if we got here,
1655          * and we have the (relative) time as thist.
1656          * calculate target temp */
1657         j = 0;
1658         while ((j < npoints-1) && (thist > (opts->anneal_time[i][j+1])))
1659         {
1660             j++;
1661         }
1662         if (j < npoints-1)
1663         {
1664             /* Found our position between points j and j+1.
1665              * Interpolate: x is the amount from j+1, (1-x) from point j
1666              * First treat possible jumps in temperature as a special case.
1667              */
1668             if ((opts->anneal_time[i][j+1]-opts->anneal_time[i][j]) < GMX_REAL_EPS*100)
1669             {
1670                 opts->ref_t[i] = opts->anneal_temp[i][j+1];
1671             }
1672             else
1673             {
1674                 x = ((thist-opts->anneal_time[i][j])/
1675                      (opts->anneal_time[i][j+1]-opts->anneal_time[i][j]));
1676                 opts->ref_t[i] = x*opts->anneal_temp[i][j+1]+(1-x)*opts->anneal_temp[i][j];
1677             }
1678         }
1679         else
1680         {
1681             opts->ref_t[i] = opts->anneal_temp[i][npoints-1];
1682         }
1683     }
1684 }