Disorder Parameter#

The disorder parameter \(D\) measures how much the local bonding environment of an atom deviates from its neighbors. It is based on Steinhardt parameters and is useful for identifying defects, interfaces, and grain boundaries.

\[D_i = \frac{1}{N_b} \sum_j \left[ \sum_l (q_{lm}^i - q_{lm}^j)^2 \right]\]
import pyscal
from pyscal.structures import make_crystal
import numpy as np

Basic Usage#

The disorder parameter requires neighbors to be found first. The q parameter selects which Steinhardt parameter order to use (default: 6).

# Perfect FCC crystal - low disorder
fcc = make_crystal("fcc", lattice_constant=3.6, repetitions=(4, 4, 4))
pyscal.find_neighbors(fcc, method="cutoff", cutoff=0)

d = pyscal.disorder(fcc, q=6)
print(f"Perfect FCC - Disorder: mean = {d.mean():.6f}, std = {d.std():.8f}")
Perfect FCC - Disorder: mean = -0.000000, std = 0.00000000

Averaged Disorder#

Setting averaged=True uses averaged Steinhardt parameters, which tend to be more robust.

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

d_avg = pyscal.disorder(fcc2, q=6, averaged=True)
print(f"Averaged disorder: mean = {d_avg.mean():.6f}")
Averaged disorder: mean = -0.000000

Comparing Structures#

Different crystal structures have different disorder values.

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)
    d = pyscal.disorder(s, q=6)
    print(f"{name}: disorder mean = {d.mean():.6f}")
FCC: disorder mean = -0.000000
BCC: disorder mean = -0.000000
HCP: disorder mean = -0.000000

Stored Results#

Results are stored in atoms.arrays["pyscal_disorder"] (or pyscal_disorder_avg).

print(f"Stored key: {[k for k in fcc.arrays if 'disorder' in k]}")
print(f"Per-atom values (first 5): {fcc.arrays['pyscal_disorder'][:5]}")
Stored key: ['pyscal_disorder']
Per-atom values (first 5): [-2.96059473e-16 -3.70074342e-16 -3.33066907e-16 -2.03540888e-16
 -3.70074342e-17]