File: charge_fit.py

package info (click to toggle)
mmtk 2.7.9-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 11,788 kB
  • ctags: 6,600
  • sloc: python: 18,050; ansic: 12,400; makefile: 129; csh: 3
file content (36 lines) | stat: -rw-r--r-- 1,347 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# This program demonstrates how point charges can be fitted to
# known values of the electrostatic potential energy surface.
# In a real application, these values would come from an
# ab-initio calculation.
#
from MMTK import *
from MMTK.ChargeFit import ChargeFit, TotalChargeConstraint, \
                           evaluationPoints

# Construct a small system of two atoms.
a1 = Atom('C', position=Vector(-0.05,0.,0.))
a2 = Atom('C', position=Vector( 0.05,0.,0.))
system = Collection(a1, a2)

# Define charges. Note that their sum is not zero.
a1.charge = -0.75
a2.charge = 0.76

# Calculate the electrostatic potential energy of the two charges.
# This is obviously unrealistic; in a real application, the potential
# energy surface would not be due to known point charges, but come
# from ab-initio calculations.
points = []
for r in evaluationPoints(system, 50):
    p = 0.
    for atom in system.atomList():
        p = p + atom.charge/(r-atom.position()).length()
    points.append((r, p*Units.electrostatic_energy))

# Define a charge constraint that ensures neutrality of the total system.
constraints = [TotalChargeConstraint(system, 0.)]

# Perform the fit and print the two fitted charges. They are not equal
# to the input charges due to the neutrality constraint.
fit = ChargeFit(system, points, constraints)
print fit[a1], fit[a2]