Source code for imeall.calc_eseg
import sys
from ase import Atoms as aseAtoms
from ase.io.vasp import write_vasp
from ase.calculators.vasp import Vasp
from quippy import Atoms, farray, frange, set_fortran_indexing
from calc_inter_dist import decorate_interface
import json
import argparse
import numpy as np
sys.settrace
[docs]def nearest_to_unique(at, unique_sites):
"""Given an :class:`ase.Atom` object and an array of site vectors finds
whether there is a correspondence between the atom position
and one of the sites.
Args:
at(:class:`ase.Atom`): atom object.
unique_sites(list): list of position vectors.
Returns:
bool: Whether or not atom position is identical to a site
in the unique_sites list.
"""
equiv_site = False
for site in unique_sites:
if np.allclose(at.position, np.array(site[:3])):
equiv_site = True
return equiv_site
[docs]def gen_interface():
"""Selects an interfacial region of a bicrystal
based on common neighbour analysis. The width of the interfacial region
is equal to 2*(gb_max-gb_min) where gb_max is the z-coordinate of the highest
non-bcc atom, and gb_min is the lowest non-bcc atom.
The method creates a file `interface.xyz` in the working directory,
with the interface centered in a unit cell with 1 angstrom vacuum
on each side.
Returns:
:class:`ase.Atoms`: Atoms object of the interfacial slab in same
coordinates as original bicrystal.
"""
#output.xyz must have structure_type property attached.
ats = Atoms('output.xyz')
cell_midpoint = ats.get_cell()[2,2]/2.0
#select non-BCC sites are 0 otherwise 3.
struct_type = np.array(ats.properties['structure_type'])
struct_mask = [not struct for struct in struct_type]
interface = ats.select(struct_mask)
#select upper interface to decorate.
interface = interface.select([at.position[2] > cell_midpoint for at in interface])
z_vals = [at.position[2] for at in interface]
z_min = min(z_vals)
z_max = max(z_vals)
#take slice of interface max uncoordinated with min uncoordinated.
z_width = (z_max-z_min)/2.0
z_center = z_width + z_min
gb_max = z_max + 1.0*z_width
gb_min = z_min - 1.0*z_width
zint = ats.select([(gb_min <= at.position[2] <= gb_max) for at in ats])
#make a copy to return
int_ats = zint.copy()
zint.center(vacuum=1.0, axis=2)
zint.write('interface.xyz')
#Write POSCAR to use interstitial site generator:
ats = Atoms('interface.xyz')
#vasp_args=dict(xc='PBE', amix=0.01, amin=0.001, bmix=0.001, amix_mag=0.01, bmix_mag=0.001,
# kpts=[3, 3, 3], kpar=9, lreal='auto', ibrion=-1, nsw=0, nelmdl=-15, ispin=2,
# nelm=100, algo='VeryFast', npar=24, lplane=False, lwave=False, lcharg=False, istart=0,
# voskown=0, ismear=1, sigma=0.1, isym=2)
#vasp = Vasp(**vasp_args)
#vasp.initialize(ats)
#write_vasp('POSCAR', vasp.atoms_sorted, symbol_count=vasp.symbol_count, vasp5=True)
return int_ats
if __name__=='__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--gen_interface','-g',help='create a slab of the interfacial region.', action='store_true')
args = parser.parse_args()
if args.gen_interface:
gen_interface()
if args.decorate_interface:
decorate_interface()