Angular Parameters and Chi Parameters#

Angular Criteria#

The angular parameter identifies diamond-like structures by analyzing the angles between an atom and its neighbors. It returns a per-atom value useful for distinguishing diamond cubic from other structures.

Note: Both angular_criteria and chi_params require neighbors to be found first.

import pyscal
from pyscal.structures import make_crystal
import numpy as np

Angular Parameter#

dia = make_crystal("diamond", lattice_constant=5.43, repetitions=(3, 3, 3))
pyscal.find_neighbors(dia, method="cutoff", cutoff=0)

angular = pyscal.angular_criteria(dia)
print(f"Angular parameter (diamond): mean = {angular.mean():.4f}")
print(f"Unique values: {np.unique(angular)}")
Angular parameter (diamond): mean = 0.0000
Unique values: [1.84889275e-32]
# Compare with non-diamond structure
fcc = make_crystal("fcc", lattice_constant=3.6, repetitions=(4, 4, 4))
pyscal.find_neighbors(fcc, method="cutoff", cutoff=0)

angular_fcc = pyscal.angular_criteria(fcc)
print(f"Angular parameter (FCC): mean = {angular_fcc.mean():.4f}")
Angular parameter (FCC): mean = 2.5931

Chi Parameters#

Chi parameters provide a complementary structural fingerprint based on the angular distribution of neighbors. The chi vector captures angular structure information.

fcc = make_crystal("fcc", lattice_constant=3.6, repetitions=(4, 4, 4))
pyscal.find_neighbors(fcc, method="cutoff", cutoff=0)

chi = pyscal.chi_params(fcc)

print(f"Chi vector shape: {chi.shape}")
print(f"Chi vector (atom 0): {chi[0]}")
Chi vector shape: (256, 9)
Chi vector (atom 0): [ 6  0  0  0 24 12  0 24  0]

Comparing Chi Parameters Across Structures#

structures = {
    "FCC": make_crystal("fcc", lattice_constant=3.6, repetitions=(4, 4, 4)),
    "BCC": make_crystal("bcc", lattice_constant=2.87, repetitions=(4, 4, 4)),
    "HCP": make_crystal("hcp", lattice_constant=3.2, repetitions=(4, 4, 4), ca_ratio=1.633),
}

for name, s in structures.items():
    pyscal.find_neighbors(s, method="cutoff", cutoff=0)
    chi = pyscal.chi_params(s)
    vals = chi.mean(axis=0)
    print(f"{name}: chi = {vals}")
FCC: chi = [ 6.  0.  0.  0. 24. 12.  0. 24.  0.]
BCC: chi = [ 7.  0.  0.  0. 36. 12.  0. 36.  0.]
HCP: chi = [ 3.  0.  6.  0. 21. 12.  0. 24.  0.]