Skip to content

Surface NEB + permeation (Parts 1–2) not validated for BCC metals (Fe) #6

Description

@Azeezakinyemi999

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:

  1. 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).
  2. 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.
  3. 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.
  4. 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:

  1. Reuse the per-structure 'miller' mechanism from the NiO issue; set Fe to (1, 1, 0).
  2. 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.
  3. 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.
  4. 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'.
  5. 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.
  6. 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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions