Пример #1
0
def plot_pos_rad_ang(atoms, types, basis, dup=0):

    Ntypes = len(set(types))
    N = len(atoms)
    cs = ["yellow", "green", "blue", "red", "purple", "orange", "black"]

    #Periodic Atoms (duplicated, needed for distributions)
    datoms, dtypes = duplicate26(atoms, types, basis)

    #Neighbors needed for angular distribution
    dneighbs = neighbors(datoms, 5.0, style="full")

    #Radial Distribution
    [rbins, rdist] = rdf(datoms, inloop=N, cutoff=12.0)

    #Correlation of Angles
    [abins, adist] = adf(datoms, dneighbs, inloop=N)

    #Type sorted atoms lists
    tatoms = [list() for i in range(Ntypes)]
    if (dup == 1):
        for i, j in enumerate(dtypes):
            tatoms[j].append(datoms[i])
    else:
        for i, j in enumerate(types):
            tatoms[j].append(atoms[i])

    v1, v2, v3 = zip(*basis)

    #findsymmetry([v1,v2,v3],types,zip(xs,ys,zs))

    fig = pl.figure(figsize=(12, 6))
    aa = fig.add_subplot(311, projection='3d')
    aa.set_position([0, 0, 0.5, 1.0])
    for i in range(Ntypes):
        ax, ay, az = zip(*tatoms[i])
        aa.scatter(ax, ay, az, c=cs.pop(0), marker="o")

    aa.plot([0, v1[0]], [0, v1[1]], [0, v1[2]])
    aa.plot([0, v2[0]], [0, v2[1]], [0, v2[2]])
    aa.plot([0, v3[0]], [0, v3[1]], [0, v3[2]])

    bb = fig.add_subplot(312)
    bb.set_position([0.56, 0.55, 0.4, 0.4])
    bb.plot(rbins, rdist)
    pl.xlabel("Radius (A)")
    pl.ylabel("Count")

    cc = fig.add_subplot(313)
    cc.set_position([0.56, 0.08, 0.4, 0.36])
    cc.plot(abins, adist)
    pl.xlabel("Angle (deg)")
    pl.ylabel("Count")

    pl.show()
Пример #2
0
def plot_pos_rad_ang(atoms,types,basis,dup=0):

	Ntypes=len(set(types))
	N=len(atoms)
	cs=["yellow","green","blue","red","purple","orange","black"]

        #Periodic Atoms (duplicated, needed for distributions)
        datoms,dtypes=duplicate26(atoms,types,basis)

        #Neighbors needed for angular distribution
        dneighbs=neighbors(datoms,5.0,style="full")

        #Radial Distribution
        [rbins,rdist]=rdf(datoms,inloop=N,cutoff=12.0)

        #Correlation of Angles
        [abins,adist]=adf(datoms,dneighbs,inloop=N)

        #Type sorted atoms lists
        tatoms=[list() for i in range(Ntypes)]
        if(dup==1):
            for i,j in enumerate(dtypes):
                tatoms[j].append(datoms[i])
        else:
            for i,j in enumerate(types):
                tatoms[j].append(atoms[i])

	v1,v2,v3=zip(*basis)

        #findsymmetry([v1,v2,v3],types,zip(xs,ys,zs))

        fig=pl.figure(figsize=(12,6))
        aa = fig.add_subplot(311,projection='3d')
        aa.set_position([0,0,0.5,1.0])
        for i in range(Ntypes):
            ax,ay,az=zip(*tatoms[i])
            aa.scatter(ax,ay,az,c=cs.pop(0),marker="o")

        aa.plot([0,v1[0]],[0,v1[1]],[0,v1[2]])
        aa.plot([0,v2[0]],[0,v2[1]],[0,v2[2]])
        aa.plot([0,v3[0]],[0,v3[1]],[0,v3[2]])
        
        bb = fig.add_subplot(312)
        bb.set_position([0.56,0.55,0.4,0.4])
        bb.plot(rbins,rdist)
        pl.xlabel("Radius (A)")
        pl.ylabel("Count")

        cc = fig.add_subplot(313)
        cc.set_position([0.56,0.08,0.4,0.36])
        cc.plot(abins,adist)
        pl.xlabel("Angle (deg)")
        pl.ylabel("Count")

        pl.show()
Пример #3
0
    print "Fitness= %s eV   PerAtom Energy= %s eV\nkpoints= %sVolume= %sEnthalpy= %s"%(a,round(float(a)/N,3),kpoints.pop(0),volumes.pop(0),enthalpy.pop(0).strip())

    if gencnt >= start:
        #plot_pos_rad_ang(atoms,types,pdup=pdup)

        #Periodic Atoms (duplicated)
        datoms,dtypes,dbasis=duplicate26(atoms,types,basis)

        #Neighbors needed for angular distribution
        dneighbs=neighbors(datoms,5.0,style="full")

        #Radial Distribution
        [rbins,rdist]=rdf(datoms,inloop=N,cutoff=12.0)

        #Correlation of Angles
        [abins,adist]=adf(datoms,dneighbs,inloop=N)

        #Type sorted atoms lists
        tatoms=[list() for i in range(Ntypes)]
        if(pdup==1):
            for i,j in enumerate(dtypes):
                tatoms[j].append(datoms[i])
        else:
            for i,j in enumerate(types):
                tatoms[j].append(atoms[i])

        fig=pl.figure(figsize=(12,6))
        aa = fig.add_subplot(311,projection='3d')
        aa.set_position([0,0,0.5,1.0])
        for i in range(Ntypes):
            ax,ay,az=zip(*tatoms[i])
