FixCenterOfMass

class FixCenterOfMass(fix_cartesian_direction=None)

This constraint fixes the center-of-mass of the system in a MolecularDynamics() simulation.

Parameters:fix_cartesian_direction (list(3) of bools) – Flags to apply the position constraints of this group of atoms only to the selected certain cartesian directions.
Default: [True, True, True]
frozenDegreesOfFreedom(local_atoms=None)
Parameters:local_atoms (list of int | None) – The group of atoms from which the frozen degrees of freedom should be calculated, e.g. a thermalized group of atoms.
Default: All atoms.
Returns:The number of degrees of freedom that are frozen by the constraints.
Return type:int

Usage Examples

Run an MD simulation of a decane molecule with the center-of-mass of the molecule fixed.

# Define elements
elements = [Hydrogen, Carbon, Hydrogen, Hydrogen, Carbon, Hydrogen, Hydrogen,
            Carbon, Hydrogen, Hydrogen, Carbon, Hydrogen, Hydrogen, Carbon,
            Hydrogen, Hydrogen, Carbon, Hydrogen, Hydrogen, Carbon, Hydrogen,
            Hydrogen, Carbon, Hydrogen, Hydrogen, Carbon, Hydrogen, Hydrogen,
            Carbon, Hydrogen, Hydrogen, Hydrogen]

# Define coordinates
cartesian_coordinates = [[ 2.949218676646,  0.371893089344, -5.977841255567],
                         [ 2.0915751053  ,  0.325878896596, -5.255719576195],
                         [ 1.450283574002,  1.214213807408, -5.492967455154],
                         [ 1.451118166918, -0.526603584715, -5.601873618684],
                         [ 1.822966280268,  0.248365819288, -4.006203357873],
                         [ 2.452472374579, -0.657496389029, -3.794106921656],
                         [ 2.454588788042,  1.119399272419, -3.683412523973],
                         [ 1.11002977129 ,  0.182932682631, -2.941890060606],
                         [ 0.514074186602,  1.11809089051 , -3.137372769128],
                         [ 0.511494198217, -0.719003710087, -3.252072509036],
                         [ 0.842624096707,  0.10516011283 , -1.690762149425],
                         [ 1.491345296758, -0.78355395752 , -1.471599662887],
                         [ 1.494967653129,  0.95670152228 , -1.362236499313],
                         [ 0.132859680402,  0.039658959846, -0.626048074315],
                         [-0.482794358104,  0.9589027956  , -0.827177016793],
                         [-0.487026068393, -0.844146311539, -0.940982573926],
                         [-0.132380369437, -0.038781999777,  0.626344899449],
                         [ 0.483113914589, -0.95814352964 ,  0.827391526337],
                         [ 0.487761818334,  0.84474606991 ,  0.941323554846],
                         [-0.842177289594, -0.104271778821,  1.690893077731],
                         [-1.490395532317,  0.784892174015,  1.472217773116],
                         [-1.494937459238, -0.955400183967,  1.362016363174],
                         [-1.109932511965, -0.182939754747,  2.942043484298],
                         [-0.515413707857, -1.119341268799,  3.136533689731],
                         [-0.509862540826,  0.71770586625 ,  3.253250779134],
                         [-1.823114817881, -0.248387001392,  4.00605213455 ],
                         [-2.451181382366,  0.658629838415,  3.794745029733],
                         [-2.456019886489, -1.118078262521,  3.682204447835],
                         [-2.092097378568, -0.326797885494,  5.255445507069],
                         [-1.454808166348, -1.218140992161,  5.492314817703],
                         [-1.448149189819,  0.522735169126,  5.602345190585],
                         [-2.95020692258 , -0.368818356258,  5.97713874924 ]]*Angstrom

# Set up configuration
molecule_configuration = MoleculeConfiguration(
    elements=elements,
    cartesian_coordinates=cartesian_coordinates
    )

potentialSet = Tersoff_CH_2010()
calculator = TremoloXCalculator(parameters=potentialSet)

molecule_configuration.setCalculator(calculator)
molecule_configuration.update()

initial_velocity = MaxwellBoltzmannDistribution(
    temperature=300.0*Kelvin,
    remove_center_of_mass_momentum=False
)

method = Langevin(
    time_step=1*femtoSecond,
    reservoir_temperature=300*Kelvin,
    friction=0.01*femtoSecond**-1,
    initial_velocity=initial_velocity,
    heating_rate=0*Kelvin/picoSecond,
)

# Run MD with FixCenterOfMass constraint.
md_trajectory = MolecularDynamics(
    molecule_configuration,
    constraints=[FixCenterOfMass()],
    trajectory_filename='decane_fix_center_of_mass_md.nc',
    steps=500,
    log_interval=10,
    method=method
)

molecule_configuration = md_trajectory.lastImage()

Notes

  • FixCenterOfMass can be used in MolecularDynamics simulations to constrain the center-of-mass of the configuration.
  • In principle, it is sufficient to set remove_center_of_mass_momentum=False in the initial velocity object (e.g. MaxwellBoltzmannDistribution), to achieve this. Sometimes, however, numerical inaccuracies in the force calculation (e.g when using Ewald summation techniques, as in CoulombSPME) can give rise to a finite force on the center-of-mass, resulting in an unwanted drift of the system. In this case it may be convenient to apply a FixCenterOfMass constraint, to remove this effect.
  • When using the Langevin integrator, the stochastic force will cause a diffusion of the center-of-mass vector, which can be avoided by using a FixCenterOfMass constraint.
  • With the fix_cartesian_direction parameter you can fix individual cartesian components of the center-of-mass-vector.
  • FixCenterOfMass constraints cannot be used together with FixAtomConstraints in the same MD simulation.