1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
"""Comparators originally meant to be used with particles"""
import numpy as np
from ase.ga.utilities import get_nnmat
class NNMatComparator:
"""Use the nearest neighbor matrix to determine differences
in the distribution (and to a slighter degree structure)
of atoms. As specified in
S. Lysgaard et al., Top. Catal., 57 (1-4), pp 33-39, (2014)"""
def __init__(self, d=0.2, elements=None, mic=False):
self.d = d
if elements is None:
elements = []
self.elements = elements
self.mic = mic
def looks_like(self, a1, a2):
""" Return if structure a1 or a2 are similar or not. """
elements = self.elements
if elements == []:
elements = sorted(set(a1.get_chemical_symbols()))
a1, a2 = a1.copy(), a2.copy()
a1.set_constraint()
a2.set_constraint()
del a1[[a.index for a in a1 if a.symbol not in elements]]
del a2[[a.index for a in a2 if a.symbol not in elements]]
nnmat_a1 = get_nnmat(a1, mic=self.mic)
nnmat_a2 = get_nnmat(a2, mic=self.mic)
diff = np.linalg.norm(nnmat_a1 - nnmat_a2)
if diff < self.d:
return True
else:
return False
|