modernize tinker2lmp scripts so they run with both python2.7 and python3.x
This commit is contained in:
@ -3,16 +3,17 @@
|
||||
#
|
||||
# Copyright (2005) Sandia Corporation. Under the terms of Contract
|
||||
# DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
# certain rights in this software. This software is distributed under
|
||||
# certain rights in this software. This software is distributed under
|
||||
# the GNU General Public License.
|
||||
|
||||
# data tool
|
||||
|
||||
from __future__ import print_function
|
||||
oneline = "Read, write, manipulate LAMMPS data files"
|
||||
|
||||
docstr = """
|
||||
d = data("data.poly") read a LAMMPS data file, can be gzipped
|
||||
d = data() create an empty data file
|
||||
d = data() create an empty data file
|
||||
|
||||
d.map(1,"id",3,"x") assign names to atom columns (1-N)
|
||||
|
||||
@ -26,17 +27,17 @@ d.reorder("Atoms",1,3,2,4,5) reorder columns (1-N) in a data file section
|
||||
|
||||
1,3,2,4,5 = new order of previous columns, can delete columns this way
|
||||
|
||||
d.title = "My LAMMPS data file" set title of the data file
|
||||
d.title = "My LAMMPS data file" set title of the data file
|
||||
d.headers["atoms"] = 1500 set a header value
|
||||
d.sections["Bonds"] = lines set a section to list of lines (with newlines)
|
||||
d.delete("bonds") delete a keyword or section of data file
|
||||
d.delete("bonds") delete a keyword or section of data file
|
||||
d.delete("Bonds")
|
||||
d.replace("Atoms",5,vec) replace Nth column of section with vector
|
||||
d.newxyz(dmp,1000) replace xyz in Atoms with xyz of snapshot N
|
||||
d.replace("Atoms",5,vec) replace Nth column of section with vector
|
||||
d.newxyz(dmp,1000) replace xyz in Atoms with xyz of snapshot N
|
||||
|
||||
newxyz assumes id,x,y,z are defined in both data and dump files
|
||||
also replaces ix,iy,iz if they are defined
|
||||
|
||||
|
||||
index,time,flag = d.iterator(0/1) loop over single data file snapshot
|
||||
time,box,atoms,bonds,tris,lines = d.viz(index) return list of viz objects
|
||||
|
||||
@ -53,7 +54,7 @@ time,box,atoms,bonds,tris,lines = d.viz(index) return list of viz objects
|
||||
NULL if bonds do not exist
|
||||
tris = NULL
|
||||
lines = NULL
|
||||
|
||||
|
||||
d.write("data.new") write a LAMMPS data file
|
||||
"""
|
||||
|
||||
@ -65,7 +66,7 @@ d.write("data.new") write a LAMMPS data file
|
||||
|
||||
# Variables
|
||||
# title = 1st line of data file
|
||||
# names = dictionary with atom attributes as keys, col #s as values
|
||||
# names = dictionary with atom attributes as keys, col #s as values
|
||||
# headers = dictionary with header name as key, value or tuple as values
|
||||
# sections = dictionary with section name as key, array of lines as values
|
||||
# nselect = 1 = # of snapshots
|
||||
@ -79,13 +80,13 @@ except: PIZZA_GUNZIP = "gunzip"
|
||||
|
||||
# Class definition
|
||||
|
||||
class data:
|
||||
class data(object):
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
|
||||
def __init__(self,*list):
|
||||
self.nselect = 1
|
||||
|
||||
|
||||
if len(list) == 0:
|
||||
self.title = "LAMMPS data file"
|
||||
self.names = {}
|
||||
@ -99,7 +100,7 @@ class data:
|
||||
|
||||
self.title = f.readline()
|
||||
self.names = {}
|
||||
|
||||
|
||||
headers = {}
|
||||
while 1:
|
||||
line = f.readline()
|
||||
@ -109,16 +110,16 @@ class data:
|
||||
found = 0
|
||||
for keyword in hkeywords:
|
||||
if line.find(keyword) >= 0:
|
||||
found = 1
|
||||
words = line.split()
|
||||
if keyword == "xlo xhi" or keyword == "ylo yhi" or \
|
||||
keyword == "zlo zhi":
|
||||
headers[keyword] = (float(words[0]),float(words[1]))
|
||||
elif keyword == "xy xz yz":
|
||||
headers[keyword] = \
|
||||
found = 1
|
||||
words = line.split()
|
||||
if keyword == "xlo xhi" or keyword == "ylo yhi" or \
|
||||
keyword == "zlo zhi":
|
||||
headers[keyword] = (float(words[0]),float(words[1]))
|
||||
elif keyword == "xy xz yz":
|
||||
headers[keyword] = \
|
||||
(float(words[0]),float(words[1]),float(words[2]))
|
||||
else:
|
||||
headers[keyword] = int(words[0])
|
||||
headers[keyword] = int(words[0])
|
||||
if not found:
|
||||
break
|
||||
|
||||
@ -128,22 +129,21 @@ class data:
|
||||
for pair in skeywords:
|
||||
keyword,length = pair[0],pair[1]
|
||||
if keyword == line:
|
||||
found = 1
|
||||
if not headers.has_key(length):
|
||||
raise StandardError, \
|
||||
"data section %s has no matching header value" % line
|
||||
f.readline()
|
||||
found = 1
|
||||
if length not in headers:
|
||||
raise (Exception, "data section %s has no matching header value" % line)
|
||||
f.readline()
|
||||
list = []
|
||||
for i in xrange(headers[length]): list.append(f.readline())
|
||||
for i in range(headers[length]): list.append(f.readline())
|
||||
sections[keyword] = list
|
||||
if not found:
|
||||
raise StandardError,"invalid section %s in data file" % line
|
||||
raise (Exception,"invalid section %s in data file" % line)
|
||||
f.readline()
|
||||
line = f.readline()
|
||||
if not line:
|
||||
break
|
||||
line = line.strip()
|
||||
|
||||
|
||||
f.close()
|
||||
self.headers = headers
|
||||
self.sections = sections
|
||||
@ -153,7 +153,7 @@ class data:
|
||||
|
||||
def map(self,*pairs):
|
||||
if len(pairs) % 2 != 0:
|
||||
raise StandardError, "data map() requires pairs of mappings"
|
||||
raise Exception("data map() requires pairs of mappings")
|
||||
for i in range(0,len(pairs),2):
|
||||
j = i + 1
|
||||
self.names[pairs[j]] = pairs[i]-1
|
||||
@ -168,7 +168,7 @@ class data:
|
||||
lines = self.sections[field]
|
||||
for line in lines:
|
||||
words = line.split()
|
||||
values = map(float,words)
|
||||
values = list(map(float,words))
|
||||
array.append(values)
|
||||
return array
|
||||
elif len(list) == 2:
|
||||
@ -181,7 +181,7 @@ class data:
|
||||
vec.append(float(words[n]))
|
||||
return vec
|
||||
else:
|
||||
raise StandardError, "invalid arguments for data.get()"
|
||||
raise Exception("invalid arguments for data.get()")
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# reorder columns in a data file field
|
||||
@ -192,10 +192,10 @@ class data:
|
||||
oldlines = self.sections[name]
|
||||
newlines = natoms*[""]
|
||||
for index in order:
|
||||
for i in xrange(len(newlines)):
|
||||
for i in range(len(newlines)):
|
||||
words = oldlines[i].split()
|
||||
newlines[i] += words[index-1] + " "
|
||||
for i in xrange(len(newlines)):
|
||||
for i in range(len(newlines)):
|
||||
newlines[i] += "\n"
|
||||
self.sections[name] = newlines
|
||||
|
||||
@ -206,7 +206,7 @@ class data:
|
||||
lines = self.sections[name]
|
||||
newlines = []
|
||||
j = icol - 1
|
||||
for i in xrange(len(lines)):
|
||||
for i in range(len(lines)):
|
||||
line = lines[i]
|
||||
words = line.split()
|
||||
words[j] = str(vector[i])
|
||||
@ -228,48 +228,48 @@ class data:
|
||||
self.replace("Atoms",self.names['x']+1,x)
|
||||
self.replace("Atoms",self.names['y']+1,y)
|
||||
self.replace("Atoms",self.names['z']+1,z)
|
||||
|
||||
if dm.names.has_key("ix") and self.names.has_key("ix"):
|
||||
|
||||
if "ix" in dm.names and "ix" in self.names:
|
||||
ix,iy,iz = dm.vecs(ntime,"ix","iy","iz")
|
||||
self.replace("Atoms",self.names['ix']+1,ix)
|
||||
self.replace("Atoms",self.names['iy']+1,iy)
|
||||
self.replace("Atoms",self.names['iz']+1,iz)
|
||||
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# delete header value or section from data file
|
||||
|
||||
def delete(self,keyword):
|
||||
|
||||
if self.headers.has_key(keyword): del self.headers[keyword]
|
||||
elif self.sections.has_key(keyword): del self.sections[keyword]
|
||||
else: raise StandardError, "keyword not found in data object"
|
||||
if keyword in self.headers: del self.headers[keyword]
|
||||
elif keyword in self.sections: del self.sections[keyword]
|
||||
else: raise Exception("keyword not found in data object")
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# write out a LAMMPS data file
|
||||
|
||||
def write(self,file):
|
||||
f = open(file,"w")
|
||||
print >>f,self.title
|
||||
|
||||
print(self.title, file=f)
|
||||
|
||||
# write any keywords in standard list hkeywords
|
||||
# in the order they are in hkeywords
|
||||
# then write any extra keywords at end of header section
|
||||
|
||||
|
||||
for keyword in hkeywords:
|
||||
if self.headers.has_key(keyword):
|
||||
if keyword in self.headers:
|
||||
if keyword == "xlo xhi" or keyword == "ylo yhi" or \
|
||||
keyword == "zlo zhi":
|
||||
pair = self.headers[keyword]
|
||||
print >>f,pair[0],pair[1],keyword
|
||||
pair = self.headers[keyword]
|
||||
print(pair[0],pair[1],keyword, file=f)
|
||||
elif keyword == "xy xz yz":
|
||||
triple = self.headers[keyword]
|
||||
print >>f,triple[0],triple[1],triple[2],keyword
|
||||
triple = self.headers[keyword]
|
||||
print(triple[0],triple[1],triple[2],keyword, file=f)
|
||||
else:
|
||||
print >>f,self.headers[keyword],keyword
|
||||
print(self.headers[keyword],keyword, file=f)
|
||||
|
||||
for keyword in self.headers.keys():
|
||||
for keyword in list(self.headers.keys()):
|
||||
if keyword not in hkeywords:
|
||||
print >>f,self.headers[keyword],keyword
|
||||
print(self.headers[keyword],keyword, file=f)
|
||||
|
||||
# write any sections in standard list skeywords
|
||||
# in the order they are in skeywords
|
||||
@ -277,18 +277,18 @@ class data:
|
||||
|
||||
for pair in skeywords:
|
||||
keyword = pair[0]
|
||||
if self.sections.has_key(keyword):
|
||||
print >>f,"\n%s\n" % keyword
|
||||
if keyword in self.sections:
|
||||
print("\n%s\n" % keyword, file=f)
|
||||
for line in self.sections[keyword]:
|
||||
print >>f,line,
|
||||
print(line, end='', file=f)
|
||||
|
||||
skeyfirst = [pair[0] for pair in skeywords]
|
||||
|
||||
for keyword in self.sections.keys():
|
||||
|
||||
for keyword in list(self.sections.keys()):
|
||||
if keyword not in skeyfirst:
|
||||
print >>f,"\n%s\n" % keyword
|
||||
print("\n%s\n" % keyword, file=f)
|
||||
for line in self.sections[keyword]:
|
||||
print >>f,line,
|
||||
print(line, end='', file=f)
|
||||
|
||||
f.close()
|
||||
|
||||
@ -304,20 +304,20 @@ class data:
|
||||
|
||||
def findtime(self,n):
|
||||
if n == 0: return 0
|
||||
raise StandardError, "no step %d exists" % (n)
|
||||
|
||||
raise(Exception, "no step %d exists" % (n))
|
||||
|
||||
# --------------------------------------------------------------------
|
||||
# return list of atoms and bonds to viz for data object
|
||||
|
||||
def viz(self,isnap):
|
||||
if isnap: raise StandardError, "cannot call data.viz() with isnap != 0"
|
||||
|
||||
if isnap: raise Exception("cannot call data.viz() with isnap != 0")
|
||||
|
||||
id = self.names["id"]
|
||||
type = self.names["type"]
|
||||
x = self.names["x"]
|
||||
y = self.names["y"]
|
||||
z = self.names["z"]
|
||||
|
||||
|
||||
xlohi = self.headers["xlo xhi"]
|
||||
ylohi = self.headers["ylo yhi"]
|
||||
zlohi = self.headers["zlo zhi"]
|
||||
@ -336,7 +336,7 @@ class data:
|
||||
# assumes atoms are sorted so can lookup up the 2 atoms in each bond
|
||||
|
||||
bonds = []
|
||||
if self.sections.has_key("Bonds"):
|
||||
if "Bonds" in self.sections:
|
||||
bondlines = self.sections["Bonds"]
|
||||
for line in bondlines:
|
||||
words = line.split()
|
||||
@ -349,8 +349,8 @@ class data:
|
||||
float(atom1words[z]),
|
||||
float(atom2words[x]),float(atom2words[y]),
|
||||
float(atom2words[z]),
|
||||
float(atom1words[type]),float(atom2words[type])])
|
||||
|
||||
float(atom1words[type]),float(atom2words[type])])
|
||||
|
||||
tris = []
|
||||
lines = []
|
||||
return 0,box,atoms,bonds,tris,lines
|
||||
@ -375,8 +375,8 @@ class data:
|
||||
|
||||
hkeywords = ["atoms","ellipsoids","lines","triangles","bodies",
|
||||
"bonds","angles","dihedrals","impropers",
|
||||
"atom types","bond types","angle types","dihedral types",
|
||||
"improper types",
|
||||
"atom types","bond types","angle types","dihedral types",
|
||||
"improper types",
|
||||
"xlo xhi","ylo yhi","zlo zhi","xy xz yz"]
|
||||
|
||||
skeywords = [["Masses","atom types"],
|
||||
@ -384,14 +384,14 @@ skeywords = [["Masses","atom types"],
|
||||
["Lines","lines"],["Triangles","triangles"],["Bodies","bodies"],
|
||||
["Velocities","atoms"],
|
||||
["Bonds","bonds"],
|
||||
["Angles","angles"],
|
||||
["Angles","angles"],
|
||||
["Dihedrals","dihedrals"],
|
||||
["Impropers","impropers"],
|
||||
["Impropers","impropers"],
|
||||
["Pair Coeffs","atom types"],
|
||||
["Bond Coeffs","bond types"],
|
||||
["Bond Coeffs","bond types"],
|
||||
["Angle Coeffs","angle types"],
|
||||
["Dihedral Coeffs","dihedral types"],
|
||||
["Improper Coeffs","improper types"],
|
||||
["Dihedral Coeffs","dihedral types"],
|
||||
["Improper Coeffs","improper types"],
|
||||
["BondBond Coeffs","angle types"],
|
||||
["BondAngle Coeffs","angle types"],
|
||||
["MiddleBondTorsion Coeffs","dihedral types"],
|
||||
|
||||
Reference in New Issue
Block a user