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