99 lines
3.1 KiB
Python
Executable File
99 lines
3.1 KiB
Python
Executable File
#!/usr/bin/env python
|
|
import numpy as np
|
|
import io
|
|
import re
|
|
import pickle
|
|
import glob
|
|
import pandas as pd
|
|
|
|
|
|
class LammpsTrj():
|
|
def __init__(self, trjfile):
|
|
self.fp = open(trjfile)
|
|
lines = [self.fp.readline() for i in range(4)]
|
|
self.atoms = int(lines[-1])
|
|
self.fp.seek(0)
|
|
self.getOnestep()
|
|
# print(self.df)
|
|
self.fp.seek(0)
|
|
self.molecules = np.unique(self.df["mol"]).shape[0]
|
|
|
|
def __del__(self):
|
|
self.fp.close()
|
|
|
|
def getOnestep(self):
|
|
block = self.atoms + 9
|
|
lines = [self.fp.readline() for i in range(block)]
|
|
if lines[0] == "":
|
|
return 0
|
|
self.step = int(lines[1])
|
|
self.lx = float(lines[5].split()[1])
|
|
self.ly = float(lines[6].split()[1])
|
|
self.lz = float(lines[7].split()[1])
|
|
header = lines[8].split()[2:]
|
|
data = io.StringIO(" ".join(lines[9:]))
|
|
self.df = pd.read_csv(data, delimiter=r"\s+", header=None)
|
|
self.df.columns = header
|
|
return 1
|
|
|
|
def getOrientation(self, benzene_id):
|
|
xyz = self.df[["xu", "yu", "zu"]].to_numpy()
|
|
xyz = xyz.reshape((self.molecules, -1, 3))
|
|
benzene_id = np.array(benzene_id, dtype=int) - 1
|
|
xyz = xyz[:, benzene_id, :]
|
|
g = xyz.mean(axis=1)
|
|
p = xyz[:, [1, 2], :].mean(axis=1)
|
|
vec = p - g
|
|
angle = np.arctan2(vec[:, 1], vec[:, 0])
|
|
return angle
|
|
# for i, xyz_i in enumerate(xyz):
|
|
# body = "{}\n\n".format(benzene_id.shape[0])
|
|
# for r in xyz_i:
|
|
# body += "C {} {} {}\n".format(*r)
|
|
# outfile = f"{i:04d}.xyz"
|
|
# with open(outfile, "w") as o:
|
|
# o.write(body)
|
|
|
|
def getZposition(self, benzene_id):
|
|
xyz = self.df[["xu", "yu", "zu"]].to_numpy()
|
|
xyz = xyz.reshape((self.molecules, -1, 3))
|
|
benzene_id = np.array(benzene_id, dtype=int) - 1
|
|
xyz = xyz[:, benzene_id, :]
|
|
zpos = xyz.mean(axis=1)[:, 2]
|
|
return zpos
|
|
|
|
|
|
def run(trjfile):
|
|
benzene_id = [24, 25, 26, 27, 28, 29]
|
|
lmp = LammpsTrj(trjfile)
|
|
orientation = np.empty((0, lmp.molecules))
|
|
zpos = np.empty((0, lmp.molecules))
|
|
while lmp.getOnestep():
|
|
# print(lmp.step)
|
|
orientation_ = lmp.getOrientation(benzene_id)
|
|
orientation = np.vstack((orientation, orientation_))
|
|
zpos_ = lmp.getZposition(benzene_id)
|
|
zpos = np.vstack((zpos, zpos_))
|
|
hist, x = np.histogram(orientation, bins=np.linspace(-np.pi, np.pi, 200))
|
|
df = pd.DataFrame()
|
|
df["angle"] = x[0:-1] + (x[1]-x[0])*0.5
|
|
df["angle_y"] = hist
|
|
hist, x = np.histogram(zpos, bins=np.linspace(24, 25, 200))
|
|
df["zpos"] = x[0:-1] + (x[1]-x[0])*0.5
|
|
df["zpos_y"] = hist
|
|
temp = int(re.search(r"_(\d+)K\.", trjfile).group(1))
|
|
dset[temp] = {}
|
|
dset[temp]["orientation"] = df
|
|
|
|
|
|
for k in ["D3d-o", "D3d-p"]:
|
|
dset = {}
|
|
files = sorted(glob.glob(f"{k}_*K.lammpstrj"))
|
|
for f in files:
|
|
print(f)
|
|
run(f)
|
|
outfile = f"{k}.pkl"
|
|
with open(outfile, "wb") as f:
|
|
pickle.dump(dset, f)
|
|
print(f"{outfile} was created.")
|