ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/trunk/src/applications/utilities/stat2dielectric
Revision: 2007
Committed: Wed Jul 2 19:03:53 2014 UTC (10 years, 10 months ago) by gezelter
File size: 4982 byte(s)
Log Message:
Most recent version

File Contents

# Content
1 #!@PYTHON_EXECUTABLE@
2 """A script that computes the static dielectric constant
3
4 Accumulates the static dielectric constant from an OpenMD stat file
5 that has been run with the SYSTEM_DIPOLE added to the statFileFormat.
6
7 This assumes the fluctuation formula appropriate for conducting
8 boundaries:
9
10 <M^2> - <M>^2
11 eps = 1 + -----------------
12 3 kB <T> <V> eps0
13
14 eps: dielectric constant
15 M: total dipole moment of the box
16 <V>: average volume of the box
17 <T>: average temperature
18 eps0: vacuum permittivity
19 kB: Boltzmann constant
20
21 See M. Neumann, O. Steinhauser, and G. S. Pawley, Mol. Phys. 52, 97 (1984).
22
23 Usage: stat2dielectric
24
25 Options:
26 -h, --help show this help
27 -f, --stat-file=... use specified stat file
28 -o, --output-file=... use specified output (.dielectric) file
29
30 To use this, the OpenMD file for the run should specify:
31
32 statFileFormat = "TIME|TOTAL_ENERGY|POTENTIAL_ENERGY|KINETIC_ENERGY|TEMPERATURE|PRESSURE|VOLUME|CONSERVED_QUANTITY|SYSTEM_DIPOLE";
33
34 This line will get OpenMD to compute the total system dipole and place
35 it in the final three columns of the stat file. The stat2dielectric
36 script looks for the temperature in column 5, the volume in column 7,
37 and the dipole vector in the last 3 columns of the stat file.
38
39 Example:
40 stat2dielectric -f stockmayer.stat -o stockmayer.dielectric
41
42 """
43
44 __author__ = "Dan Gezelter (gezelter@nd.edu)"
45 __version__ = "$Revision: $"
46 __date__ = "$Date: $"
47
48 __copyright__ = "Copyright (c) 2014 by the University of Notre Dame"
49 __license__ = "OpenMD"
50
51 import sys
52 import getopt
53 import string
54 import math
55
56 def usage():
57 print __doc__
58
59 def readStatFile(statFileName):
60 global time
61 global temperature
62 global volume
63 global boxDipole
64 time = []
65 temperature = []
66 volume = []
67 boxDipole = []
68
69 statFile = open(statFileName, 'r')
70 line = statFile.readline()
71
72 print "reading File"
73 line = statFile.readline()
74 while 1:
75 L = line.split()
76
77 time.append(float(L[0]))
78 temperature.append(float(L[4]))
79 volume.append(float(L[6]))
80 dipX = float(L[-3])
81 dipY = float(L[-2])
82 dipZ = float(L[-1])
83 boxDipole.append([dipX, dipY, dipZ])
84
85 line = statFile.readline()
86 if not line: break
87
88 statFile.close()
89
90 def computeAverages(outFileName):
91
92 # permittivity in C^2 N^-1 m^-2
93 eps0 = 8.854187817620E-12
94 # Boltzmann constant in J / K
95 kB = 1.380648E-23
96 # Convert angstroms^3 to m^3
97 a3tom3 = 1.0E-30
98
99 M2 = 0.0
100 M = 0.0
101 Dx = 0.0
102 Dy = 0.0
103 Dz = 0.0
104 Temp = 0.0
105 Vol = 0.0
106
107 print "computing Dielectrics"
108 outFile = open(outFileName, 'w')
109
110 for i in range(len(time)):
111
112 dipX = boxDipole[i][0]
113 dipY = boxDipole[i][1]
114 dipZ = boxDipole[i][2]
115
116 length2 = dipX*dipX + dipY*dipY + dipZ*dipZ
117 M2 += length2
118 M2avg = M2 / float(1+i)
119
120 Dx += dipX
121 Dy += dipY
122 Dz += dipZ
123
124 # the average of each of the three components of the box dipole
125 Mx = Dx / float(1+i)
126 My = Dy / float(1+i)
127 Mz = Dz / float(1+i)
128 Mavg = Mx*Mx + My*My + Mz*Mz
129
130 # the average of the box dipole vector length
131 M += math.sqrt(length2)
132 Mavg2 = M / float(1+i)
133
134 Temp += temperature[i]
135 Tavg = Temp / float(1+i)
136
137 Vol += volume[i] * a3tom3
138 Vavg = Vol / float(1+i)
139
140 dielectric1 = 1.0 + (M2avg - Mavg) / (3.0*eps0*kB*Tavg*Vavg)
141 dielectric2 = 1.0 + (M2avg - Mavg2*Mavg2) / (3.0*eps0*kB*Tavg*Vavg)
142
143 outFile.write("%lf\t%lf\t%lf\n" % (time[i], dielectric1, dielectric2))
144
145 outFile.close()
146
147
148 def main(argv):
149 global haveStatFileName
150 global haveOutputFileName
151
152 haveStatFileName = False
153 haveOutputFileName = False
154
155 try:
156 opts, args = getopt.getopt(argv, "hf:o:", ["help", "stat-file=", "output-file="])
157 except getopt.GetoptError:
158 usage()
159 sys.exit(2)
160 for opt, arg in opts:
161 if opt in ("-h", "--help"):
162 usage()
163 sys.exit()
164 elif opt in ("-f", "--stat-file"):
165 statFileName = arg
166 haveStatFileName = True
167 elif opt in ("-o", "--output-file"):
168 outputFileName = arg
169 haveOutputFileName = True
170 if (not haveStatFileName):
171 usage()
172 print "No stat file was specified"
173 sys.exit()
174 if (not haveOutputFileName):
175 usage()
176 print "No output file was specified"
177 sys.exit()
178
179 readStatFile(statFileName)
180 computeAverages(outputFileName)
181
182
183 if __name__ == "__main__":
184 if len(sys.argv) == 1:
185 usage()
186 sys.exit()
187 main(sys.argv[1:])

Properties

Name Value
svn:executable *