def check(structure, center, tolerance=1e-8): from numpy import abs, sqrt, all from pylada.crystal import coordination_shells # check we get the coordination_shells of zinc-blende. neighs = coordination_shells(structure, 5, center, tolerance) assert len(neighs) == 5 assert len(neighs[0]) == 4 for atom, diff, dist in neighs[0]: assert abs(dist - sqrt(3.0) * 0.25) < tolerance assert all(abs(abs(diff) - 0.25) < tolerance) assert len(neighs[1]) == 12 for atom, diff, dist in neighs[1]: assert abs(dist - sqrt(2.0) * 0.5) < tolerance assert len([0 for u in diff if abs(u) < tolerance]) == 1 assert len([0 for u in diff if abs(abs(u) - 0.5) < tolerance]) == 2 assert len(neighs[2]) == 12 for atom, diff, dist in neighs[2]: assert abs(dist - sqrt(0.75 * 0.75 + 2. * 0.25 * 0.25)) < tolerance assert len([0 for u in diff if abs(abs(u) - 0.25) < tolerance]) == 2 assert len([0 for u in diff if abs(abs(u) - 0.75) < tolerance]) == 1 assert len(neighs[3]) == 6 for atom, diff, dist in neighs[3]: assert abs(dist - 1.) < tolerance assert len([0 for u in diff if abs(u) < tolerance]) == 2 assert len([0 for u in diff if abs(abs(u) - 1.) < tolerance]) == 1 assert len(neighs[4]) == 12 for atom, diff, dist in neighs[4]: assert abs(dist - sqrt(2 * 0.75 * 0.75 + 0.25 * 0.25)) < tolerance assert len([0 for u in diff if abs(abs(u) - 0.75) < tolerance]) == 2 assert len([0 for u in diff if abs(abs(u) - 0.25) < tolerance]) == 1
def check_against_neighbors(structure, tolerance=1e-8): from bisect import bisect_right from pylada.crystal import coordination_shells, neighbors distances = [u[-1] for u in neighbors(structure, 150, [0, 0, 0], tolerance)] shells = coordination_shells(structure, 10, [0, 0, 0], tolerance) for j in range(8): i = bisect_right(distances, max([u[-1] for u in shells[j]])) assert i == sum([len(shell) for shell in shells[:j + 1]])