Source code for ccs_fit.common.neighborlist

# ------------------------------------------------------------------------------#
#  CCS: Curvature Constrained Splines                                          #
#  Copyright (C) 2019 - 2023  CCS developers group                             #
#                                                                              #
#  See the LICENSE file for terms of usage and distribution.                   #
# ------------------------------------------------------------------------------#

"""
Common neighbor list routines used by the CCS project.
"""


import numpy as np
from ase.neighborlist import NeighborList

from ccs_fit.data.conversion import AA__Bohr


[docs]def pair_dist(atoms, rcut, ch1, ch2): """Calculates the pairwise distances between two types of atoms within a certain cuttoff. Args: atoms (list): list of ASE Atoms objects rcut (float): neighbor list cutoff in Angstrom ch1 (str): atom species 1 ch2 (str): atoms species 2 Returns: dists_rounded (list): list of distances in Bohr, i.e. atomic units """ if ch1 == ch2: bothways = False else: bothways = True nl = NeighborList( atoms.get_global_number_of_atoms() * [rcut], self_interaction=False, bothways=bothways, ) nl.update(atoms) distances = [] for jj in range(atoms.get_global_number_of_atoms()): if atoms.get_chemical_symbols()[jj] == ch1: indices, offsets = nl.get_neighbors(jj) for ii, offset in zip(indices, offsets): if atoms.get_chemical_symbols()[ii] == ch2: distances.append( ( np.linalg.norm( atoms.positions[ii] + np.dot(offset, atoms.get_cell()) - atoms.positions[jj] ) ) ) distances.sort() # convert distances from Angstrom to Bohr and round dists_rounded = [round(elem * AA__Bohr, 6) for elem in distances] return dists_rounded