def vanHoveTotal(atoms,basis,steps,cutr=10.0,nBin=1000,norm=False): atoms = array(atoms) basis = array(basis) if type(steps) != type(list()): #handle the case where steps is just a single step steps = list(steps) steps = array(steps) nTime = atoms.shape[0] nAtom = atoms.shape[1] nStep = steps.shape[0] atoms = atoms.ravel() b = basis.ravel() dr = cutr/nBin rbins = [i*dr for i in range(nBin)] bins = zeros(nStep*nBin) weave.inline(vhTotalRefCode,['atoms','nTime','nAtom','steps','nStep','b','bins','nBin','dr']) bins.shape = [nStep,nBin] atoms.shape = [nTime,nAtom,3] if norm: Ndensity=nAtom/volume(basis) for i,r in enumerate(rbins): if i==0: vol=4.0*pi*dr*dr*dr/3.0 else: vol=4.0*pi*r*r*dr for k in range(nStep): bins[k][i] /= vol*Ndensity return rbins,bins
def rdf_periodic(atoms,basis,cutoff=10.0,nbins=1000): #atoms: list of atoms[N][3] #cutoff: float, max radius to measure radial distro out to #nbins: number of bins to store in radial distro basis=array(basis) atoms=array(atoms) bt=basis.T rdist=zeros(nbins) dr=float(cutoff)/nbins N=len(atoms) rdist=rdfperHelper(atoms,rdist,cutoff,basis) rbins=[i*dr for i in range(nbins)] #the central point of each bin (x-axis on plot) Ndensity=N/volume(basis) for i,r in enumerate(rbins): if i==0: vol=4.0*pi*dr*dr*dr/3.0 else: vol=4.0*pi*r*r*dr rdist[i]/=vol*(Ndensity*N) return [rbins,rdist]
open(posfile,"w").writelines(posdata) if __name__=="__main__": def usage(): print "Usage:" print "%s <POSCAR> //prints volume and atomic volume" print "%s <POSCAR> <frac/unfrac>"%sys.argv[0].split("/")[-1] print "%s <POSCAR> <ratio value>"%sys.argv[0].split("/")[-1] if len(sys.argv) not in [2,3]: usage() exit(0) if len(sys.argv)==2: [basis,atypes,atoms,head,poscar] = poscarIO.read(open(sys.argv[1],"r").readlines()) v = volume(basis) print "Total Volume in AA^3 = %f"%v print "Atomic Volume in AA^3 = %f"%(v/len(atoms)) elif sys.argv[2]=="frac": fractional(sys.argv[1]) elif sys.argv[2]=="unfrac": unFractional(sys.argv[1]) else: try: r=float(sys.argv[2]) ratio(sys.argv[1],r) except: print "Error, unrecognized volume arguement: %s"%sys.argv[2] usage() exit(0)
if __name__ == "__main__": def usage(): print "Usage:" print "%s <POSCAR> //prints volume and atomic volume" print "%s <POSCAR> <frac/unfrac>" % sys.argv[0].split("/")[-1] print "%s <POSCAR> <ratio value>" % sys.argv[0].split("/")[-1] if len(sys.argv) not in [2, 3]: usage() exit(0) if len(sys.argv) == 2: [basis, atypes, atoms, head, poscar] = poscarIO.read(open(sys.argv[1], "r").readlines()) v = volume(basis) print "Total Volume in AA^3 = %f" % v print "Atomic Volume in AA^3 = %f" % (v / len(atoms)) elif sys.argv[2] == "frac": fractional(sys.argv[1]) elif sys.argv[2] == "unfrac": unFractional(sys.argv[1]) else: try: r = float(sys.argv[2]) ratio(sys.argv[1], r) except: print "Error, unrecognized volume arguement: %s" % sys.argv[2] usage() exit(0)