Ewald coefficients no longer get passed every step to gmx_pme_do().
Instead, they are passed to gmx_pme_(re)init,
as they only change together with the grid size, not every MD step.
Change-Id: Iea75063cf060317e3f0fcfd147431520b6c83a90
*/
#define PME_ORDER_MAX 12
-/*! \brief As gmx_pme_init, but takes most settings, except the grid, from pme_src */
+/*! \brief As gmx_pme_init, but takes most settings, except the grid/Ewald coefficients, from pme_src.
+ * This is only called when the PME cut-off/grid size changes.
+ */
int gmx_pme_reinit(struct gmx_pme_t **pmedata,
t_commrec * cr,
struct gmx_pme_t * pme_src,
const t_inputrec * ir,
- ivec grid_size);
+ ivec grid_size,
+ real ewaldcoeff_q,
+ real ewaldcoeff_lj);
+
/* The following three routines are for PME/PP node splitting in pme_pp.c */
int nkx, nky, nkz; /* Grid dimensions */
gmx_bool bP3M; /* Do P3M: optimize the influence function */
int pme_order;
+ real ewaldcoeff_q; /* Ewald splitting coefficient for Coulomb */
+ real ewaldcoeff_lj; /* Ewald splitting coefficient for r^-6 */
real epsilon_r;
int ljpme_combination_rule; /* Type of combination rule in LJ-PME */
*/
gmx_pme_reinit(&set->pmedata,
cr, pme_lb->setup[0].pmedata, ir,
- set->grid);
+ set->grid, set->ewaldcoeff_q, set->ewaldcoeff_lj);
}
*pmedata = set->pmedata;
}
static void gmx_pmeonly_switch(int *npmedata, struct gmx_pme_t ***pmedata,
ivec grid_size,
+ real ewaldcoeff_q, real ewaldcoeff_lj,
t_commrec *cr, t_inputrec *ir,
struct gmx_pme_t **pme_ret)
{
srenew(*pmedata, *npmedata);
/* Generate a new PME data structure, copying part of the old pointers */
- gmx_pme_reinit(&((*pmedata)[ind]), cr, pme, ir, grid_size);
+ gmx_pme_reinit(&((*pmedata)[ind]), cr, pme, ir, grid_size, ewaldcoeff_q, ewaldcoeff_lj);
*pme_ret = (*pmedata)[ind];
}
if (ret == pmerecvqxSWITCHGRID)
{
/* Switch the PME grid to grid_switch */
- gmx_pmeonly_switch(&npmedata, &pmedata, grid_switch, cr, ir, &pme);
+ gmx_pmeonly_switch(&npmedata, &pmedata, grid_switch, ewaldcoeff_q, ewaldcoeff_lj, cr, ir, &pme);
}
if (ret == pmerecvqxRESETCOUNTERS)
gmx_pme_do(pme, 0, natoms, x_pp, f_pp,
chargeA, chargeB, c6A, c6B, sigmaA, sigmaB, box,
cr, maxshift_x, maxshift_y, mynrnb, wcycle,
- vir_q, ewaldcoeff_q, vir_lj, ewaldcoeff_lj,
+ vir_q, vir_lj,
&energy_q, &energy_lj, lambda_q, lambda_lj, &dvdlambda_q, &dvdlambda_lj,
GMX_PME_DO_ALL_F | (bEnerVir ? GMX_PME_CALC_ENER_VIR : 0));
}
#endif
-int solve_pme_yzx(struct gmx_pme_t *pme, t_complex *grid,
- real ewaldcoeff, real vol,
+int solve_pme_yzx(struct gmx_pme_t *pme, t_complex *grid, real vol,
gmx_bool bEnerVir,
int nthread, int thread)
{
int kx, ky, kz, maxkx, maxky;
int nx, ny, nz, iyz0, iyz1, iyz, iy, iz, kxstart, kxend;
real mx, my, mz;
- real factor = M_PI*M_PI/(ewaldcoeff*ewaldcoeff);
+ real ewaldcoeff = pme->ewaldcoeff_q;
+ real factor = M_PI*M_PI/(ewaldcoeff*ewaldcoeff);
real ets2, struct2, vfactor, ets2vf;
real d1, d2, energy = 0;
real by, bz;
return local_ndata[YY]*local_ndata[XX];
}
-int solve_pme_lj_yzx(struct gmx_pme_t *pme, t_complex **grid, gmx_bool bLB,
- real ewaldcoeff, real vol,
+int solve_pme_lj_yzx(struct gmx_pme_t *pme, t_complex **grid, gmx_bool bLB, real vol,
gmx_bool bEnerVir, int nthread, int thread)
{
/* do recip sum over local cells in grid */
int kx, ky, kz, maxkx, maxky;
int nx, ny, nz, iy, iyz0, iyz1, iyz, iz, kxstart, kxend;
real mx, my, mz;
- real factor = M_PI*M_PI/(ewaldcoeff*ewaldcoeff);
+ real ewaldcoeff = pme->ewaldcoeff_lj;
+ real factor = M_PI*M_PI/(ewaldcoeff*ewaldcoeff);
real ets2, ets2vf;
real eterm, vterm, d1, d2, energy = 0;
real by, bz;
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,2016, by the GROMACS development team, led by
* Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
* and including many others, as listed in the AUTHORS file in the
* top-level source directory and at http://www.gromacs.org.
real *mesh_energy, matrix vir);
int solve_pme_yzx(struct gmx_pme_t *pme, t_complex *grid,
- real ewaldcoeff, real vol,
+ real vol,
gmx_bool bEnerVir,
int nthread, int thread);
int solve_pme_lj_yzx(struct gmx_pme_t *pme, t_complex **grid, gmx_bool bLB,
- real ewaldcoeff, real vol,
+ real vol,
gmx_bool bEnerVir, int nthread, int thread);
#endif
gmx_bool bFreeEnergy_q,
gmx_bool bFreeEnergy_lj,
gmx_bool bReproducible,
+ real ewaldcoeff_q,
+ real ewaldcoeff_lj,
int nthread)
{
struct gmx_pme_t *pme = NULL;
* not calculating free-energy for Coulomb and/or LJ while gmx_pme_init()
* configures with free-energy, but that has never been tested.
*/
- pme->doCoulomb = EEL_PME(ir->coulombtype);
- pme->doLJ = EVDW_PME(ir->vdwtype);
- pme->bFEP_q = ((ir->efep != efepNO) && bFreeEnergy_q);
- pme->bFEP_lj = ((ir->efep != efepNO) && bFreeEnergy_lj);
- pme->bFEP = (pme->bFEP_q || pme->bFEP_lj);
- pme->nkx = ir->nkx;
- pme->nky = ir->nky;
- pme->nkz = ir->nkz;
- pme->bP3M = (ir->coulombtype == eelP3M_AD || getenv("GMX_PME_P3M") != NULL);
- pme->pme_order = ir->pme_order;
+ pme->doCoulomb = EEL_PME(ir->coulombtype);
+ pme->doLJ = EVDW_PME(ir->vdwtype);
+ pme->bFEP_q = ((ir->efep != efepNO) && bFreeEnergy_q);
+ pme->bFEP_lj = ((ir->efep != efepNO) && bFreeEnergy_lj);
+ pme->bFEP = (pme->bFEP_q || pme->bFEP_lj);
+ pme->nkx = ir->nkx;
+ pme->nky = ir->nky;
+ pme->nkz = ir->nkz;
+ pme->bP3M = (ir->coulombtype == eelP3M_AD || getenv("GMX_PME_P3M") != NULL);
+ pme->pme_order = ir->pme_order;
+ pme->ewaldcoeff_q = ewaldcoeff_q;
+ pme->ewaldcoeff_lj = ewaldcoeff_lj;
/* Always constant electrostatics coefficients */
- pme->epsilon_r = ir->epsilon_r;
+ pme->epsilon_r = ir->epsilon_r;
/* Always constant LJ coefficients */
pme->ljpme_combination_rule = ir->ljpme_combination_rule;
t_commrec * cr,
struct gmx_pme_t * pme_src,
const t_inputrec * ir,
- ivec grid_size)
+ ivec grid_size,
+ real ewaldcoeff_q,
+ real ewaldcoeff_lj)
{
t_inputrec irc;
int homenr;
}
ret = gmx_pme_init(pmedata, cr, pme_src->nnodes_major, pme_src->nnodes_minor,
- &irc, homenr, pme_src->bFEP_q, pme_src->bFEP_lj, FALSE, pme_src->nthread);
+ &irc, homenr, pme_src->bFEP_q, pme_src->bFEP_lj, FALSE, ewaldcoeff_q, ewaldcoeff_lj, pme_src->nthread);
if (ret == 0)
{
matrix box, t_commrec *cr,
int maxshift_x, int maxshift_y,
t_nrnb *nrnb, gmx_wallcycle_t wcycle,
- matrix vir_q, real ewaldcoeff_q,
- matrix vir_lj, real ewaldcoeff_lj,
+ matrix vir_q, matrix vir_lj,
real *energy_q, real *energy_lj,
real lambda_q, real lambda_lj,
real *dvdlambda_q, real *dvdlambda_lj,
if (grid_index < DO_Q)
{
loop_count =
- solve_pme_yzx(pme, cfftgrid, ewaldcoeff_q,
+ solve_pme_yzx(pme, cfftgrid,
box[XX][XX]*box[YY][YY]*box[ZZ][ZZ],
bCalcEnerVir,
pme->nthread, thread);
else
{
loop_count =
- solve_pme_lj_yzx(pme, &cfftgrid, FALSE, ewaldcoeff_lj,
+ solve_pme_lj_yzx(pme, &cfftgrid, FALSE,
box[XX][XX]*box[YY][YY]*box[ZZ][ZZ],
bCalcEnerVir,
pme->nthread, thread);
}
loop_count =
- solve_pme_lj_yzx(pme, &pme->cfftgrid[2], TRUE, ewaldcoeff_lj,
+ solve_pme_lj_yzx(pme, &pme->cfftgrid[2], TRUE,
box[XX][XX]*box[YY][YY]*box[ZZ][ZZ],
bCalcEnerVir,
pme->nthread, thread);
int nnodes_major, int nnodes_minor,
t_inputrec *ir, int homenr,
gmx_bool bFreeEnergy_q, gmx_bool bFreeEnergy_lj,
- gmx_bool bReproducible, int nthread);
+ gmx_bool bReproducible,
+ real ewaldcoeff_q, real ewaldcoeff_lj,
+ int nthread);
/*! \brief Destroy the PME data structures respectively.
*
matrix box, t_commrec *cr,
int maxshift_x, int maxshift_y,
t_nrnb *nrnb, gmx_wallcycle_t wcycle,
- matrix vir_q, real ewaldcoeff_q,
- matrix vir_lj, real ewaldcoeff_lj,
+ matrix vir_q, matrix vir_lj,
real *energy_q, real *energy_lj,
real lambda_q, real lambda_lj,
real *dvdlambda_q, real *dvdlambda_lj,
DOMAINDECOMP(cr) ? dd_pme_maxshift_x(cr->dd) : 0,
DOMAINDECOMP(cr) ? dd_pme_maxshift_y(cr->dd) : 0,
nrnb, wcycle,
- fr->vir_el_recip, fr->ewaldcoeff_q,
- fr->vir_lj_recip, fr->ewaldcoeff_lj,
+ fr->vir_el_recip, fr->vir_lj_recip,
&Vlr_q, &Vlr_lj,
lambda[efptCOUL], lambda[efptVDW],
&dvdl_long_range_q, &dvdl_long_range_lj, pme_flags);
{
status = gmx_pme_init(pmedata, cr, npme_major, npme_minor, inputrec,
mtop ? mtop->natoms : 0, nChargePerturbed, nTypePerturbed,
- (Flags & MD_REPRODUCIBLE), nthreads_pme);
+ (Flags & MD_REPRODUCIBLE),
+ ewaldcoeff_q, ewaldcoeff_lj,
+ nthreads_pme);
if (status != 0)
{
gmx_fatal(FARGS, "Error %d initializing PME", status);