Convert xyz file to XDATCAR (VASP) file (Python)¶
Usage: python xyz2xdat.py xyzfile
Output: XDATCAR-lipai
import numpy as np
import sys
arg_num=len(sys.argv)
if arg_num==1:
print("no inputs!!!\n")
exit()
fname=sys.argv[1]
xdat=open('XDATCAR-lipai','w')
xyz=open(fname,'r')
totnum=int(xyz.readline().rstrip('\n'))
lat=xyz.readline().rstrip('\n').split('"')[1].split()[:9]
lat=np.array([float(i) for i in lat]).reshape(3,3)
#lat=np.mat(lat)
latI=np.linalg.inv(lat)
#print(latI)
print("totatoms in the box: ",totnum)
#print(lat)
#print(latI)
xdat.write("lipai@mail.ustc.edu.cn\n")
xdat.write("1\n")
xdat.write(str(lat[0,0])+' '+str(lat[0,1])+' '+str(lat[0,2])+'\n')
xdat.write(str(lat[1,0])+' '+str(lat[1,1])+' '+str(lat[1,2])+'\n')
xdat.write(str(lat[2,0])+' '+str(lat[2,1])+' '+str(lat[2,2])+'\n')
ele=[]
elnum=[]
ele1=""
eletype=0
for i in range(totnum):
a=xyz.readline().rstrip('\n').split()[0]
if a!=ele1:
ele.append(a)
elnum.append(1)
eletype+=1
ele1=a
else:
elnum[eletype-1]+=1
print("Num of element type: ",eletype)
print(ele)
print(elnum)
for i in range(eletype):
xdat.write(str(ele[i])+' ')
xdat.write('\n')
for i in range(eletype):
xdat.write(str(elnum[i])+' ')
xdat.write('\n')
fline=0
while(xyz.readline()!=''):
fline=fline+1
framenum=fline/(totnum+2)+1
print(framenum)
xyz.seek(0)
from math import floor
for i in np.arange(framenum):
xyz.readline()
xyz.readline()
xdat.write("Direct configuration= "+str(int(i+1))+"\n")
for j in range(totnum):
c=xyz.readline().rstrip('\n').split()[1:4]
coor=np.array([float(s) for s in c])
coorD=np.matmul(coor,latI)
#for x in coorD:
# x=x-floor(x)
#print(coorD.shape)
xdat.write(str(coorD[0]-floor(coorD[0]))+' '+str(coorD[1]-floor(coorD[1]))+' '+str(coorD[2]-floor(coorD[2]))+'\n')