Gromacs  2020.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Macros | Functions
listed_forces.cpp File Reference
#include "gmxpre.h"
#include "listed_forces.h"
#include <cassert>
#include <algorithm>
#include <array>
#include "gromacs/gmxlib/network.h"
#include "gromacs/gmxlib/nrnb.h"
#include "gromacs/listed_forces/bonded.h"
#include "gromacs/listed_forces/disre.h"
#include "gromacs/listed_forces/orires.h"
#include "gromacs/listed_forces/pairs.h"
#include "gromacs/listed_forces/position_restraints.h"
#include "gromacs/math/vec.h"
#include "gromacs/mdlib/enerdata_utils.h"
#include "gromacs/mdlib/force.h"
#include "gromacs/mdtypes/commrec.h"
#include "gromacs/mdtypes/fcdata.h"
#include "gromacs/mdtypes/forcerec.h"
#include "gromacs/mdtypes/inputrec.h"
#include "gromacs/mdtypes/md_enums.h"
#include "gromacs/mdtypes/simulation_workload.h"
#include "gromacs/pbcutil/ishift.h"
#include "gromacs/pbcutil/pbc.h"
#include "gromacs/timing/wallcycle.h"
#include "gromacs/topology/topology.h"
#include "gromacs/utility/exceptions.h"
#include "gromacs/utility/fatalerror.h"
#include "gromacs/utility/smalloc.h"
#include "listed_internal.h"
#include "utilities.h"
+ Include dependency graph for listed_forces.cpp:

Description

This file defines high-level functions for mdrun to compute energies and forces for listed interactions.

Author
Mark Abraham mark..nosp@m.j.ab.nosp@m.raham.nosp@m.@gma.nosp@m.il.co.nosp@m.m

Macros

#define MAX_BONDED_THREADS   256
 The max thread number is arbitrary, we used a fixed number to avoid memory management. Using more than 16 threads is probably never useful performance wise.
 

Functions

bool anonymous_namespace{listed_forces.cpp}::isPairInteraction (int ftype)
 Return true if ftype is an explicit pair-listed LJ or COULOMB interaction type: bonded LJ (usually 1-4), or special listed non-bonded for FEP.
 
void anonymous_namespace{listed_forces.cpp}::zero_thread_output (f_thread_t *f_t)
 Zero thread-local output buffers.
 
void anonymous_namespace{listed_forces.cpp}::reduce_thread_forces (int n, gmx::ArrayRef< gmx::RVec > force, const bonded_threading_t *bt, int nthreads)
 Reduce thread-local force buffers.
 
void anonymous_namespace{listed_forces.cpp}::reduce_thread_output (int n, gmx::ForceWithShiftForces *forceWithShiftForces, real *ener, gmx_grppairener_t *grpp, real *dvdl, const bonded_threading_t *bt, const gmx::StepWorkload &stepWork)
 Reduce thread-local forces, shift forces and energies.
 
BondedKernelFlavor anonymous_namespace{listed_forces.cpp}::selectBondedKernelFlavor (const gmx::StepWorkload &stepWork, const bool useSimdKernels, const bool havePerturbedInteractions)
 Returns the bonded kernel flavor. More...
 
real anonymous_namespace{listed_forces.cpp}::calc_one_bond (int thread, int ftype, const t_idef *idef, const WorkDivision &workDivision, const rvec x[], rvec4 f[], rvec fshift[], const t_forcerec *fr, const t_pbc *pbc, const t_graph *g, gmx_grppairener_t *grpp, t_nrnb *nrnb, const real *lambda, real *dvdl, const t_mdatoms *md, t_fcdata *fcd, const gmx::StepWorkload &stepWork, int *global_atom_index)
 Calculate one element of the list of bonded interactions for this thread.
 
