OpenMM C++ API

The C++ API provides information about the classes and methods available in OpenMM for C++ developers. OpenMM uses an object-oriented API that makes all its functionality available through a small number of classes.

Core classes


A System specifies generic properties of the molecular system to be simulated: the number of particles it contains, the mass of each one, the size of the periodic box, and so on. The interactions between the particles are specified through a set of Force objects that are added to the System. Force field specific parameters, such as particle charges, are stored in these Force objects, not as direct properties of the System.


A Context stores all of the state information for a simulation: particle positions and velocities, as well as arbitrary parameters defined by the Forces in the System. It is possible to create multiple Contexts for a single System, and thus have multiple simulations of that System in progress at the same time. Context does not provide methods for accessing state variables directly; they must be read via a State object.


A State object must be constructed before data can be read from a simulation. State variables are not accessible directly via a Context in order to make explicit the precise time that a variable reflects. A State is created by calling a method on a Context and stores only the information requested at invocation.


A Platform is a single implementation of OpenMM at a low level. This allows the same high level API documented here to be used on all sorts of compute hardware, from GPUs to supercomputers. A Platform implements some set of kernels, which define which operations it supports. Writing a new Platform allows OpenMM to be ported to new hardware or to be implemented in a new way without rewriting the entire application.


Force objects define the behavior of the particles in a System. The Force class is actually slightly more general than its name suggests. A Force can, indeed, apply forces to particles, but it can also directly modify particle positions and velocities in arbitrary ways. Some thermostats and barostats, for example, can be implemented as Force classes. Examples of Force subclasses include HarmonicBondForce, NonbondedForce, and MonteCarloBarostat.


An Integrator implements an algorithm for advancing the simulation through time. They provide a Context a means of stepping the simulation forward, and must be coupled to a Context to function. Examples of Integrator subclasses include LangevinIntegrator, VerletIntegrator, and BrownianIntegrator.


OpenMM’s public API includes a few more classes that support the above.