Пример #4
0
                 3), kpoints.pop(0), volumes.pop(0), enthalpy.pop(0).strip())

    if gencnt >= start:
        #plot_pos_rad_ang(atoms,types,pdup=pdup)

        #Periodic Atoms (duplicated)
        datoms, dtypes, dbasis = duplicate26(atoms, types, basis)

        #Neighbors needed for angular distribution
        dneighbs = neighbors(datoms, 5.0, style="full")

        #Radial Distribution
        [rbins, rdist] = rdf(datoms, inloop=N, cutoff=12.0)

        #Correlation of Angles
        [abins, adist] = adf(datoms, dneighbs, inloop=N)

        #Type sorted atoms lists
        tatoms = [list() for i in range(Ntypes)]
        if (pdup == 1):
            for i, j in enumerate(dtypes):
                tatoms[j].append(datoms[i])
        else:
            for i, j in enumerate(types):
                tatoms[j].append(atoms[i])

        fig = pl.figure(figsize=(12, 6))
        aa = fig.add_subplot(311, projection='3d')
        aa.set_position([0, 0, 0.5, 1.0])
        for i in range(Ntypes):
            ax, ay, az = zip(*tatoms[i])
Пример #5
0
def outcarADF(outcarfile,nbins,bl=-1.0,bw=-1.0):
    outcar=open(outcarfile,"r")
    tbinvals=list()

    #Grab ion types
    while True:
        line=outcar.readline()
        if "ions per type" in line:
            break
    atypes=map(int,line.split("=")[1].split())

    #Grab basis vectors
    while True:
        line=outcar.readline()
        if "direct lattice vectors" in line:
            break
    basis=array([map(float,outcar.readline().split()[:3]) for i in range(3)])
    lengths=array([basis[0][0],basis[1][1],basis[2][2]])

    #Grab atom positions and perform adf calculation
    count=0
    posit=False
    for line in outcar:
        if posit:
            if "--" in line:
                if len(atoms)==0:
                    continue
                else:
                    #Analysis
                    if max(zip(*atoms)[0])<1.01:
                        atoms=dot(array(atoms),basis)
                    else:
                        atoms=array(atoms)
                    neighbs=voronoiNeighbors(atoms,basis,atypes,style='full')
                    if bl!=-1 and bw!=-1:
                        specbonds=[list() for i in range(len(atoms))]
                        for i in range(len(atoms)):
                            ai=atoms[i]#dot(atoms[i],basis)
                            for j in neighbs[i]:
                                aj=atoms[j]#dot(atoms[j],basis)
                                d=dist_periodic(ai,aj,lengths)
                       
                                if fabs(d-bl)<bw:
                                    if d<1.0:
                                        print d
                                        print dist_periodic(ai,aj,lengths)
                                        print ai
                                        print aj
                                        exit(0)
                                    specbonds[i].append(j)
                    else:
                        specbonds=neighbs
                    [angs,abins]=adf(atoms,specbonds,basis,nbins=nbins)
                    tbinvals.append(abins)
                    print count
                    posit=False
            else:
                atoms.append(map(float,line.split()[:3]))
        elif "POSITION" in line:
            atoms=list()
            posit=True
            count+=1
    
    return angs,tbinvals
Пример #6
0
def outcarADF(outcarfile, nbins, bl=-1.0, bw=-1.0):
    outcar = open(outcarfile, "r")
    tbinvals = list()

    #Grab ion types
    while True:
        line = outcar.readline()
        if "ions per type" in line:
            break
    atypes = map(int, line.split("=")[1].split())

    #Grab basis vectors
    while True:
        line = outcar.readline()
        if "direct lattice vectors" in line:
            break
    basis = array(
        [map(float,
             outcar.readline().split()[:3]) for i in range(3)])
    lengths = array([basis[0][0], basis[1][1], basis[2][2]])

    #Grab atom positions and perform adf calculation
    count = 0
    posit = False
    for line in outcar:
        if posit:
            if "--" in line:
                if len(atoms) == 0:
                    continue
                else:
                    #Analysis
                    if max(zip(*atoms)[0]) < 1.01:
                        atoms = dot(array(atoms), basis)
                    else:
                        atoms = array(atoms)
                    neighbs = voronoiNeighbors(atoms,
                                               basis,
                                               atypes,
                                               style='full')
                    if bl != -1 and bw != -1:
                        specbonds = [list() for i in range(len(atoms))]
                        for i in range(len(atoms)):
                            ai = atoms[i]  #dot(atoms[i],basis)
                            for j in neighbs[i]:
                                aj = atoms[j]  #dot(atoms[j],basis)
                                d = dist_periodic(ai, aj, lengths)

                                if fabs(d - bl) < bw:
                                    if d < 1.0:
                                        print d
                                        print dist_periodic(ai, aj, lengths)
                                        print ai
                                        print aj
                                        exit(0)
                                    specbonds[i].append(j)
                    else:
                        specbonds = neighbs
                    [angs, abins] = adf(atoms, specbonds, basis, nbins=nbins)
                    tbinvals.append(abins)
                    print count
                    posit = False
            else:
                atoms.append(map(float, line.split()[:3]))
        elif "POSITION" in line:
            atoms = list()
            posit = True
            count += 1

    return angs, tbinvals