Source code for pyscal.misc

import pyscal.core as pc
import numpy as np
import warnings

[docs]def compare_atomic_env(infile, atomtype=2, precision=2, format="poscar", print_results=True, return_system=False): """ Compare the atomic environment of given types of atoms in the inputfile. The comparison is made in terms of Voronoi volume and Voronoi fingerprint. Parameters ---------- infile : string name of the inputfile atomtype: int, optional type of the atom default 2 precision: float, optional precision for comparing Voronoi volumes default 3 format: string, optional format of the input file default poscar print_results: bool, optional if True, print the results. If False, return the data instead. default True return_system: bool, optional if True, return the system object. default False Returns ------- vvx : list of floats unique Voronoi volumes. Returned only if print results is False vrx : list of strings unique Voronoi polyhedra. Returned only if print results is False vvc : list of ints number of unique quantities specified above. Returned only if print results is False """ sys = pc.System() sys.read_inputfile(infile, format=format) sys.find_neighbors(method="voronoi") sys.calculate_vorovector() atoms = sys.atoms vols = [] vors = [] for atom in atoms: if atom.type == atomtype: vols.append(atom.volume) vors.append(" ".join(np.array(atom.vorovector).astype(str))) vols = np.array(vols) vols = np.round(vols, decimals=precision) vvx, vvc = np.unique(vols, return_counts=True) vrx, vrc = np.unique(vors, return_counts=True) length_mismatch = False if (len(vvx) != len(vrx)): warnings.warn("Different voronoi polyhedra with same volume! Fingerprint wont be printed. Maybe change precision?") length_mismatch = True if precision > 3: warnings.warn("More than 3 digits of precision selected!") if print_results: print("%d clusters found"%len(vvx)) if not length_mismatch: for i in range(len(vvx)): print("voro fingerprint = <%s>, vol = %.3f, counts = %d"%(vrx[i], vvx[i], vvc[i])) else: for i in range(len(vvx)): print("voro fingerprint = <x x x x>, vol = %.3f, counts = %d"%(vvx[i], vvc[i])) if return_system: return sys else: if return_system: return np.array([vvx, vrx, vvc]), sys else: return np.array([vvx, vrx, vvc])