The surface/subsurface machinery was built and validated for FCC(111) Ni-based slabs. Pure BCC Fe (Fe_supercell.lammps) would currently go through untested and partly wrong paths in Parts 1–2:
- Wrong surface: the global MILLER = (1,1,1) gives BCC(111) — an extremely open, corrugated plane with interlayer spacing a/(2√3) ≈ 0.83 Å for Fe. The natural stable BCC cleavage is (110).
- ACAT site enumeration (models/surface_graph.py, metal path): the top-3-layer extraction + z-snap + CustomSurface(n_layers=3) flow assumes FCC(111) ABC stacking geometry. BCC(111)'s ~0.83 Å plane spacing is near/below the z-snap and layer-detection tolerances, so layer slicing can silently merge planes; ACAT site typing for BCC(110) is also unvalidated here.
- Subsurface interstitials (models/subsurface_graph.py): classify_site uses coordination counting with COORD_CUTOFF = 2.2 Å, tuned to Ni FCC oct/tet distances. BCC octahedral sites have a split nearest-neighbor shell (for Fe: 2 atoms at a/2 ≈ 1.44 Å + 4 at a/√2 ≈ 2.03 Å) and tetrahedral sites differ likewise — sites may be misclassified or discarded, leaving Hop A/B without targets.
- H site energetics differ: in BCC, H prefers tetrahedral interstitials (unlike octahedral in FCC) — worth remembering when interpreting Hop A targets.
Fe is currently excluded from Parts 1–2. Its Part 3 bulk diffusivity is structure-agnostic and unaffected — keep it running (bulk D(T) of H in BCC Fe is valuable data).
Plan to solve:
- Reuse the per-structure 'miller' mechanism from the NiO issue; set Fe to (1, 1, 0).
- For BCC slabs, route layer detection to the gap-based _z_plane_clusters path (already implemented for oxides) instead of the equal-count rank heuristic — BCC(110) planes are equally populated so either works, but gap detection removes the FCC-tuned assumptions. Simplest: extend the existing metal_type routing with 'pure_bcc', or key off _CRYSTAL_STRUCT_MAP[elem][0] == 'bcc' in build_surface_graph.
- Site enumeration on BCC(110): either (a) validate ACAT's CustomSurface on a clean Fe(110) test slab (it may just work — check site types/counts against the known BCC(110) site set: ontop, long/short bridge, 3-fold hollow), or (b) if ACAT misbehaves, extend the geometric enumerator (used for oxides) to metal tops — it is composition-agnostic already.
- Subsurface: make COORD_CUTOFF element/structure-aware (e.g. derive from the first minimum of the site–atom distance distribution), or for BCC use keep_unclassified=True (already implemented) so distorted-oct/tet sites are retained as 'interstitial'.
- Validate with a unit test mirroring tests/test_oxide_surface_graph.py: Fe(110) slab → plane detection, site counts, fingerprint dedup collapsing to the symmetry-unique BCC(110) sites; plus a build_subsurface_graph test asserting sub1/sub2 sites and Hop B edges exist.
- Acceptance: smoke-level Section A + Hop A on Fe(110) produce sites/jobs; barriers sanity-checked against literature (H on Fe(110): dissociation ~0.0–0.1 eV, entry ~0.3–1.0 eV depending on coverage).
The surface/subsurface machinery was built and validated for FCC(111) Ni-based slabs. Pure BCC Fe (Fe_supercell.lammps) would currently go through untested and partly wrong paths in Parts 1–2:
Fe is currently excluded from Parts 1–2. Its Part 3 bulk diffusivity is structure-agnostic and unaffected — keep it running (bulk D(T) of H in BCC Fe is valuable data).
Plan to solve: