#!/usr/local/bin/python #Author: Jeff Houze #Converts vasp's CONTCAR file into a cartesian coord file. whatfile = "CONTCAR" #raw_input("File to convert: ") datain = file(whatfile, 'r') whatfile = "POSCAR.new" #raw_input("File to write: ") dataout = file(whatfile, 'w') dataout.write(datain.readline()) #POSCAR comment line, just rewriting to output file tmp = datain.readline() dataout.write(tmp) scale=float(tmp) #assuming ONE value tmp = datain.readline() dataout.write(tmp) (a1, a2, a3) = tmp.split() #read in unit cell vectors, tmp = datain.readline() dataout.write(tmp) (b1, b2, b3) = tmp.split() #but there are strings tmp = datain.readline() dataout.write(tmp) (c1, c2, c3) = tmp.split() a1=float(a1); a2=float(a2); a3=float(a3); #Now I have numbers. b1=float(b1); b2=float(b2); b3=float(b3); c1=float(c1); c2=float(c2); c3=float(c3); tmp = datain.readline() dataout.write(tmp) atoms = tmp.split() #List containing how many of each. tmp = datain.readline() #tmp need to figure out if this is... #Selective dynamics, or not. tmp2 = tmp.split() if (tmp2[0][0] == 'S'): dataout.write(tmp) datain.readline() dataout.write("Cartesian\n") else: dataout.write("Cartesian\n") sum=0 for i in range(len(atoms)): sum += int(atoms[i]) for i in range(sum): #loop over different posistions tmp = datain.readline().split() a=float(tmp[0]); b=float(tmp[1]); c=float(tmp[2]); # d=tmp[3]; e=tmp[4]; f=tmp[5]; x = scale * (a1*a + b1*b + c1*c) y = scale * (a2*a + b2*b + c2*c) z = scale * (a3*a + b3*b + c3*c) # S=" %12.8f %12.8f %12.8f %s %s %s \n" % (float(x), float(y), float(z),d,e,f) S=" %16.12f %16.12f %16.12f \n" % (float(x), float(y), float(z)) dataout.write(S) datain.close() dataout.close()