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

1""" 

2.. module:: openxps.integrators.symmetric_verlet 

3 :platform: Linux, MacOS, Windows 

4 :synopsis: Velocity Verlet integrator. 

5 

6.. classauthor:: Charlles Abreu <craabreu@gmail.com> 

7 

8""" 

9 

10import openmm as mm 

11from openmm import unit as mmunit 

12 

13from openxps.utils import preprocess_args 

14 

15from .utils import IntegratorMixin 

16 

17 

18class SymmetricVerletIntegrator(IntegratorMixin, mm.CustomIntegrator): 

19 """A symmetric velocity Verlet integrator. 

20 

21 Parameters 

22 ---------- 

23 stepSize 

24 The step size with which to integrate the system. 

25 

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 """ 

43 

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()