MonteCarloFlexibleBarostat

class MonteCarloFlexibleBarostat : public OpenMM::Force

This class uses a Monte Carlo algorithm to adjust the size and shape of the periodic box, simulating the effect of constant pressure.

This class is similar to MonteCarloBarostat, but it simulates a fully flexible periodic box in which all three lengths and all three angles are free to change independently. It is primarily useful for simulations of bulk materials where the shape of a crystal’s unit cell may not be known in advance, or could even change with time as it transitions between phases.

Like MonteCarloBarostat, the default behavior of this class is to scale the centroid position of each molecule while holding it rigid. In simulations of materials where all atoms are covalently bonded to each other, this behavior will not work well since the entire system then consists of a single molecule. You can use setScaleMoleculesAsRigid() to disable this behavior and instead have it scale the position of every atom independently.

This class assumes the simulation is also being run at constant temperature, and requires you to specify the system temperature (since it affects the acceptance probability for Monte Carlo moves). It does not actually perform temperature regulation, however. You must use another mechanism along with it to maintain the temperature, such as LangevinIntegrator or AndersenThermostat.

Public Functions

MonteCarloFlexibleBarostat(double defaultPressure, double defaultTemperature, int frequency = 25, bool scaleMoleculesAsRigid = true)

Create a MonteCarloFlexibleBarostat.

Parameters
  • defaultPressure – the default pressure acting on the system (in bar)

  • defaultTemperature – the default temperature at which the system is being maintained (in Kelvin)

  • frequency – the frequency at which Monte Carlo pressure changes should be attempted (in time steps)

  • scaleMoleculesAsRigid – if true, coordinate scaling keeps molecules rigid, scaling only the center of mass of each one. If false, every atom is scaled independently.

inline double getDefaultPressure() const

Get the default pressure acting on the system (in bar).

Returns

the default pressure acting on the system, measured in bar.

void setDefaultPressure(double pressure)

Set the default pressure acting on the system. This will affect any new Contexts you create, but not ones that already exist.

Parameters

pressure – the default pressure acting on the system, measured in bar.

inline int getFrequency() const

Get the frequency (in time steps) at which Monte Carlo pressure changes should be attempted. If this is set to 0, the barostat is disabled.

void setFrequency(int freq)

Set the frequency (in time steps) at which Monte Carlo pressure changes should be attempted. If this is set to 0, the barostat is disabled.

inline double getDefaultTemperature() const

Get the default temperature at which the system is being maintained, measured in Kelvin.

void setDefaultTemperature(double temp)

Set the default temperature at which the system is being maintained. This will affect any new Contexts you create, but not ones that already exist.

Parameters

temp – the system temperature, measured in Kelvin.

inline int getRandomNumberSeed() const

Get the random number seed. See setRandomNumberSeed() for details.

inline void setRandomNumberSeed(int seed)

Set the random number seed. It is guaranteed that if two simulations are run with different random number seeds, the sequence of Monte Carlo steps will be different. On the other hand, no guarantees are made about the behavior of simulations that use the same seed. In particular, Platforms are permitted to use non-deterministic algorithms which produce different results on successive runs, even if those runs were initialized identically.

If seed is set to 0 (which is the default value assigned), a unique seed is chosen when a Context is created from this Force. This is done to ensure that each Context receives unique random seeds without you needing to set them explicitly.

inline virtual bool usesPeriodicBoundaryConditions() const

Returns whether or not this force makes use of periodic boundary conditions.

Returns

true if force uses PBC and false otherwise

inline bool getScaleMoleculesAsRigid() const

Get whether scaling is applied to the centroid of each molecule while keeping the molecules rigid, or to each atom independently.

Returns

true if scaling is applied to molecule centroids, false if it is applied to each atom independently.

inline void setScaleMoleculesAsRigid(bool rigid)

Set whether scaling is applied to the centroid of each molecule while keeping the molecules rigid, or to each atom independently.

void computeCurrentPressure(Context &context, std::vector<double> &pressure) const

Compute the instantaneous pressure of a system to which this barostat is applied. All six non-zero components of the pressure tensor are computed, where each one corresponds to the derivative of the energy with respect to an element of the matrix of box vectors.

The pressure is computed from the molecular virial if getScaleMoleculesAsRigid() is true, or the atomic virial if it is false. It uses a finite difference to calculate the derivative of potential energy with respect to volume. For most systems in equilibrium, the time average of the instantaneous pressure should equal the pressure applied by the barostat. Fluctuations around the average value can be extremely large, however, and it may take a very long simulation to accurately compute the average.

Parameters
  • context – the Context for which to compute the current pressure

  • pressure – on exit, this will contain the six non-zero elements of the pressure tensor in the order (XX, YY, ZZ, XY, XZ, YZ)

Public Static Functions

static inline const std::string &Pressure()

This is the name of the parameter which stores the current pressure acting on the system (in bar).

static inline const std::string &Temperature()

This is the name of the parameter which stores the current temperature at which the system is being maintained (in Kelvin)