1.程序
测试内容有限,不保证适用于所有文件
# 1 eV/mol = 1.6021766208×10^-19 J
# 1 J*6.02214076×10^23 = J/mol
# 1KJ/mol = 0.2389029576186153 Kcal/mol
C= 1.6021766208*6.02214076*10*0.2389029576186153
file_name_read = "Cu_u3.eam"
file_name_write = "/home/zxy/Documents/lammps/eam_test/Cu_u3_real.eam"
import re
import os
import numpy as np
import math
import time
os.system("clear")
f_r= open(file=file_name_read,mode= "r")
f_w= open(file=file_name_write,mode= "w")
print("Start read file...")
# ------------------------- 读取原子信息 ------------------------
line= f_r.readline()
f_w.write(time.asctime( time.localtime(time.time()) )+'\n')
line= f_r.readline()
f_w.write(line)
patten= r'([0-9\.]+)'
match= re.findall(patten, line)
atom_num= int(match[0])
atom_mass= float(match[1])
atom_lattric_c= float(match[2])
patten= r'([a-zA-Z]+)'
match= re.findall(patten, line)
atom_lattric_t= match[0]
print("atom_number= %d; atom_mass= %f; lattric_constant= %f; lattric_type= %s"%(atom_num,atom_mass,atom_lattric_c,atom_lattric_t))
# ------------------------- 读取文件信息 ------------------------
patten= r'([0-9\.e\-\+]+)'
line= f_r.readline()
f_w.write(line)
match= re.findall(patten, line)
N_rho= int(match[0])
d_rho= float(match[1])
N_r= int(match[2])
d_r= float(match[3])
cutoff= float(match[4])
print("N_rho= %d; d_rho= %E; N_r= %d; d_r= %E; cutoff= %f"%(N_rho,d_rho,N_r,d_r,cutoff))
# ------------------------- 转换F ------------------------
line= f_r.readline()
match= re.findall(patten, line)
number_in_line= len(match)
print("There are %d number(s) every line"%number_in_line)
data= np.zeros((1,number_in_line))
print("Start convert function H.")
for j in np.arange(0,N_rho/number_in_line,1):
for i in np.arange(0,number_in_line,1):
data[0,i]= float(match[i])
data=data*C
#print("%+10E %+10E %+10E %+10E %+10E"%(data[0,0],data[0,1],data[0,2],data[0,3],data[0,4]))
f_w.write("%+24.16E%+24.16E%+24.16E%+24.16E%+24.16E\n"%(data[0,0],data[0,1],data[0,2],data[0,3],data[0,4]))
line= f_r.readline()
match= re.findall(patten, line)
print("Convert finished")
# ------------------------- 转换Z ------------------------
C= math.sqrt(C)
print("Start convert function Z.")
for j in np.arange(0,N_rho/number_in_line,1):
for i in np.arange(0,number_in_line,1):
data[0,i]= float(match[i])
data=data*C
#print("%+10E %+10E %+10E %+10E %+10E"%(data[0,0],data[0,1],data[0,2],data[0,3],data[0,4]))
f_w.write("%+24.16E%+24.16E%+24.16E%+24.16E%+24.16E\n"%(data[0,0],data[0,1],data[0,2],data[0,3],data[0,4]))
line= f_r.readline()
match= re.findall(patten, line)
print("Convert finished")
# ------------------------- 拷贝其他数据 ------------------------
print("copy other data...")
f_w.write(line)
while True:
line= f_r.readline()
if not line:
break
else:
f_w.write(line)
print("copy finished")
f_r.close()
f_w.close()
2.原理说明
单位转换