etrtVELOCITY1, etrtVELOCITY2, etrtPOSITION, etrtSKIPALL, etrtNR
};
+/* sequenced parts of the trotter decomposition */
+enum {
+ ettTSEQ0, ettTSEQ1, ettTSEQ2, ettTSEQ3, ettTSEQ4, ettTSEQMAX
+};
+
enum {
epctISOTROPIC, epctSEMIISOTROPIC, epctANISOTROPIC,
epctSURFACETENSION, epctNR
extern void trotter_update(t_inputrec *ir, gmx_large_int_t step, gmx_ekindata_t *ekind,
gmx_enerdata_t *enerd, t_state *state, tensor vir, t_mdatoms *md,
- t_extmass *MassQ, int *trotter_seq);
+ t_extmass *MassQ, int **trotter_seqlist, int trotter_seqno);
extern int **init_npt_vars(t_inputrec *ir, t_state *state, t_extmass *Mass, bool bTrotter);
copy_rvecn(state->v,cbuf,0,state->natoms); /* should make this better for parallelizing? */
} else {
/* this is for NHC in the Ekin(t+dt/2) version of vv */
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[1]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ1);
}
update_coords(fplog,step,ir,mdatoms,state,
of veta. */
veta_save = state->veta;
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[0]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ0);
vetanew = state->veta;
state->veta = veta_save;
}
{
if (bTrotter)
{
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[2]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ2);
}
else
{
m_add(force_vir,shake_vir,total_vir);
clear_mat(shake_vir);
}
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[3]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ3);
/* We can only do Berendsen coupling after we have summed
* the kinetic energy or virial. Since the happens
* in global_state after update, we should only do it at
cglo_flags | CGLO_TEMPERATURE
);
wallcycle_start(wcycle,ewcUPDATE);
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[4]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ4);
/* now we know the scaling, we can compute the positions again again */
copy_rvecn(cbuf,state->x,0,state->natoms);
#include "update.h"
#include "mdrun.h"
-#define NTROTTERCALLS 5
#define NTROTTERPARTS 3
/* these integration routines are only referenced inside this file */
void trotter_update(t_inputrec *ir,gmx_large_int_t step, gmx_ekindata_t *ekind,
gmx_enerdata_t *enerd, t_state *state,
tensor vir, t_mdatoms *md,
- t_extmass *MassQ, int *trotter_seq)
+ t_extmass *MassQ, int **trotter_seqlist, int trotter_seqno)
{
int n,i,j,d,ntgrp,ngtc,gc=0;
t_grp_tcstat *tcstat;
t_grpopts *opts;
+ gmx_large_int_t step_eff;
real ecorr,pcorr,dvdlcorr;
real bmass,qmass,reft,kT,dt,nd;
tensor dumpres,dumvir;
double *scalefac,dtc;
+ int *trotter_seq;
rvec sumv,consk;
bool bCouple;
+ if (trotter_seqno <= ettTSEQ2)
+ {
+ step_eff = step-1; /* the velocity verlet calls are actually out of order -- the first half step
+ is actually the last half step from the previous step. Thus the first half step
+ actually corresponds to the n-1 step*/
+
+ } else {
+ step_eff = step;
+ }
+
bCouple = (ir->nsttcouple == 1 ||
- do_per_step(step+ir->nsttcouple,ir->nsttcouple));
-
+ do_per_step(step_eff+ir->nsttcouple,ir->nsttcouple));
+
+ trotter_seq = trotter_seqlist[trotter_seqno];
+
/* signal we are returning if nothing is going to be done in this routine */
if ((trotter_seq[0] == etrtSKIPALL) || !(bCouple))
{
}
/* first, initialize clear all the trotter calls */
- snew(trotter_seq,NTROTTERCALLS);
- for (i=0;i<NTROTTERCALLS;i++)
+ snew(trotter_seq,ettTSEQMAX);
+ for (i=0;i<ettTSEQMAX;i++)
{
snew(trotter_seq[i],NTROTTERPARTS);
for (j=0;j<NTROTTERPARTS;j++) {
/* this is for NHC in the Ekin(t+dt/2) version of vv */
if (!bInitStep)
{
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[1]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ2);
}
if (ir->eI == eiVVAK)
of veta. */
veta_save = state->veta;
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[0]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq,ettTSEQ0);
vetanew = state->veta;
state->veta = veta_save;
}
/* temperature scaling and pressure scaling to produce the extended variables at t+dt */
if (bVV && !bInitStep)
{
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[2]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ, trotter_seq,ettTSEQ2);
}
if (bIterations &&
m_add(force_vir,shake_vir,total_vir);
clear_mat(shake_vir);
}
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[3]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ, trotter_seq,ettTSEQ3);
}
/* We can only do Berendsen coupling after we have summed
* the kinetic energy or virial. Since the happens
cglo_flags | CGLO_TEMPERATURE | CGLO_CONSTRAINT
);
wallcycle_start(wcycle,ewcUPDATE);
- trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ,trotter_seq[4]);
+ trotter_update(ir,step,ekind,enerd,state,total_vir,mdatoms,&MassQ, trotter_seq,ettTSEQ4);
/* now we know the scaling, we can compute the positions again again */
copy_rvecn(cbuf,state->x,0,state->natoms);