Source code for ase.constraints.fix_com

from ase.constraints.constraint import FixConstraint, IndexedConstraint


[docs] class FixCom(FixConstraint): """Constraint class for fixing the center of mass.""" index = slice(None) # all atoms def get_removed_dof(self, atoms): return 3 def adjust_positions(self, atoms, new): masses = atoms.get_masses()[self.index] old_cm = atoms.get_center_of_mass(indices=self.index) new_cm = masses @ new[self.index] / masses.sum() diff = old_cm - new_cm new += diff def adjust_momenta(self, atoms, momenta): """Adjust momenta so that the center-of-mass velocity is zero.""" masses = atoms.get_masses()[self.index] velocity_com = momenta[self.index].sum(axis=0) / masses.sum() momenta[self.index] -= masses[:, None] * velocity_com def adjust_forces(self, atoms, forces): # Eqs. (3) and (7) in https://doi.org/10.1021/jp9722824 masses = atoms.get_masses()[self.index] lmd = masses @ forces[self.index] / sum(masses**2) forces[self.index] -= masses[:, None] * lmd def todict(self): return {'name': 'FixCom', 'kwargs': {}}
[docs] class FixSubsetCom(FixCom, IndexedConstraint): """Constraint class for fixing the center of mass of a subset of atoms.""" def __init__(self, indices): super().__init__(indices=indices) def todict(self): return { 'name': self.__class__.__name__, 'kwargs': {'indices': self.index.tolist()}, }