Generating Order Variety

Generate a full spectrum of supercells, from fully disordered liquid to nanocrystalline, from a single reference crystal. The pattern below is a good starting point for studying how the g3 distribution evolves as structural order increases.

Tip

The pattern on this page uses the default full-FIRE pipeline at 40³ Å (~5 k atoms / regime). For production cells (100³ Å and larger), see Generating very large cells for the shortcut pipeline and the subsampled g(r) / g3 measurement helpers.

Setup

from ase.io import read
import tricor as tc

file_cif = 'Si.cif'
cell_dim_angstroms = (40, 40, 40)
r_max = 20
r_step = 0.05
phi_num_bins = 90
movie_file_name_base = 'structure_'

atoms = read(file_cif, index=0)
shell_target = tc.CoordinationShellTarget.from_atoms(
    atoms,
    phi_num_bins=phi_num_bins,
)

Generate all disorder regimes

cases = [
    ("liquid", dict(
        num_steps=100,
        grain_size=None,
        bond_weight=0.4,
        angle_weight=0.5,
        repulsion_weight=0.5,
        hard_core_scale=0.75,
        nonbond_push_scale=0.7,
    )),
    ("amorphous", dict(
        num_steps=150,
        grain_size=6.0,
        bond_weight=1.2,
        angle_weight=0.6,
        repulsion_weight=1.5,
        hard_core_scale=0.9,
        nonbond_push_scale=0.5,
        displacement_sigma=0.08,
    )),
    ("SRO", dict(
        num_steps=200,
        grain_size=10.0,
        bond_weight=2.2,
        angle_weight=1.0,
        repulsion_weight=2.0,
        hard_core_scale=0.95,
        nonbond_push_scale=0.6,
        displacement_sigma=0.04,
    )),
    ("MRO", dict(
        num_steps=150,
        grain_size=13.0,
        bond_weight=1.9,
        angle_weight=0.9,
        repulsion_weight=2.5,
        hard_core_scale=0.95,
        nonbond_push_scale=0.7,
        displacement_sigma=0.04,
    )),
    ("LRO", dict(
        num_steps=150,
        grain_size=18.0,
        bond_weight=2.0,
        angle_weight=1.0,
        hard_core_scale=0.95,
        nonbond_push_scale=0.9,
        displacement_sigma=0.04,
    )),
    ("nanocrystalline", dict(
        num_steps=150,
        grain_size=20.0,
        bond_weight=3.0,
        angle_weight=1.5,
        displacement_sigma=0.02,
    )),
]

cells = {}
for idx, (name, kw) in enumerate(cases, start=1):
    print(f"{idx:02d} - {name}")
    cell = tc.Supercell.from_atoms(
        atoms,
        cell_dim_angstroms=cell_dim_angstroms,
        r_max=r_max,
        r_step=r_step,
        phi_num_bins=phi_num_bins,
        rng_seed=42,
    )
    cell.generate(shell_target, **kw)
    cell.measure_g3()
    cells[name] = cell

View g3 distributions

for name, cell in cells.items():
    print(f"\n--- {name} ---")
    display(cell.plot_g3())

Render movies

for idx, (name, cell) in enumerate(cells.items(), start=1):
    cell.plot_structure(
        output=f"{movie_file_name_base}{idx:02d}_{name}.mp4",
        fps=60,
        duration=6.0,
        width=512,
        height=512,
    )
    print(f"  -> {movie_file_name_base}{idx:02d}_{name}.mp4")

Using presets

cell = tc.Supercell.from_atoms(
    atoms,
    (40, 40, 40),
    rng_seed=42,
)
cell.generate(shell_target, **tc.Supercell.PRESETS["MRO"])
cell.measure_g3()
cell.plot_g3()