Coverage for openxps/integrators/symmetric_verlet.py: 100%
16 statements
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-13 22:08 +0000
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-13 22:08 +0000
1"""
2.. module:: openxps.integrators.symmetric_verlet
3 :platform: Linux, MacOS, Windows
4 :synopsis: Velocity Verlet integrator.
6.. classauthor:: Charlles Abreu <craabreu@gmail.com>
8"""
10import openmm as mm
11from openmm import unit as mmunit
13from openxps.utils import preprocess_args
15from .utils import IntegratorMixin
18class SymmetricVerletIntegrator(IntegratorMixin, mm.CustomIntegrator):
19 """A symmetric velocity Verlet integrator.
21 Parameters
22 ----------
23 stepSize
24 The step size with which to integrate the system.
26 Example
27 -------
28 >>> import openxps as xps
29 >>> from openmm import unit
30 >>> integrator = xps.integrators.SymmetricVerletIntegrator(1 * unit.femtosecond)
31 >>> integrator
32 Per-dof variables:
33 x1
34 Computation steps:
35 0: allow forces to update the context state
36 1: v <- v + 0.5*dt*f/m
37 2: x <- x + dt*v
38 3: x1 <- x
39 4: constrain positions
40 5: v <- v + (x-x1)/dt + 0.5*dt*f/m
41 6: constrain velocities
42 """
44 @preprocess_args
45 def __init__(self, stepSize: mmunit.Quantity):
46 super().__init__(stepSize)
47 self.addPerDofVariable("x1", 0)
48 self.addUpdateContextState()
49 self.addComputePerDof("v", "v + 0.5*dt*f/m")
50 self.addComputePerDof("x", "x + dt*v")
51 self.addComputePerDof("x1", "x")
52 self.addConstrainPositions()
53 self.addComputePerDof("v", "v + (x-x1)/dt + 0.5*dt*f/m")
54 self.addConstrainVelocities()