"plugins/rpmd/platforms/common/src/CommonRpmdKernels.cpp" did not exist on "300758a54ec4185b3ff7061d4a95db3a9dd9ef8e"
TestATMForce.py 3.51 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import unittest
from openmm import *
from openmm.app import *
from openmm.unit import *

class TestATMForce(unittest.TestCase):
    """Tests the ATMForce"""

    def test2ParticlesNonbonded(self):
        """Test for a Nonbonded force previously added to the System"""
        system = System()
        system.addParticle(1.0)
        system.addParticle(1.0)

        nbforce = NonbondedForce();
        nbforce.addParticle( 1.0, 1.0, 1.0)
        nbforce.addParticle(-1.0, 1.0, 1.0)

        system.addForce(nbforce)

        atmforce = ATMForce(0.5, 0.5, 0, 0, 0,   0, 0, 0,  1.0)
22
23
24
        atmforce.addParticle()
        p = atmforce.addParticle()
        atmforce.setParticleTransformation(p, FixedDisplacement(Vec3(1., 0., 0.)))
25
26
27
28
29
30

        atmforce.addForce(copy.copy(nbforce))
        system.removeForce(0)
        system.addForce(atmforce)

        integrator = VerletIntegrator(1.0)
Peter Eastman's avatar
Peter Eastman committed
31
        platform = Platform.getPlatform('Reference')
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
        context = Context(system, integrator, platform)

        positions = []
        positions.append(Vec3(0., 0., 0.))
        positions.append(Vec3(1., 0., 0.))
        context.setPositions(positions)

        state = context.getState(getEnergy = True, getForces = True)
        epot = state.getPotentialEnergy()
        
        (u1, u0, energy) = atmforce.getPerturbationEnergy(context)
        epert = u1 - u0

        #print("Potential energy = ", epot)
        #print("ATM perturbation energy = ", epert)
        
        epot_expected = -104.2320*kilojoules_per_mole
        epert_expected = 69.4062*kilojoules_per_mole
        assert( abs(epot-epot_expected) < 1.e-3*kilojoules_per_mole )
        assert( abs(epert-epert_expected) < 1.e-3*kilojoules_per_mole )
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
        assert isinstance(atmforce.getParticleTransformation(0), FixedDisplacement)

    def test3ParticlesNonbondedSwap(self):
        """Test coordinate swap"""
        system = System()
        system.addParticle(1.0)
        system.addParticle(1.0)
        system.addParticle(1.0)

        nbforce = NonbondedForce();
        nbforce.addParticle( 0.0, 1.0, 1.0)
        nbforce.addParticle( 1.0, 1.0, 1.0)
        nbforce.addParticle(-1.0, 1.0, 1.0)

        atmforce = ATMForce(0.5, 0.5, 0, 0, 0,   0, 0, 0,  1.0)
        atmforce.addParticle() #particle 0 is not displaced

        #particle 1's coordinate is swapped with 2
        p = atmforce.addParticle()
        atmforce.setParticleTransformation(p, ParticleOffsetDisplacement(2,  1))

        #particle 2's coordinate is swapped with 1
        p = atmforce.addParticle()
        atmforce.setParticleTransformation(p, ParticleOffsetDisplacement(1,  2))

        atmforce.addForce(nbforce)
        system.addForce(atmforce)

        integrator = VerletIntegrator(1.0)
        platform = Platform.getPlatform('Reference')
        context = Context(system, integrator, platform)

        positions = []
        positions.append(Vec3( 0., 0., 0.))
        positions.append(Vec3( 1., 0., 0.))
        positions.append(Vec3(-1., 0., 0.))
        context.setPositions(positions)

        state = context.getState(getEnergy = True, getForces = True)
        epot = state.getPotentialEnergy()

        (u1, u0, energy) = atmforce.getPerturbationEnergy(context)
        epert = u1 - u0

        #print("Potential energy = ", epot)
        #print("ATM perturbation energy = ", epert)

        epot_expected = -69.52925*kilojoules_per_mole
        epert_expected = 0*kilojoules_per_mole
        assert( abs(epot-epot_expected) < 1.e-3*kilojoules_per_mole )
        assert( abs(epert-epert_expected) < 1.e-3*kilojoules_per_mole )