Merge branch 'master' of git://git.gromacs.org/gromacs
[gromacs/adressmacs.git] / src / mdlib / coupling.c
blobfb384823a24dedb5be4aaf0c1aecc364f2adfc2e
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.
15 * This program is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU General Public License
17 * as published by the Free Software Foundation; either version 2
18 * of the License, or (at your option) any later version.
20 * If you want to redistribute modifications, please consider that
21 * scientific software is very special. Version control is crucial -
22 * bugs must be traceable. We will be happy to consider code for
23 * inclusion in the official distribution, but derived work must not
24 * be called official GROMACS. Details are found in the README & COPYING
25 * files - if they are missing, get the official version at www.gromacs.org.
27 * To help us fund GROMACS development, we humbly ask that you cite
28 * the papers on the package - you can find them in the top README file.
30 * For more info, check our website at http://www.gromacs.org
32 * And Hey:
33 * GROwing Monsters And Cloning Shrimps
35 #ifdef HAVE_CONFIG_H
36 #include <config.h>
37 #endif
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"
53 #define NTROTTERPARTS 3
55 /* these integration routines are only referenced inside this file */
56 static void NHC_trotter(t_grpopts *opts,int nvar, gmx_ekindata_t *ekind,real dtfull,
57 double xi[],double vxi[], double scalefac[], real *veta, t_extmass *MassQ, gmx_bool bEkinAveVel)
60 /* general routine for both barostat and thermostat nose hoover chains */
62 int i,j,mi,mj,jmax,nd;
63 double Ekin,Efac,reft,kT;
64 double dt;
65 t_grp_tcstat *tcstat;
66 double *ivxi,*ixi;
67 double *iQinv;
68 double *GQ;
69 gmx_bool bBarostat;
70 int mstepsi, mstepsj;
71 int ns = SUZUKI_YOSHIDA_NUM; /* set the degree of integration in the types/state.h file */
72 int nh = opts->nhchainlength;
74 snew(GQ,nh);
75 mstepsi = mstepsj = ns;
77 /* if scalefac is NULL, we are doing the NHC of the barostat */
79 bBarostat = FALSE;
80 if (scalefac == NULL) {
81 bBarostat = TRUE;
84 for (i=0; i<nvar; i++)
87 /* make it easier to iterate by selecting
88 out the sub-array that corresponds to this T group */
90 ivxi = &vxi[i*nh];
91 ixi = &xi[i*nh];
92 if (bBarostat) {
93 iQinv = &(MassQ->QPinv[i*nh]);
94 nd = 1; /* THIS WILL CHANGE IF NOT ISOTROPIC */
95 reft = max(0.0,opts->ref_t[0]);
96 Ekin = sqr(*veta)/MassQ->Winv;
97 } else {
98 iQinv = &(MassQ->Qinv[i*nh]);
99 tcstat = &ekind->tcstat[i];
100 nd = opts->nrdf[i];
101 reft = max(0.0,opts->ref_t[i]);
102 if (bEkinAveVel)
104 Ekin = 2*trace(tcstat->ekinf)*tcstat->ekinscalef_nhc;
105 } else {
106 Ekin = 2*trace(tcstat->ekinh)*tcstat->ekinscaleh_nhc;
109 kT = BOLTZ*reft;
111 for(mi=0;mi<mstepsi;mi++)
113 for(mj=0;mj<mstepsj;mj++)
115 /* weighting for this step using Suzuki-Yoshida integration - fixed at 5 */
116 dt = sy_const[ns][mj] * dtfull / mstepsi;
118 /* compute the thermal forces */
119 GQ[0] = iQinv[0]*(Ekin - nd*kT);
121 for (j=0;j<nh-1;j++)
123 if (iQinv[j+1] > 0) {
124 /* we actually don't need to update here if we save the
125 state of the GQ, but it's easier to just recompute*/
126 GQ[j+1] = iQinv[j+1]*((sqr(ivxi[j])/iQinv[j])-kT);
127 } else {
128 GQ[j+1] = 0;
132 ivxi[nh-1] += 0.25*dt*GQ[nh-1];
133 for (j=nh-1;j>0;j--)
135 Efac = exp(-0.125*dt*ivxi[j]);
136 ivxi[j-1] = Efac*(ivxi[j-1]*Efac + 0.25*dt*GQ[j-1]);
139 Efac = exp(-0.5*dt*ivxi[0]);
140 if (bBarostat) {
141 *veta *= Efac;
142 } else {
143 scalefac[i] *= Efac;
145 Ekin *= (Efac*Efac);
147 /* Issue - if the KE is an average of the last and the current temperatures, then we might not be
148 able to scale the kinetic energy directly with this factor. Might take more bookkeeping -- have to
149 think about this a bit more . . . */
151 GQ[0] = iQinv[0]*(Ekin - nd*kT);
153 /* update thermostat positions */
154 for (j=0;j<nh;j++)
156 ixi[j] += 0.5*dt*ivxi[j];
159 for (j=0;j<nh-1;j++)
161 Efac = exp(-0.125*dt*ivxi[j+1]);
162 ivxi[j] = Efac*(ivxi[j]*Efac + 0.25*dt*GQ[j]);
163 if (iQinv[j+1] > 0) {
164 GQ[j+1] = iQinv[j+1]*((sqr(ivxi[j])/iQinv[j])-kT);
165 } else {
166 GQ[j+1] = 0;
169 ivxi[nh-1] += 0.25*dt*GQ[nh-1];
173 sfree(GQ);
176 static void boxv_trotter(t_inputrec *ir, real *veta, real dt, tensor box,
177 gmx_ekindata_t *ekind, tensor vir, real pcorr, real ecorr, t_extmass *MassQ)
180 real pscal;
181 double alpha;
182 int i,j,d,n,nwall;
183 real T,GW,vol;
184 tensor Winvm,ekinmod,localpres;
186 /* The heat bath is coupled to a separate barostat, the last temperature group. In the
187 2006 Tuckerman et al paper., the order is iL_{T_baro} iL {T_part}
190 if (ir->epct==epctSEMIISOTROPIC)
192 nwall = 2;
194 else
196 nwall = 3;
199 /* eta is in pure units. veta is in units of ps^-1. GW is in
200 units of ps^-2. However, eta has a reference of 1 nm^3, so care must be
201 taken to use only RATIOS of eta in updating the volume. */
203 /* we take the partial pressure tensors, modify the
204 kinetic energy tensor, and recovert to pressure */
206 if (ir->opts.nrdf[0]==0)
208 gmx_fatal(FARGS,"Barostat is coupled to a T-group with no degrees of freedom\n");
210 /* alpha factor for phase space volume, then multiply by the ekin scaling factor. */
211 alpha = 1.0 + DIM/((double)ir->opts.nrdf[0]);
212 alpha *= ekind->tcstat[0].ekinscalef_nhc;
213 msmul(ekind->ekin,alpha,ekinmod);
215 /* for now, we use Elr = 0, because if you want to get it right, you
216 really should be using PME. Maybe print a warning? */
218 pscal = calc_pres(ir->ePBC,nwall,box,ekinmod,vir,localpres,0.0) + pcorr;
220 vol = det(box);
221 GW = (vol*(MassQ->Winv/PRESFAC))*(DIM*pscal - trace(ir->ref_p)); /* W is in ps^2 * bar * nm^3 */
223 *veta += 0.5*dt*GW;
227 * This file implements temperature and pressure coupling algorithms:
228 * For now only the Weak coupling and the modified weak coupling.
230 * Furthermore computation of pressure and temperature is done here
234 real calc_pres(int ePBC,int nwall,matrix box,tensor ekin,tensor vir,
235 tensor pres,real Elr)
237 int n,m;
238 real fac,Plr;
240 if (ePBC==epbcNONE || (ePBC==epbcXY && nwall!=2))
241 clear_mat(pres);
242 else {
243 /* Uitzoeken welke ekin hier van toepassing is, zie Evans & Morris - E.
244 * Wrs. moet de druktensor gecorrigeerd worden voor de netto stroom in
245 * het systeem...
248 /* Long range correction for periodic systems, see
249 * Neumann et al. JCP
250 * divide by 6 because it is multiplied by fac later on.
251 * If Elr = 0, no correction is made.
254 /* This formula should not be used with Ewald or PME,
255 * where the full long-range virial is calculated. EL 990823
257 Plr = Elr/6.0;
259 fac=PRESFAC*2.0/det(box);
260 for(n=0; (n<DIM); n++)
261 for(m=0; (m<DIM); m++)
262 pres[n][m]=(ekin[n][m]-vir[n][m]+Plr)*fac;
264 if (debug) {
265 pr_rvecs(debug,0,"PC: pres",pres,DIM);
266 pr_rvecs(debug,0,"PC: ekin",ekin,DIM);
267 pr_rvecs(debug,0,"PC: vir ",vir, DIM);
268 pr_rvecs(debug,0,"PC: box ",box, DIM);
271 return trace(pres)/DIM;
274 real calc_temp(real ekin,real nrdf)
276 if (nrdf > 0)
277 return (2.0*ekin)/(nrdf*BOLTZ);
278 else
279 return 0;
282 void parrinellorahman_pcoupl(FILE *fplog,gmx_large_int_t step,
283 t_inputrec *ir,real dt,tensor pres,
284 tensor box,tensor box_rel,tensor boxv,
285 tensor M,matrix mu,gmx_bool bFirstStep)
287 /* This doesn't do any coordinate updating. It just
288 * integrates the box vector equations from the calculated
289 * acceleration due to pressure difference. We also compute
290 * the tensor M which is used in update to couple the particle
291 * coordinates to the box vectors.
293 * In Nose and Klein (Mol.Phys 50 (1983) no 5., p 1055) this is
294 * given as
295 * -1 . . -1
296 * M_nk = (h') * (h' * h + h' h) * h
298 * with the dots denoting time derivatives and h is the transformation from
299 * the scaled frame to the real frame, i.e. the TRANSPOSE of the box.
300 * This also goes for the pressure and M tensors - they are transposed relative
301 * to ours. Our equation thus becomes:
303 * -1 . . -1
304 * M_gmx = M_nk' = b * (b * b' + b * b') * b'
306 * where b is the gromacs box matrix.
307 * Our box accelerations are given by
308 * .. ..
309 * b = vol/W inv(box') * (P-ref_P) (=h')
312 int d,n;
313 tensor winv;
314 real vol=box[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
315 real atot,arel,change,maxchange,xy_pressure;
316 tensor invbox,pdiff,t1,t2;
318 real maxl;
320 m_inv_ur0(box,invbox);
322 if (!bFirstStep) {
323 /* Note that PRESFAC does not occur here.
324 * The pressure and compressibility always occur as a product,
325 * therefore the pressure unit drops out.
327 maxl=max(box[XX][XX],box[YY][YY]);
328 maxl=max(maxl,box[ZZ][ZZ]);
329 for(d=0;d<DIM;d++)
330 for(n=0;n<DIM;n++)
331 winv[d][n]=
332 (4*M_PI*M_PI*ir->compress[d][n])/(3*ir->tau_p*ir->tau_p*maxl);
334 m_sub(pres,ir->ref_p,pdiff);
336 if(ir->epct==epctSURFACETENSION) {
337 /* Unlike Berendsen coupling it might not be trivial to include a z
338 * pressure correction here? On the other hand we don't scale the
339 * box momentarily, but change accelerations, so it might not be crucial.
341 xy_pressure=0.5*(pres[XX][XX]+pres[YY][YY]);
342 for(d=0;d<ZZ;d++)
343 pdiff[d][d]=(xy_pressure-(pres[ZZ][ZZ]-ir->ref_p[d][d]/box[d][d]));
346 tmmul(invbox,pdiff,t1);
347 /* Move the off-diagonal elements of the 'force' to one side to ensure
348 * that we obey the box constraints.
350 for(d=0;d<DIM;d++) {
351 for(n=0;n<d;n++) {
352 t1[d][n] += t1[n][d];
353 t1[n][d] = 0;
357 switch (ir->epct) {
358 case epctANISOTROPIC:
359 for(d=0;d<DIM;d++)
360 for(n=0;n<=d;n++)
361 t1[d][n] *= winv[d][n]*vol;
362 break;
363 case epctISOTROPIC:
364 /* calculate total volume acceleration */
365 atot=box[XX][XX]*box[YY][YY]*t1[ZZ][ZZ]+
366 box[XX][XX]*t1[YY][YY]*box[ZZ][ZZ]+
367 t1[XX][XX]*box[YY][YY]*box[ZZ][ZZ];
368 arel=atot/(3*vol);
369 /* set all RELATIVE box accelerations equal, and maintain total V
370 * change speed */
371 for(d=0;d<DIM;d++)
372 for(n=0;n<=d;n++)
373 t1[d][n] = winv[0][0]*vol*arel*box[d][n];
374 break;
375 case epctSEMIISOTROPIC:
376 case epctSURFACETENSION:
377 /* Note the correction to pdiff above for surftens. coupling */
379 /* calculate total XY volume acceleration */
380 atot=box[XX][XX]*t1[YY][YY]+t1[XX][XX]*box[YY][YY];
381 arel=atot/(2*box[XX][XX]*box[YY][YY]);
382 /* set RELATIVE XY box accelerations equal, and maintain total V
383 * change speed. Dont change the third box vector accelerations */
384 for(d=0;d<ZZ;d++)
385 for(n=0;n<=d;n++)
386 t1[d][n] = winv[d][n]*vol*arel*box[d][n];
387 for(n=0;n<DIM;n++)
388 t1[ZZ][n] *= winv[d][n]*vol;
389 break;
390 default:
391 gmx_fatal(FARGS,"Parrinello-Rahman pressure coupling type %s "
392 "not supported yet\n",EPCOUPLTYPETYPE(ir->epct));
393 break;
396 maxchange=0;
397 for(d=0;d<DIM;d++)
398 for(n=0;n<=d;n++) {
399 boxv[d][n] += dt*t1[d][n];
401 /* We do NOT update the box vectors themselves here, since
402 * we need them for shifting later. It is instead done last
403 * in the update() routine.
406 /* Calculate the change relative to diagonal elements-
407 since it's perfectly ok for the off-diagonal ones to
408 be zero it doesn't make sense to check the change relative
409 to its current size.
412 change=fabs(dt*boxv[d][n]/box[d][d]);
414 if (change>maxchange)
415 maxchange=change;
418 if (maxchange > 0.01 && fplog) {
419 char buf[22];
420 fprintf(fplog,"\nStep %s Warning: Pressure scaling more than 1%%.\n",
421 gmx_step_str(step,buf));
425 preserve_box_shape(ir,box_rel,boxv);
427 mtmul(boxv,box,t1); /* t1=boxv * b' */
428 mmul(invbox,t1,t2);
429 mtmul(t2,invbox,M);
431 /* Determine the scaling matrix mu for the coordinates */
432 for(d=0;d<DIM;d++)
433 for(n=0;n<=d;n++)
434 t1[d][n] = box[d][n] + dt*boxv[d][n];
435 preserve_box_shape(ir,box_rel,t1);
436 /* t1 is the box at t+dt, determine mu as the relative change */
437 mmul_ur0(invbox,t1,mu);
440 void berendsen_pcoupl(FILE *fplog,gmx_large_int_t step,
441 t_inputrec *ir,real dt, tensor pres,matrix box,
442 matrix mu)
444 int d,n;
445 real scalar_pressure, xy_pressure, p_corr_z;
446 char *ptr,buf[STRLEN];
449 * Calculate the scaling matrix mu
451 scalar_pressure=0;
452 xy_pressure=0;
453 for(d=0; d<DIM; d++) {
454 scalar_pressure += pres[d][d]/DIM;
455 if (d != ZZ)
456 xy_pressure += pres[d][d]/(DIM-1);
458 /* Pressure is now in bar, everywhere. */
459 #define factor(d,m) (ir->compress[d][m]*dt/ir->tau_p)
461 /* mu has been changed from pow(1+...,1/3) to 1+.../3, since this is
462 * necessary for triclinic scaling
464 clear_mat(mu);
465 switch (ir->epct) {
466 case epctISOTROPIC:
467 for(d=0; d<DIM; d++)
469 mu[d][d] = 1.0 - factor(d,d)*(ir->ref_p[d][d] - scalar_pressure) /DIM;
471 break;
472 case epctSEMIISOTROPIC:
473 for(d=0; d<ZZ; d++)
474 mu[d][d] = 1.0 - factor(d,d)*(ir->ref_p[d][d]-xy_pressure)/DIM;
475 mu[ZZ][ZZ] =
476 1.0 - factor(ZZ,ZZ)*(ir->ref_p[ZZ][ZZ] - pres[ZZ][ZZ])/DIM;
477 break;
478 case epctANISOTROPIC:
479 for(d=0; d<DIM; d++)
480 for(n=0; n<DIM; n++)
481 mu[d][n] = (d==n ? 1.0 : 0.0)
482 -factor(d,n)*(ir->ref_p[d][n] - pres[d][n])/DIM;
483 break;
484 case epctSURFACETENSION:
485 /* ir->ref_p[0/1] is the reference surface-tension times *
486 * the number of surfaces */
487 if (ir->compress[ZZ][ZZ])
488 p_corr_z = dt/ir->tau_p*(ir->ref_p[ZZ][ZZ] - pres[ZZ][ZZ]);
489 else
490 /* when the compressibity is zero, set the pressure correction *
491 * in the z-direction to zero to get the correct surface tension */
492 p_corr_z = 0;
493 mu[ZZ][ZZ] = 1.0 - ir->compress[ZZ][ZZ]*p_corr_z;
494 for(d=0; d<DIM-1; d++)
495 mu[d][d] = 1.0 + factor(d,d)*(ir->ref_p[d][d]/(mu[ZZ][ZZ]*box[ZZ][ZZ])
496 - (pres[ZZ][ZZ]+p_corr_z - xy_pressure))/(DIM-1);
497 break;
498 default:
499 gmx_fatal(FARGS,"Berendsen pressure coupling type %s not supported yet\n",
500 EPCOUPLTYPETYPE(ir->epct));
501 break;
503 /* To fullfill the orientation restrictions on triclinic boxes
504 * we will set mu_yx, mu_zx and mu_zy to 0 and correct
505 * the other elements of mu to first order.
507 mu[YY][XX] += mu[XX][YY];
508 mu[ZZ][XX] += mu[XX][ZZ];
509 mu[ZZ][YY] += mu[YY][ZZ];
510 mu[XX][YY] = 0;
511 mu[XX][ZZ] = 0;
512 mu[YY][ZZ] = 0;
514 if (debug) {
515 pr_rvecs(debug,0,"PC: pres ",pres,3);
516 pr_rvecs(debug,0,"PC: mu ",mu,3);
519 if (mu[XX][XX]<0.99 || mu[XX][XX]>1.01 ||
520 mu[YY][YY]<0.99 || mu[YY][YY]>1.01 ||
521 mu[ZZ][ZZ]<0.99 || mu[ZZ][ZZ]>1.01) {
522 char buf2[22];
523 sprintf(buf,"\nStep %s Warning: pressure scaling more than 1%%, "
524 "mu: %g %g %g\n",
525 gmx_step_str(step,buf2),mu[XX][XX],mu[YY][YY],mu[ZZ][ZZ]);
526 if (fplog)
527 fprintf(fplog,"%s",buf);
528 fprintf(stderr,"%s",buf);
532 void berendsen_pscale(t_inputrec *ir,matrix mu,
533 matrix box,matrix box_rel,
534 int start,int nr_atoms,
535 rvec x[],unsigned short cFREEZE[],
536 t_nrnb *nrnb)
538 ivec *nFreeze=ir->opts.nFreeze;
539 int n,d,g=0;
541 /* Scale the positions */
542 for (n=start; n<start+nr_atoms; n++) {
543 if (cFREEZE)
544 g = cFREEZE[n];
546 if (!nFreeze[g][XX])
547 x[n][XX] = mu[XX][XX]*x[n][XX]+mu[YY][XX]*x[n][YY]+mu[ZZ][XX]*x[n][ZZ];
548 if (!nFreeze[g][YY])
549 x[n][YY] = mu[YY][YY]*x[n][YY]+mu[ZZ][YY]*x[n][ZZ];
550 if (!nFreeze[g][ZZ])
551 x[n][ZZ] = mu[ZZ][ZZ]*x[n][ZZ];
553 /* compute final boxlengths */
554 for (d=0; d<DIM; d++) {
555 box[d][XX] = mu[XX][XX]*box[d][XX]+mu[YY][XX]*box[d][YY]+mu[ZZ][XX]*box[d][ZZ];
556 box[d][YY] = mu[YY][YY]*box[d][YY]+mu[ZZ][YY]*box[d][ZZ];
557 box[d][ZZ] = mu[ZZ][ZZ]*box[d][ZZ];
560 preserve_box_shape(ir,box_rel,box);
562 /* (un)shifting should NOT be done after this,
563 * since the box vectors might have changed
565 inc_nrnb(nrnb,eNR_PCOUPL,nr_atoms);
568 void berendsen_tcoupl(t_inputrec *ir,gmx_ekindata_t *ekind,real dt)
570 t_grpopts *opts;
571 int i;
572 real T,reft=0,lll;
574 opts = &ir->opts;
576 for(i=0; (i<opts->ngtc); i++)
578 if (ir->eI == eiVV)
580 T = ekind->tcstat[i].T;
582 else
584 T = ekind->tcstat[i].Th;
587 if ((opts->tau_t[i] > 0) && (T > 0.0)) {
589 reft = max(0.0,opts->ref_t[i]);
590 lll = sqrt(1.0 + (dt/opts->tau_t[i])*(reft/T-1.0));
591 ekind->tcstat[i].lambda = max(min(lll,1.25),0.8);
593 else {
594 ekind->tcstat[i].lambda = 1.0;
597 if (debug)
598 fprintf(debug,"TC: group %d: T: %g, Lambda: %g\n",
599 i,T,ekind->tcstat[i].lambda);
603 void nosehoover_tcoupl(t_grpopts *opts,gmx_ekindata_t *ekind,real dt,
604 double xi[],double vxi[], t_extmass *MassQ)
606 int i;
607 real reft,oldvxi;
609 /* note that this routine does not include Nose-hoover chains yet. Should be easy to add. */
611 for(i=0; (i<opts->ngtc); i++) {
612 reft = max(0.0,opts->ref_t[i]);
613 oldvxi = vxi[i];
614 vxi[i] += dt*MassQ->Qinv[i]*(ekind->tcstat[i].Th - reft);
615 xi[i] += dt*(oldvxi + vxi[i])*0.5;
619 t_state *init_bufstate(const t_state *template_state)
621 t_state *state;
622 int nc = template_state->nhchainlength;
623 snew(state,1);
624 snew(state->nosehoover_xi,nc*template_state->ngtc);
625 snew(state->nosehoover_vxi,nc*template_state->ngtc);
626 snew(state->therm_integral,template_state->ngtc);
627 snew(state->nhpres_xi,nc*template_state->nnhpres);
628 snew(state->nhpres_vxi,nc*template_state->nnhpres);
630 return state;
633 void destroy_bufstate(t_state *state)
635 sfree(state->x);
636 sfree(state->v);
637 sfree(state->nosehoover_xi);
638 sfree(state->nosehoover_vxi);
639 sfree(state->therm_integral);
640 sfree(state->nhpres_xi);
641 sfree(state->nhpres_vxi);
642 sfree(state);
645 void trotter_update(t_inputrec *ir,gmx_large_int_t step, gmx_ekindata_t *ekind,
646 gmx_enerdata_t *enerd, t_state *state,
647 tensor vir, t_mdatoms *md,
648 t_extmass *MassQ, int **trotter_seqlist, int trotter_seqno)
651 int n,i,j,d,ntgrp,ngtc,gc=0;
652 t_grp_tcstat *tcstat;
653 t_grpopts *opts;
654 gmx_large_int_t step_eff;
655 real ecorr,pcorr,dvdlcorr;
656 real bmass,qmass,reft,kT,dt,nd;
657 tensor dumpres,dumvir;
658 double *scalefac,dtc;
659 int *trotter_seq;
660 rvec sumv,consk;
661 gmx_bool bCouple;
663 if (trotter_seqno <= ettTSEQ2)
665 step_eff = step-1; /* the velocity verlet calls are actually out of order -- the first half step
666 is actually the last half step from the previous step. Thus the first half step
667 actually corresponds to the n-1 step*/
669 } else {
670 step_eff = step;
673 bCouple = (ir->nsttcouple == 1 ||
674 do_per_step(step_eff+ir->nsttcouple,ir->nsttcouple));
676 trotter_seq = trotter_seqlist[trotter_seqno];
678 /* signal we are returning if nothing is going to be done in this routine */
679 if ((trotter_seq[0] == etrtSKIPALL) || !(bCouple))
681 return;
684 dtc = ir->nsttcouple*ir->delta_t;
685 opts = &(ir->opts); /* just for ease of referencing */
686 ngtc = opts->ngtc;
687 snew(scalefac,opts->ngtc);
688 for (i=0;i<ngtc;i++)
690 scalefac[i] = 1;
692 /* execute the series of trotter updates specified in the trotterpart array */
694 for (i=0;i<NTROTTERPARTS;i++){
695 /* allow for doubled intgrators by doubling dt instead of making 2 calls */
696 if ((trotter_seq[i] == etrtBAROV2) || (trotter_seq[i] == etrtBARONHC2) || (trotter_seq[i] == etrtNHC2))
698 dt = 2 * dtc;
700 else
702 dt = dtc;
705 switch (trotter_seq[i])
707 case etrtBAROV:
708 case etrtBAROV2:
709 boxv_trotter(ir,&(state->veta),dt,state->box,ekind,vir,
710 enerd->term[F_PDISPCORR],enerd->term[F_DISPCORR],MassQ);
711 break;
712 case etrtBARONHC:
713 case etrtBARONHC2:
714 NHC_trotter(opts,state->nnhpres,ekind,dt,state->nhpres_xi,
715 state->nhpres_vxi,NULL,&(state->veta),MassQ,FALSE);
716 break;
717 case etrtNHC:
718 case etrtNHC2:
719 NHC_trotter(opts,opts->ngtc,ekind,dt,state->nosehoover_xi,
720 state->nosehoover_vxi,scalefac,NULL,MassQ,(ir->eI==eiVV));
721 /* need to rescale the kinetic energies and velocities here. Could
722 scale the velocities later, but we need them scaled in order to
723 produce the correct outputs, so we'll scale them here. */
725 for (i=0; i<ngtc;i++)
727 tcstat = &ekind->tcstat[i];
728 tcstat->vscale_nhc = scalefac[i];
729 tcstat->ekinscaleh_nhc *= (scalefac[i]*scalefac[i]);
730 tcstat->ekinscalef_nhc *= (scalefac[i]*scalefac[i]);
732 /* now that we've scaled the groupwise velocities, we can add them up to get the total */
733 /* but do we actually need the total? */
735 /* modify the velocities as well */
736 for (n=md->start;n<md->start+md->homenr;n++)
738 if (md->cTC)
740 gc = md->cTC[n];
742 for (d=0;d<DIM;d++)
744 state->v[n][d] *= scalefac[gc];
747 if (debug)
749 for (d=0;d<DIM;d++)
751 sumv[d] += (state->v[n][d])/md->invmass[n];
755 break;
756 default:
757 break;
760 /* check for conserved momentum -- worth looking at this again eventually, but not working right now.*/
761 #if 0
762 if (debug)
764 if (bFirstHalf)
766 for (d=0;d<DIM;d++)
768 consk[d] = sumv[d]*exp((1 + 1.0/opts->nrdf[0])*((1.0/DIM)*log(det(state->box)/state->vol0)) + state->nosehoover_xi[0]);
770 fprintf(debug,"Conserved kappa: %15.8f %15.8f %15.8f\n",consk[0],consk[1],consk[2]);
773 #endif
774 sfree(scalefac);
777 int **init_npt_vars(t_inputrec *ir, t_state *state, t_extmass *MassQ, gmx_bool bTrotter)
779 int n,i,j,d,ntgrp,ngtc,nnhpres,nh,gc=0;
780 t_grp_tcstat *tcstat;
781 t_grpopts *opts;
782 real ecorr,pcorr,dvdlcorr;
783 real bmass,qmass,reft,kT,dt,ndj,nd;
784 tensor dumpres,dumvir;
785 int **trotter_seq;
787 opts = &(ir->opts); /* just for ease of referencing */
788 ngtc = state->ngtc;
789 nnhpres = state->nnhpres;
790 nh = state->nhchainlength;
792 if (ir->eI == eiMD) {
793 snew(MassQ->Qinv,ngtc);
794 for(i=0; (i<ngtc); i++)
796 if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
798 MassQ->Qinv[i]=1.0/(sqr(opts->tau_t[i]/M_2PI)*opts->ref_t[i]);
800 else
802 MassQ->Qinv[i]=0.0;
806 else if (EI_VV(ir->eI))
808 /* Set pressure variables */
810 if (state->vol0 == 0)
812 state->vol0 = det(state->box); /* because we start by defining a fixed compressibility,
813 we need the volume at this compressibility to solve the problem */
816 /* units are nm^3 * ns^2 / (nm^3 * bar / kJ/mol) = kJ/mol */
817 /* Investigate this more -- is this the right mass to make it? */
818 MassQ->Winv = (PRESFAC*trace(ir->compress)*BOLTZ*opts->ref_t[0])/(DIM*state->vol0*sqr(ir->tau_p/M_2PI));
819 /* An alternate mass definition, from Tuckerman et al. */
820 /* MassQ->Winv = 1.0/(sqr(ir->tau_p/M_2PI)*(opts->nrdf[0]+DIM)*BOLTZ*opts->ref_t[0]); */
821 for (d=0;d<DIM;d++)
823 for (n=0;n<DIM;n++)
825 MassQ->Winvm[d][n]= PRESFAC*ir->compress[d][n]/(state->vol0*sqr(ir->tau_p/M_2PI));
826 /* not clear this is correct yet for the anisotropic case*/
829 /* Allocate space for thermostat variables */
830 snew(MassQ->Qinv,ngtc*nh);
832 /* now, set temperature variables */
833 for(i=0; i<ngtc; i++)
835 if ((opts->tau_t[i] > 0) && (opts->ref_t[i] > 0))
837 reft = max(0.0,opts->ref_t[i]);
838 nd = opts->nrdf[i];
839 kT = BOLTZ*reft;
840 for (j=0;j<nh;j++)
842 if (j==0)
844 ndj = nd;
846 else
848 ndj = 1;
850 MassQ->Qinv[i*nh+j] = 1.0/(sqr(opts->tau_t[i]/M_2PI)*ndj*kT);
853 else
855 reft=0.0;
856 for (j=0;j<nh;j++)
858 MassQ->Qinv[i*nh+j] = 0.0;
864 /* first, initialize clear all the trotter calls */
865 snew(trotter_seq,ettTSEQMAX);
866 for (i=0;i<ettTSEQMAX;i++)
868 snew(trotter_seq[i],NTROTTERPARTS);
869 for (j=0;j<NTROTTERPARTS;j++) {
870 trotter_seq[i][j] = etrtNONE;
872 trotter_seq[i][0] = etrtSKIPALL;
875 if (!bTrotter)
877 /* no trotter calls, so we never use the values in the array.
878 * We access them (so we need to define them, but ignore
879 * then.*/
881 return trotter_seq;
884 /* compute the kinetic energy by using the half step velocities or
885 * the kinetic energies, depending on the order of the trotter calls */
887 if (ir->eI==eiVV)
889 if (IR_NPT_TROTTER(ir))
891 /* This is the complicated version - there are 4 possible calls, depending on ordering.
892 We start with the initial one. */
893 /* first, a round that estimates veta. */
894 trotter_seq[0][0] = etrtBAROV;
896 /* trotter_seq[1] is etrtNHC for 1/2 step velocities - leave zero */
898 /* The first half trotter update */
899 trotter_seq[2][0] = etrtBAROV;
900 trotter_seq[2][1] = etrtNHC;
901 trotter_seq[2][2] = etrtBARONHC;
903 /* The second half trotter update */
904 trotter_seq[3][0] = etrtBARONHC;
905 trotter_seq[3][1] = etrtNHC;
906 trotter_seq[3][2] = etrtBAROV;
908 /* trotter_seq[4] is etrtNHC for second 1/2 step velocities - leave zero */
911 else
913 if (IR_NVT_TROTTER(ir))
915 /* This is the easy version - there are only two calls, both the same.
916 Otherwise, even easier -- no calls */
917 trotter_seq[2][0] = etrtNHC;
918 trotter_seq[3][0] = etrtNHC;
921 } else if (ir->eI==eiVVAK) {
922 if (IR_NPT_TROTTER(ir))
924 /* This is the complicated version - there are 4 possible calls, depending on ordering.
925 We start with the initial one. */
926 /* first, a round that estimates veta. */
927 trotter_seq[0][0] = etrtBAROV;
929 /* The first half trotter update, part 1 -- double update, because it commutes */
930 trotter_seq[1][0] = etrtNHC;
932 /* The first half trotter update, part 2 */
933 trotter_seq[2][0] = etrtBAROV;
934 trotter_seq[2][1] = etrtBARONHC;
936 /* The second half trotter update, part 1 */
937 trotter_seq[3][0] = etrtBARONHC;
938 trotter_seq[3][1] = etrtBAROV;
940 /* The second half trotter update -- blank for now */
941 trotter_seq[4][0] = etrtNHC;
943 else
945 if (IR_NVT_TROTTER(ir))
947 /* This is the easy version - there is only one call, both the same.
948 Otherwise, even easier -- no calls */
949 trotter_seq[1][0] = etrtNHC;
950 trotter_seq[4][0] = etrtNHC;
955 switch (ir->epct)
957 case epctISOTROPIC:
958 default:
959 bmass = DIM*DIM; /* recommended mass parameters for isotropic barostat */
962 snew(MassQ->QPinv,nnhpres*opts->nhchainlength);
964 /* barostat temperature */
965 if ((ir->tau_p > 0) && (opts->ref_t[0] > 0))
967 reft = max(0.0,opts->ref_t[0]);
968 kT = BOLTZ*reft;
969 for (i=0;i<nnhpres;i++) {
970 for (j=0;j<nh;j++)
972 if (j==0) {
973 qmass = bmass;
975 else
977 qmass = 1;
979 MassQ->QPinv[i*opts->nhchainlength+j] = 1.0/(sqr(opts->tau_t[0]/M_2PI)*qmass*kT);
983 else
985 for (i=0;i<nnhpres;i++) {
986 for (j=0;j<nh;j++)
988 MassQ->QPinv[i*nh+j]=0.0;
992 return trotter_seq;
995 real NPT_energy(t_inputrec *ir, t_state *state, t_extmass *MassQ)
997 int i,j,nd,ndj,bmass,qmass,ngtcall;
998 real ener_npt,reft,eta,kT,tau;
999 double *ivxi, *ixi;
1000 double *iQinv;
1001 real vol,dbaro,W,Q;
1002 int nh = state->nhchainlength;
1004 ener_npt = 0;
1006 /* now we compute the contribution of the pressure to the conserved quantity*/
1008 if (ir->epc==epcMTTK)
1010 /* find the volume, and the kinetic energy of the volume */
1012 switch (ir->epct) {
1014 case epctISOTROPIC:
1015 /* contribution from the pressure momenenta */
1016 ener_npt += 0.5*sqr(state->veta)/MassQ->Winv;
1018 /* contribution from the PV term */
1019 vol = det(state->box);
1020 ener_npt += vol*trace(ir->ref_p)/(DIM*PRESFAC);
1022 break;
1023 case epctANISOTROPIC:
1025 break;
1027 case epctSURFACETENSION:
1029 break;
1030 case epctSEMIISOTROPIC:
1032 break;
1033 default:
1034 break;
1038 if (IR_NPT_TROTTER(ir))
1040 /* add the energy from the barostat thermostat chain */
1041 for (i=0;i<state->nnhpres;i++) {
1043 /* note -- assumes only one degree of freedom that is thermostatted in barostat */
1044 ivxi = &state->nhpres_vxi[i*nh];
1045 ixi = &state->nhpres_xi[i*nh];
1046 iQinv = &(MassQ->QPinv[i*nh]);
1047 reft = max(ir->opts.ref_t[0],0); /* using 'System' temperature */
1048 kT = BOLTZ * reft;
1050 for (j=0;j<nh;j++)
1052 if (iQinv[j] > 0)
1054 ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1055 /* contribution from the thermal variable of the NH chain */
1056 ener_npt += ixi[j]*kT;
1058 if (debug)
1060 fprintf(debug,"P-T-group: %10d Chain %4d ThermV: %15.8f ThermX: %15.8f",i,j,ivxi[j],ixi[j]);
1066 if (ir->etc)
1068 for(i=0; i<ir->opts.ngtc; i++)
1070 ixi = &state->nosehoover_xi[i*nh];
1071 ivxi = &state->nosehoover_vxi[i*nh];
1072 iQinv = &(MassQ->Qinv[i*nh]);
1074 nd = ir->opts.nrdf[i];
1075 reft = max(ir->opts.ref_t[i],0);
1076 kT = BOLTZ * reft;
1078 if (nd > 0)
1080 if (IR_NVT_TROTTER(ir))
1082 /* contribution from the thermal momenta of the NH chain */
1083 for (j=0;j<nh;j++)
1085 if (iQinv[j] > 0) {
1086 ener_npt += 0.5*sqr(ivxi[j])/iQinv[j];
1087 /* contribution from the thermal variable of the NH chain */
1088 if (j==0) {
1089 ndj = nd;
1091 else
1093 ndj = 1;
1095 ener_npt += ndj*ixi[j]*kT;
1099 else /* Other non Trotter temperature NH control -- no chains yet. */
1101 ener_npt += 0.5*BOLTZ*nd*sqr(ivxi[0])/iQinv[0];
1102 ener_npt += nd*ixi[0]*kT;
1107 return ener_npt;
1110 static real vrescale_gamdev(int ia, gmx_rng_t rng)
1111 /* Gamma distribution, adapted from numerical recipes */
1113 int j;
1114 real am,e,s,v1,v2,x,y;
1116 if (ia < 6)
1120 x = 1.0;
1121 for(j=1; j<=ia; j++)
1123 x *= gmx_rng_uniform_real(rng);
1126 while (x == 0);
1127 x = -log(x);
1129 else
1137 v1 = gmx_rng_uniform_real(rng);
1138 v2 = 2.0*gmx_rng_uniform_real(rng)-1.0;
1140 while (v1*v1 + v2*v2 > 1.0 ||
1141 v1*v1*GMX_REAL_MAX < 3.0*ia);
1142 /* The last check above ensures that both x (3.0 > 2.0 in s)
1143 * and the pre-factor for e do not go out of range.
1145 y = v2/v1;
1146 am = ia - 1;
1147 s = sqrt(2.0*am + 1.0);
1148 x = s*y + am;
1150 while (x <= 0.0);
1151 e = (1.0 + y*y)*exp(am*log(x/am) - s*y);
1153 while (gmx_rng_uniform_real(rng) > e);
1156 return x;
1159 static real vrescale_sumnoises(int nn,gmx_rng_t rng)
1162 * Returns the sum of n independent gaussian noises squared
1163 * (i.e. equivalent to summing the square of the return values
1164 * of nn calls to gmx_rng_gaussian_real).xs
1166 real rr;
1168 if (nn == 0) {
1169 return 0.0;
1170 } else if (nn == 1) {
1171 rr = gmx_rng_gaussian_real(rng);
1172 return rr*rr;
1173 } else if (nn % 2 == 0) {
1174 return 2.0*vrescale_gamdev(nn/2,rng);
1175 } else {
1176 rr = gmx_rng_gaussian_real(rng);
1177 return 2.0*vrescale_gamdev((nn-1)/2,rng) + rr*rr;
1181 static real vrescale_resamplekin(real kk,real sigma, int ndeg, real taut,
1182 gmx_rng_t rng)
1185 * Generates a new value for the kinetic energy,
1186 * according to Bussi et al JCP (2007), Eq. (A7)
1187 * kk: present value of the kinetic energy of the atoms to be thermalized (in arbitrary units)
1188 * sigma: target average value of the kinetic energy (ndeg k_b T/2) (in the same units as kk)
1189 * ndeg: number of degrees of freedom of the atoms to be thermalized
1190 * taut: relaxation time of the thermostat, in units of 'how often this routine is called'
1192 real factor,rr;
1194 if (taut > 0.1) {
1195 factor = exp(-1.0/taut);
1196 } else {
1197 factor = 0.0;
1199 rr = gmx_rng_gaussian_real(rng);
1200 return
1201 kk +
1202 (1.0 - factor)*(sigma*(vrescale_sumnoises(ndeg-1,rng) + rr*rr)/ndeg - kk) +
1203 2.0*rr*sqrt(kk*sigma/ndeg*(1.0 - factor)*factor);
1206 void vrescale_tcoupl(t_inputrec *ir,gmx_ekindata_t *ekind,real dt,
1207 double therm_integral[],gmx_rng_t rng)
1209 t_grpopts *opts;
1210 int i;
1211 real Ek,Ek_ref1,Ek_ref,Ek_new;
1213 opts = &ir->opts;
1215 for(i=0; (i<opts->ngtc); i++)
1217 if (ir->eI == eiVV)
1219 Ek = trace(ekind->tcstat[i].ekinf);
1221 else
1223 Ek = trace(ekind->tcstat[i].ekinh);
1226 if (opts->tau_t[i] >= 0 && opts->nrdf[i] > 0 && Ek > 0)
1228 Ek_ref1 = 0.5*opts->ref_t[i]*BOLTZ;
1229 Ek_ref = Ek_ref1*opts->nrdf[i];
1231 Ek_new = vrescale_resamplekin(Ek,Ek_ref,opts->nrdf[i],
1232 opts->tau_t[i]/dt,rng);
1234 /* Analytically Ek_new>=0, but we check for rounding errors */
1235 if (Ek_new <= 0)
1237 ekind->tcstat[i].lambda = 0.0;
1239 else
1241 ekind->tcstat[i].lambda = sqrt(Ek_new/Ek);
1244 therm_integral[i] -= Ek_new - Ek;
1246 if (debug)
1248 fprintf(debug,"TC: group %d: Ekr %g, Ek %g, Ek_new %g, Lambda: %g\n",
1249 i,Ek_ref,Ek,Ek_new,ekind->tcstat[i].lambda);
1252 else
1254 ekind->tcstat[i].lambda = 1.0;
1259 real vrescale_energy(t_grpopts *opts,double therm_integral[])
1261 int i;
1262 real ener;
1264 ener = 0;
1265 for(i=0; i<opts->ngtc; i++) {
1266 ener += therm_integral[i];
1269 return ener;
1272 void rescale_velocities(gmx_ekindata_t *ekind,t_mdatoms *mdatoms,
1273 int start,int end,rvec v[])
1275 t_grp_acc *gstat;
1276 t_grp_tcstat *tcstat;
1277 unsigned short *cACC,*cTC;
1278 int ga,gt,n,d;
1279 real lg;
1280 rvec vrel;
1282 tcstat = ekind->tcstat;
1283 cTC = mdatoms->cTC;
1285 if (ekind->bNEMD)
1287 gstat = ekind->grpstat;
1288 cACC = mdatoms->cACC;
1290 ga = 0;
1291 gt = 0;
1292 for(n=start; n<end; n++)
1294 if (cACC)
1296 ga = cACC[n];
1298 if (cTC)
1300 gt = cTC[n];
1302 /* Only scale the velocity component relative to the COM velocity */
1303 rvec_sub(v[n],gstat[ga].u,vrel);
1304 lg = tcstat[gt].lambda;
1305 for(d=0; d<DIM; d++)
1307 v[n][d] = gstat[ga].u[d] + lg*vrel[d];
1311 else
1313 gt = 0;
1314 for(n=start; n<end; n++)
1316 if (cTC)
1318 gt = cTC[n];
1320 lg = tcstat[gt].lambda;
1321 for(d=0; d<DIM; d++)
1323 v[n][d] *= lg;
1330 /* set target temperatures if we are annealing */
1331 void update_annealing_target_temp(t_grpopts *opts,real t)
1333 int i,j,n,npoints;
1334 real pert,thist=0,x;
1336 for(i=0;i<opts->ngtc;i++) {
1337 npoints = opts->anneal_npoints[i];
1338 switch (opts->annealing[i]) {
1339 case eannNO:
1340 continue;
1341 case eannPERIODIC:
1342 /* calculate time modulo the period */
1343 pert = opts->anneal_time[i][npoints-1];
1344 n = t / pert;
1345 thist = t - n*pert; /* modulo time */
1346 /* Make sure rounding didn't get us outside the interval */
1347 if (fabs(thist-pert) < GMX_REAL_EPS*100)
1348 thist=0;
1349 break;
1350 case eannSINGLE:
1351 thist = t;
1352 break;
1353 default:
1354 gmx_fatal(FARGS,"Death horror in update_annealing_target_temp (i=%d/%d npoints=%d)",i,opts->ngtc,npoints);
1356 /* We are doing annealing for this group if we got here,
1357 * and we have the (relative) time as thist.
1358 * calculate target temp */
1359 j=0;
1360 while ((j < npoints-1) && (thist>(opts->anneal_time[i][j+1])))
1361 j++;
1362 if (j < npoints-1) {
1363 /* Found our position between points j and j+1.
1364 * Interpolate: x is the amount from j+1, (1-x) from point j
1365 * First treat possible jumps in temperature as a special case.
1367 if ((opts->anneal_time[i][j+1]-opts->anneal_time[i][j]) < GMX_REAL_EPS*100)
1368 opts->ref_t[i]=opts->anneal_temp[i][j+1];
1369 else {
1370 x = ((thist-opts->anneal_time[i][j])/
1371 (opts->anneal_time[i][j+1]-opts->anneal_time[i][j]));
1372 opts->ref_t[i] = x*opts->anneal_temp[i][j+1]+(1-x)*opts->anneal_temp[i][j];
1375 else {
1376 opts->ref_t[i] = opts->anneal_temp[i][npoints-1];