Scripts/MMTK: plotMD.py

File plotMD.py, 2.2 KB (added by Conrad Huang, 16 years ago)

Example code for following MD of argon atoms and plotting system potential energy

Line 
1from MMTK import *
2from MMTK.Geometry import SCLattice
3from MMTK.ForceFields import LennardJonesForceField
4from MMTK.Environment import NoseThermostat, AndersenBarostat
5from MMTK.Trajectory import Trajectory, TrajectoryOutput, StandardLogOutput
6from MMTK.Dynamics import VelocityVerletIntegrator, VelocityScaler, \
7 TranslationRemover, BarostatReset
8
9edge = 3.2864
10n = 9
11temperature = 94.4*Units.K
12pressure = 1.*Units.atm
13
14ff = LennardJonesForceField(1.5)
15universe = CubicPeriodicUniverse(edge, ff)
16for point in SCLattice(edge/n, (n, n, n)):
17 universe.addObject(Atom('Ar', position=point))
18
19# Create corresponding Chimera molecule
20from MMTK2Molecule import convert
21m, atomMap = convert(universe)
22from chimera import openModels
23openModels.add([m])
24from chimera import runCommand
25runCommand("window ; repr stick")
26
27# Create energy plot that will eventually be updated when
28# we integrate
29from chimera.mplDialog import MPLDialog
30class EnergyPlot(MPLDialog):
31 title = "potential energy vs. time step"
32 def __init__(self, initialEnergy):
33 MPLDialog.__init__(self)
34 self.energies = [ initialEnergy ]
35 self.subplot = self.add_subplot(1, 1, 1)
36 self._displayData()
37
38 def _displayData(self):
39 ax = self.subplot
40 ax.clear()
41 ax.plot(self.energies)
42 self.draw()
43
44 def addEnergy(self, energy):
45 self.energies.append(energy)
46 self._displayData()
47
48energyPlot = EnergyPlot(universe.energy())
49def updatePlot(universe, atomMap, state, plot=energyPlot):
50 if state is None:
51 e = universe.energy()
52 else:
53 e = state["potential_energy"]
54 plot.addEnergy(e)
55
56universe.initializeVelocitiesToTemperature(temperature)
57
58universe.thermostat = NoseThermostat(temperature)
59universe.barostat = AndersenBarostat(pressure)
60
61integrator = VelocityVerletIntegrator(universe, delta_t=10*Units.fs,
62 background=True)
63
64# Note that we do NOT use StandardLogOutput because printing
65# in Chimera is not thread-safe (yet)
66thread = integrator(steps = 2000,
67 actions = [TranslationRemover(0, None, 100),
68 VelocityScaler(temperature, 0.1*temperature,
69 0, None, 100),
70 BarostatReset(100)])
71from MMTK2Molecule import updateChimera
72updateChimera(thread, universe, atomMap, 15, callback=updatePlot)