将Dump文件原子类型编号改为元素的python脚本
1、代码说明
MD开展某些计算的时候需要知道原子的元素,虽然lammps输出dump文件的时候可以修改type的id为元素,但是有时候都算完了才想起来要更改,重算是不可能重算的。本代码提供python脚本进行文本处理,将dump文件中原子类型更改为元素。
2、Python代码
写代码水平有限,能够实现所需功能即可,凑合着用呗~
# -*- coding: utf-8 -*-
"""
Created on Sun Feb 27 17:26:09 2022
@author: 阿磊的MD记录簿
description: 替换原子类型为元素符号
"""
import datetime
steps = 50000
interval = 10000
number = int(steps)/int(interval)+1
start_time = datetime.datetime.now()
#读取数据,并获取基本信息
count = [] # count记录重复时的行数
try:
with open('./nvt.dump','r') as f_1:
lines = f_1.readlines()
number_of_atoms = int(lines[3])
num = len(lines)
for i, line in enumerate(lines):
if line.startswith('ITEM: TIMESTEP'):
count.append(i)
except IOError:
print ("Error: 没有找到文件或读取文件失败")
else:
print ("内容写入文件成功")
# 保存原子信息
with open('./atoms.txt','w') as f_2:
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
for j in range(int(number)):
cont_j = count[j]
for i in range(cont_j+9,cont_j+9+number_of_atoms):
f_2.write(lines[i])
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
f_2.write('\n')
# 读取原子信息
with open('./atoms.txt','r') as f_3:
originalMessage = f_3.readlines()
numberMessageLines = len(originalMessage)
lineNumber = 0
ID = []
Type = []
data_pos = []
while numberMessageLines > lineNumber:
singleLine = originalMessage[lineNumber]
a = singleLine.split()
b = a[2:] # b为原子坐标信息
data_pos.append(b)
c = a[1:2] # c为原子类型信息
Type.append(c)
e = a[:1]
ID.append(e)
lineNumber += 1
with open('./IDAndTypeAndPosition.txt','w') as f_4:
for i in range(numberMessageLines): # list存入txt操作
data_new = str(ID[i]) + ' ' +str(Type[i]).replace('1','O').replace('2','H')\
+ ' ' + str(data_pos[i]) + '\n'
f_4.write(data_new)
# 写入head
with open('./IDAndTypeAndPosition.txt','r') as f_5:
data_final = f_5.readlines()
for i in range(int(number)):
Startline = (number_of_atoms+9)*i
data_final[Startline] = lines[Startline]
data_final[Startline+1] = lines[Startline+1]
data_final[Startline+2] = lines[Startline+2]
data_final[Startline+3] = lines[Startline+3]
data_final[Startline+4] = lines[Startline+4]
data_final[Startline+5] = lines[Startline+5]
data_final[Startline+6] = lines[Startline+6]
data_final[Startline+7] = lines[Startline+7]
data_final[Startline+8] = lines[Startline+8]
with open('./Fianl_water.xyz','w') as f_6:
for i in range(len(data_final)):
final_XYZ = str(data_final[i]).replace('[', '').replace(']', '').replace("'", '').replace(',', '')
f_6.write(final_XYZ)
print("All right")