Canonical definition
For each cleavage row, the work of separation is the total energy required to take the uncleaved bicrystal precursor and pull it apart along a single cleave plane, normalized by the area of that one plane:
where C_eV/Ų → J/m² = 16.02176565 is the unit-conversion constant (derived directly from
1 eV = 1.602176565 × 10⁻¹⁹ J and 1 Ų = 10⁻²⁰ m², giving 1 eV/Ų = 16.02176565 J/m²).
Sign convention. W_sep > 0 ⇒ energy is required to separate the two half-cells (the
normal regime: cleaving a bonded interface costs energy). W_sep is the adhesion energy of
the interface, not the surface energy of a free surface — they differ by a factor of two
(γ = W_sep / 2 for an ideal symmetric cleave creating two identical free surfaces).
Term-by-term reference
| Symbol | Meaning | Source | Units |
|---|---|---|---|
E_cleaved |
total energy of the cleaved bicrystal (two half-cells separated by vacuum across one cleave plane); a single structure row with state = 'Cleavage' |
DFT: structure.dft_energy of the cleavage row · MLIP: mlip_calc.energy for (potential, structure.atoms_hash) |
eV |
E_uncleaved |
total energy of the uncleaved precursor (same cell, no cleave); resolved from the cleavage row's extra->>'base_job_name' (joined on structure.job_name AND state != 'Cleavage', lowest id tie-break) |
DFT: structure.dft_energy of the precursor row · MLIP: mlip_calc.energy for the precursor's atoms_hash |
eV |
A_plane |
area of the single cleavage plane in Ų (the area of ONE free surface, NOT the sum of the two faces created on cleavage) | derived: A_plane = (structure.extra->>'area_A2')::float / 2 |
Ų |
C_eV/Ų → J/m² |
unit-conversion constant 16.02176565 | hard-coded as EVA2_TO_JM2 in build_wsep_dfs.py:39 |
J/m² per eV/Ų |
cleave_idx, cleave_z_frac |
enumerated cleave-plane index within the parent GB and its fractional z-position; identifiers only, not used in the W_sep formula | extra->>'cleave_idx', extra->>'cleave_z_frac' |
— |
What extra->>'area_A2' actually contains (Phase 1 audit)
Historically the cleavage rows were ingested with extra->>'area_A2' set equal to
2 · A_plane — i.e. the total free-surface area created by the cleave (two faces of area
A_plane each). The earlier site formula W_sep = ΔE / (2 · A_cleave) was reading
A_cleave = A_plane and dividing by 2·A_cleave — which coincidentally matched
ΔE / area_A2, but the published number was therefore ΔE / (2·A_plane) = γ, the surface
energy, not the textbook work of separation.
The correction (in build_wsep_dfs.py, current main) is to publish
W_sep = ΔE / A_plane. Operationally that is implemented as
W_sep = 2 · (E_cleaved − E_uncleaved) / area_a2 · 16.02176565 [J/m²]
= (E_cleaved − E_uncleaved) / A_plane · 16.02176565
since area_a2 = 2·A_plane. The pre-computed DFT extra->>'W_sep_J_per_m2' is also
multiplied by 2 on read (df["dft_w_sep"] = df["dft_w_sep"] * 2.0) to restore the same
convention. Every published wsep_* metric is the doubled / corrected value. A
representative row (GRACE-2L-OAM-L, Fe-host, S5-RA001-S210, n_pairs = 7410) shifted from
wsep_rmse_jm2 = 2.411321 to 4.822641 and wsep_mae_jm2 = 0.509652 to 1.019304 (exactly
2× as expected); Spearman ρ is unchanged at 0.828861 (scale-invariant).
Pairing the cleaved and uncleaved sides
The cleaved↔uncleaved pairing is carried on the cleavage structure row's extra jsonb:
extra->>'base_job_name' is the job_name of the uncleaved precursor (matched on job_name
AND state != 'Cleavage'); the deterministic tie-break picks the lowest-id sibling when
multiple variants (KP / KS / OMAT) share the same base_job_name. De-duplication on ingest
guarantees those sibling rows share an atoms_hash, so any one resolves to the same MLIP
energy.
Reference implementation:
build_wsep_dfs.py
(CLEAVAGE_SQL, the surrogate _W_sep column loop, and the EVA2_TO_JM2 constant).
Why no W_sep_corrected
Like E_seg, W_sep is a difference of total energies between two cells with
the same composition. The per-(composition, ISPIN) offset corrections used on
the ASSYST single-point track cancel by construction in the formula — there is
nothing to correct. We deliberately do NOT emit a W_sep_corrected column.
BFGS-vs-FIRE fallback rule (best-available)
The cleavage corpus rides the same relaxation campaign as the segregation
corpus (BFGS, fmax=0.01, max_steps=10000 first; FIRE, fmax=0.01,
max_steps=250 for the errored subset). The MLIP relaxation is initialised
from the unrelaxed (as-constructed / DFT-input) geometry, not the DFT-relaxed
frame. For each (potential, structure_id)
the headline metric uses the best-available result:
energy_used = energy_BFGS if status_BFGS == 'done'
else energy_FIRE if status_FIRE == 'done'
else NaN (excluded)
Per-row provenance is preserved via algo_used, n_best_from_bfgs,
n_best_from_fire.
A W_sep row is reported only when both the cleaved and uncleaved sides
have a done energy under the best-available rule; otherwise that
(potential, cleavage_row) is excluded from the rollup.
Aggregation
Per-(potential, host, GB, partition) RMSE/MAE/Spearman is computed as the
count-weighted two-step aggregation matching the ASSYST headline pattern
(see headline_rmse_provenance memory):
- Per (host, GB, partition) bucket: RMSE / MAE / Spearman ρ over
(W_sep^MLIP - W_sep^DFT)for the cleavage rows where the MLIP has a best-availabledoneresult on both sides of the pair. - Per potential, the top-line W_sep RMSE is the count-weighted mean of (1) across all buckets, weighted by the number of evaluated cleavage rows.
Both W_sep RMSE (J/m²) and W_sep MAE (J/m²) are emitted in the rollup and selectable as the leaderboard headline.
Partitions
partition |
corpus | comment |
|---|---|---|
gbseg-cleavage |
FeGB / NiGB cleavage pairs (cleaved + uncleaved precursor) | the W_sep track |
E_seg (the relaxed / unrelaxed sub/int partitions) lives on its own page — see GB segregation.
Snapshot date
Every per-potential summary CSV carries a snapshot_date column. The headline
date on the leaderboard is the minimum across all rolled-up potentials — if any
potential's rollup is stale, the headline flags it.
For deeper provenance (LSN, exporter git sha, build_wsep_dfs.py commit), see the deep cleavage page, the Provenance page, and the gbseg wiki hub.
Code
Work of separation from the cleaved and uncleaved GB slab energies (as in build_wsep_dfs.py). The MLIP evaluates both slabs; W_sep is the closed form:
EVA2_TO_JM2 = 16.02176565 # eV/Ų → J/m²
# E_cleaved, E_uncleaved: MLIP total energies (eV); area_A2: cleave-plane area (Ų)
W_sep = (E_cleaved - E_uncleaved) / area_A2 * EVA2_TO_JM2 # J/m²