Benchmarks: Random Generation Methods

This page compares different amorphous structure generation approaches available in AmorphGen, tested on SiO₂, Si, and Li₂ZrCl₆.

Methods compared

Method

Description

Typical time (48-72 atoms, Mac M-series)

SC+opt

SC random placement → static optimisation

~2 min

CHGNet MQ

SC random → hybrid melt-quench (CHGNet, MPS)

~8-20 min

MACE MQ

SC random → hybrid melt-quench (MACE, CPU)

~1-2 hours

The hybrid melt-quench (MQ) workflow skips the melt stage (stages 2-3) since the random structure is already disordered:

Random (SC) → Optimise → High-T equilibrate → Quench → Low-T equilibrate → Final optimise
  (stage 1)    (stage 4)      (stage 5)        (stage 6)       (stage 7)

Results

SiO₂ (48 atoms: Si₁₆O₃₂)

Method

Density (g/cm³)

Si-O CN

CN=4 (%)

O-Si-O angle (°)

Si-O dist (Å)

SC+opt (CHGNet)

2.23

4.0

85%

108.9 ± 14.4

1.665

CHGNet MQ (short)

2.25

4.0

100%

109.4 ± 6.4

1.645

CHGNet MQ (long)

1.94

4.0

100%

109.5 ± 5.1

1.634

MACE MQ

2.25

4.0

100%

Experiment

2.20

4.0

~100%

109.5 ± 10

1.620

Key finding: Both CHGNet and MACE MQ achieve 100% tetrahedral Si coordination. CHGNet MQ gives the tightest bond angle distribution (5.1° std vs 14.4° for static optimisation).

Si (40 atoms)

Method

Density (g/cm³)

Si-Si CN

CN=4 (%)

SC+opt (CHGNet)

2.24

4.0

80%

CHGNet MQ (short)

2.28

4.0

75%

CHGNet MQ (long)

2.31

4.0

90%

MACE MQ

2.36

4.3

75%

Experiment

2.29

4.0

~100%

Key finding: Longer equilibration improves CN=4 fraction (90% with long CHGNet MQ). Pure Si needs slow cooling rates for tetrahedral network formation.

Li₂ZrCl₆ (72 atoms: Li₁₆Zr₈Cl₄₈)

Method

Density (g/cm³)

Zr-Cl CN

CN=6 (%)

Li-Cl CN

CN=6 (%)

SC+opt (CHGNet)

1.76

5.5

52%

4.1

1%

CHGNet MQ (NVT)

1.76

5.8

75%

4.4

0%

CHGNet MQ (dense)

1.82

5.5

50%

4.6

6%

MACE MQ

2.40

6.0

100%

5.4

56%

Experiment

2.39

6.0

100%

6.0

100%

Key finding: MACE is dramatically better for chloride systems — correct density (2.40 vs 1.76), perfect Zr octahedra (100% CN=6), and much improved Li coordination (56% vs 0-6% CN=6). CHGNet significantly underestimates the density of chloride systems.

Recommendations

System type

Recommended method

Notes

Oxides (SiO₂, In₂O₃, Ga₂O₃)

CHGNet MQ on MPS/GPU

Fast, accurate CN and angles

Pure elements (Si, Ge)

CHGNet MQ (long) on MPS/GPU

Need slow cooling for CN=4

Chlorides (Li₂MCl₆)

MACE MQ on CUDA

CHGNet fails on density; MACE essential

Quick screening

SC+opt (any backend)

2 min, gives ~85% correct CN

Reproduction

SiO₂ with CHGNet MQ

# SiO2_chgnet_mq.yaml
model: chgnet
device: mps
default_dtype: float32

opt:
  fmax: 0.05
  max_steps: 200
  cell_filter: cubic

random_gen:
  composition:
    Si: 16
    O: 32
  target_density: 2.2
  target_cn:
    Si: 4
    O: 2

eq_high:
  ensemble: NVT
  T: 3000
  steps: 5000

