#!/usr/bin/python # Script: density_area.py # Purpose: binned atom density by atom type and running area under the curve # Syntax: density.py x/y/z nbin outfile files ... # x/y/z = get density distribution along this axis # nbin = # of bins in desired direction # outfile = file to write flux stats to # files = series of dump files # Example: density_area.py z 100 dens.out dump.* # Author: Paul Crozier (Sandia). # Modified by Jeff Greathouse (Sandia) to include # calculation of area under the curve # enable script to run from Python directly w/out Pizza.py import sys from dump import dump if not globals().has_key("argv"): argv = sys.argv # main script if len(argv) < 5: raise StandardError, "Syntax: density.py x/y/z nbin outfile files ..." direction = argv[1] nbins = int(argv[2]) outfile = argv[3] files = ' '.join(argv[4:]) # read snapshots one-at-a-time d = dump(files,0) d.map(1,"id",2,"type",3,"x",4,"y",5,"z") first = 1 nsnaps = 0 ntypes = 0 while 1: time = d.next() if time == -1: break if first: tmp,ntypes = d.minmax("type") ntypes = int(ntypes) bin = nbins * [0] for i in xrange(nbins): bin[i] = ntypes * [0] first = 0 box = (d.snaps[-1].xlo,d.snaps[-1].ylo,d.snaps[-1].zlo, d.snaps[-1].xhi,d.snaps[-1].yhi,d.snaps[-1].zhi) vol = (box[3] - box[0]) * (box[4] - box[1]) * (box[5] - box[2]) if direction == "x": type,x = d.vecs(time,"type","x") elif direction == "y": type,x = d.vecs(time,"type","y") elif direction == "z": type,x = d.vecs(time,"type","z") type = map(int,type) natoms = len(type) for i in xrange(natoms): type[i] -= 1 for i in xrange(natoms): ibin = int(nbins*x[i] + 0.5) if (ibin < 0): ibin += nbins if (ibin > nbins-1): ibin -= nbins bin[ibin][type[i]] += nbins/vol nsnaps += 1 print time, print print "Printing ",direction,"-directional density distribution in mol/L to", \ outfile conversion = 1660.53873 # convert from atoms/Angs^3 to mol/L # Output as x, density_1, area_1, ... fp = open(outfile,"w") first = 1 xden = nbins * [0] yden = nbins * [0] for i in xrange(nbins): yden[i] = ntypes * [0] sum = ntypes * [0] for i in xrange(nbins): xden[i] = float(i)/float(nbins) print >>fp, xden[i], if first: for j in xrange(ntypes): yden[i][j] = conversion*bin[i][j]/nsnaps print >>fp, yden[i][j], sum[j], first = 0 else: for j in xrange(ntypes): yden[i][j] = conversion*bin[i][j]/nsnaps sum[j] += 0.5 * (xden[i] - xden[i-1]) * (yden[i][j] + yden[i-1][j]) print >>fp, yden[i][j], sum[j], print >>fp fp.close()