static void calcBondedForces (const t_idef *idef, const rvec x[], const t_forcerec *fr, const t_pbc *pbc_null, const t_graph *g, rvec *fshiftMasterBuffer, gmx_enerdata_t *enerd, t_nrnb *nrnb, const real *lambda, real *dvdl, const t_mdatoms *md, t_fcdata *fcd, const gmx::StepWorkload &stepWork, int *global_atom_index)
 Compute the bonded part of the listed forces, parallelized over threads.
 
bool haveRestraints (const t_idef &idef, const t_fcdata &fcd)
 Returns true if there are position, distance or orientation restraints.
 
bool haveCpuBondeds (const t_forcerec &fr)
 Returns true if there are CPU (i.e. not GPU-offloaded) bonded interactions to compute.
 
bool haveCpuListedForces (const t_forcerec &fr, const t_idef &idef, const t_fcdata &fcd)
 Returns true if there are listed interactions to compute. More...
 
void calc_listed (const t_commrec *cr, const gmx_multisim_t *ms, struct gmx_wallcycle *wcycle, const t_idef *idef, const rvec x[], history_t *hist, gmx::ForceOutputs *forceOutputs, const t_forcerec *fr, const struct t_pbc *pbc, const struct t_pbc *pbc_full, const struct t_graph *g, gmx_enerdata_t *enerd, t_nrnb *nrnb, const real *lambda, const t_mdatoms *md, t_fcdata *fcd, int *global_atom_index, const gmx::StepWorkload &stepWork)
 Calculates all listed force interactions. More...
 
void calc_listed_lambda (const t_idef *idef, const rvec x[], const t_forcerec *fr, const struct t_pbc *pbc, const struct t_graph *g, gmx_grppairener_t *grpp, real *epot, t_nrnb *nrnb, const real *lambda, const t_mdatoms *md, t_fcdata *fcd, int *global_atom_index)
 As calc_listed(), but only determines the potential energy for the perturbed interactions. More...
 
void do_force_listed (struct gmx_wallcycle *wcycle, const matrix box, const t_lambda *fepvals, const t_commrec *cr, const gmx_multisim_t *ms, const t_idef *idef, const rvec x[], history_t *hist, gmx::ForceOutputs *forceOutputs, const t_forcerec *fr, const struct t_pbc *pbc, const struct t_graph *graph, gmx_enerdata_t *enerd, t_nrnb *nrnb, const real *lambda, const t_mdatoms *md, t_fcdata *fcd, int *global_atom_index, const gmx::StepWorkload &stepWork)
 Do all aspects of energy and force calculations for mdrun on the set of listed interactions.
 

Function Documentation

void calc_listed ( const t_commrec *  cr,
const gmx_multisim_t ms,
struct gmx_wallcycle *  wcycle,
const t_idef *  idef,
const rvec  x[],
history_t hist,
gmx::ForceOutputs forceOutputs,
const t_forcerec *  fr,
const struct t_pbc pbc,
const struct t_pbc pbc_full,
const struct t_graph *  g,
gmx_enerdata_t *  enerd,
t_nrnb *  nrnb,
const real lambda,
const t_mdatoms md,
struct t_fcdata *  fcd,
int *  ddgatindex,
const gmx::StepWorkload stepWork 
)

Calculates all listed force interactions.

Note that pbc_full is used only for position restraints, and is not initialized if there are none.

void calc_listed_lambda ( const t_idef *  idef,
const rvec  x[],
const t_forcerec *  fr,
const struct t_pbc pbc,
const struct t_graph *  g,
gmx_grppairener_t *  grpp,
real epot,
t_nrnb *  nrnb,
const real lambda,
const t_mdatoms md,
struct t_fcdata *  fcd,
int *  global_atom_index 
)

As calc_listed(), but only determines the potential energy for the perturbed interactions.

The shift forces in fr are not affected.

bool haveCpuListedForces ( const t_forcerec &  fr,
const t_idef &  idef,
const t_fcdata &  fcd 
)

Returns true if there are listed interactions to compute.

NOTE: the current implementation returns true if there are position restraints or any bonded interactions computed on the CPU.