quench:
  ensemble: NVT
  T_start: 3000
  T_end: 300
  T_step: -100
  steps_per_T: 500

eq_low:
  ensemble: NVT
  T: 300
  steps: 2000
# Generate
amorphgen --random-gen --config SiO2_chgnet_mq.yaml --work-dir SiO2_random

# Run hybrid MQ (stages 1,4,5,6,7)
amorphgen SiO2_random/random_0000.xyz \
    --config SiO2_chgnet_mq.yaml \
    --stages 1 4 5 6 7 \
    --work-dir SiO2_mq

# Analyse
amorphgen --analyse --input-dir SiO2_mq/ --save-plot SiO2_mq/plots

Li₂ZrCl₆ with MACE MQ

# Li2ZrCl6_mace_mq.yaml
model: mace-mpa-0
device: cpu          # or cuda on HPC
default_dtype: float64

opt:
  fmax: 0.05
  max_steps: 300
  cell_filter: none  # fixed cell at experimental density

random_gen:
  composition:
    Li: 16
    Zr: 8
    Cl: 48
  target_density: 2.4
  target_cn:
    Zr: 6
    Li: 6
  dmax:
    Zr-Cl: 3.2
    Li-Cl: 3.2

eq_high:
  ensemble: NVT
  T: 1200
  steps: 10000

quench:
  ensemble: NVT
  T_start: 1200
  T_end: 300
  T_step: -50
  steps_per_T: 500

eq_low:
  ensemble: NVT
  T: 300
  steps: 5000
amorphgen --random-gen --config Li2ZrCl6_mace_mq.yaml --work-dir LZC_random
amorphgen LZC_random/random_0000.xyz \
    --config Li2ZrCl6_mace_mq.yaml \
    --stages 1 4 5 6 7 \
    --work-dir LZC_mq
amorphgen --analyse --input-dir LZC_mq/ --save-plot LZC_mq/plots

Python API

from amorphgen.pipeline.random_gen import generate_random
from amorphgen import MeltQuenchPipeline
from amorphgen.analysis import StructureAnalyser
from ase.io import write

# Step 1: Generate
atoms = generate_random(
    composition={"Si": 16, "O": 32},
    target_density=2.2,
    target_cn={"Si": 4, "O": 2},
    seed=42,
)
write("random_SiO2.xyz", atoms, format="extxyz")

# Step 2: Hybrid MQ
pipe = MeltQuenchPipeline(
    input_file="random_SiO2.xyz",
    work_dir="SiO2_mq",
    cfg_override={
        "model": "chgnet", "device": "mps",
        "opt": {"fmax": 0.05, "cell_filter": "cubic"},
        "eq_high": {"T": 3000, "steps": 5000},
        "quench": {"T_start": 3000, "T_end": 300, "T_step": -100},
        "eq_low": {"T": 300, "steps": 2000},
    },
)
pipe.run(stages=[1, 4, 5, 6, 7])

# Step 3: Analyse
sa = StructureAnalyser("SiO2_mq/stage7_opt.xyz", cutoff="auto")
sa.summary()
sa.plot(output_dir="SiO2_mq/plots")

Equilibration convergence

Use the convergence report to verify that MD equilibration has converged:

from amorphgen.utils.equilibration import convergence_report

# From log file (fast, energy + temperature only)
report = convergence_report(
    "SiO2_mq/stage4_eq.log",
    n_atoms=48,
    T_target=3000,
    output_dir="SiO2_mq/convergence",
)

# From trajectory (full analysis: energy, MSD, RDF, CN)
report = convergence_report(
    "SiO2_mq/stage4_eq.xyz",
    timestep_fs=0.5,
    T_target=3000,
    pairs_cn=[("Si", "O", 4.0), ("O", "Si", 2.0)],
    output_dir="SiO2_mq/convergence",
)

Key convergence criteria:

  • Energy drift < 0.001 eV/atom/ps

  • Block average test PASSED (block means within 2× SEM)

  • MSD linear (liquid) at high T, plateau (glass) at low T

  • RDF overlapping across time windows