Skip to content

SOF-8043: Gr/Ni(111) registry and separation simulation notebook - #364

Draft
VsevolodX wants to merge 4 commits into
mainfrom
feature/SOF-8043
Draft

SOF-8043: Gr/Ni(111) registry and separation simulation notebook#364
VsevolodX wants to merge 4 commits into
mainfrom
feature/SOF-8043

Conversation

@VsevolodX

@VsevolodX VsevolodX commented Sep 1, 2026

Copy link
Copy Markdown
Member

Specific Example reproducing the graphene/Ni(111) registry energetics of Dahal & Batzill, Graphene–nickel interfaces: a review, Nanoscale 6, 2548 (2014)SOF-8043, epic SOF-7994.

What it reproduces

claim result article
favourable registry top_fcc top-fcc (Fig. 1b)
chemisorption distance 2.01 Å ~2.1 Å (0.21 nm)
hollow registry does not chemisorb physisorbed only

Absolute adsorption energies are deliberately not compared — the manuscript's come from dispersion-corrected methods beyond semi-local DFT. The notebook compares the registry ordering and the separations, which transfer between methods.

How

Two tiers, so the notebook is useful in minutes and exact when it matters:

  1. MACE-MP + D3, in the browser. The film is placed at top-fcc / top-hcp / bridge-top / hollow — sites measured from the substrate's own top three Ni layers, each registry labelled by where the second carbon sublattice actually lands — then scanned in z. A chemisorbing registry has two minima (chemisorbed ~2 Å, dispersion-bound further out), so the comparison reads the chemisorbed branch and compares each registry at its own minimum. Comparing all registries at one height misranks them.
  2. Platform DFT. One total_energy job per registry at that geometry — PBE, nspin = 2 with a starting moment on Ni, smearing, 12×12×1 (multiple of 3 so K is sampled), vdw_corr = 'grimme-d3', identical cutoffs across all four. A default run submits one job and names the registries to activate; the Cypress feature activates all four.

Introduction.ipynb's Simulation column is filled for the Gr/Ni row.

Change to the structure notebook

It saved only the empirically-optimized variant; it now also saves the base interface, which the simulation notebook loads by name. The simulation notebook raises if that name is missing rather than silently falling back to Standata.

Verification

Fast tier is green end-to-end in JupyterLite, driven by the Cypress feature in the companion web-app PR: provenance, all four registries, all three checks ok.

The DFT tier is not yet verified — every job on the local stack errors with Account … did not sync to node …. That is an environment fault, not this notebook: mqueue-1's celery queue holds 3249 messages with 0 consumers, the RabbitMQ brokers are not clustered, and the cluster's workers connect to a proxy address that is none of them, so publisher and consumer land on different brokers. The stock Silicon total_energy.feature fails identically — its spec passes only because it asserts a label. Details in plan/log/platform.md.

Draft until the DFT tier runs.

🤖 Generated with Claude Code

Reproduces the registry energetics of graphene on Ni(111) from Dahal &
Batzill, Nanoscale 6, 2548 (2014): which high-symmetry registry is
favourable, and how far the film sits above the surface.

Two tiers. The film is placed at each of top-fcc, top-hcp, bridge-top and
hollow — sites measured from the substrate's own top three Ni layers, and
each registry labelled by where the second carbon sublattice lands — then
scanned in z with MACE-MP + D3. A chemisorbing registry has two minima, so
the comparison reads the chemisorbed branch and compares each registry at
its own minimum; comparing at a shared height misranks them. The platform
tier then computes one Total Energy job per registry at that geometry.

The structure notebook additionally saves the base interface, which the
simulation notebook loads by name: it previously saved only the
empirically optimized variant.

Verified in JupyterLite: top_fcc wins at 2.01 A (article: top-fcc at
2.1 A) and the hollow registry does not chemisorb.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on  ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

The energy-vs-separation figure raised KeyError: 'e_min', a key removed when
the scan was reworked into chemisorbed and dispersion-bound branches. Run
All Cells continues past an error and the assertions were downstream, so it
went unnoticed.

Registries now carry the manuscript's own names and cover all four of its
Fig. 1 configurations — hollow, atop/fcc, atop/hcp, bridge — with the figure
itself embedded. Bridge is defined by its geometry rather than labelled by
nearest site: one of its carbons is equidistant from two sites, so
classifying it returned whichever the dict happened to list first.

Claims match what the evidence supports. The two atop registries differ by a
few meV per carbon, finer than this method resolves, so the check is on the
atop family rather than on one of the two. The hollow registry's
dispersion-bound distance is reported for context, not gated: MACE-MP + D3
places it near 4 A rather than graphite's 3.3 A.

Two same-cell reference jobs (bare slab, free-standing film) now give an
adsorption energy per carbon atom, with the cell, k-grid, cutoffs and
smearing cancelling out of the difference.

Also: the displaced variants are no longer written into uploads/, where
load_material_from_folder's substring match over sorted filenames made them
shadow the base material on a second run; degauss raised to 0.01 Ry for the
metal; the scan-edge guard tests the sampled point rather than the
interpolated minimum; dead label-mapping block removed; stray tildes in the
introduction were rendering as strikethrough.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 1, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

VsevolodX and others added 2 commits September 1, 2026 12:08
The bridge registry did not match the manuscript's Fig. 1d. The figure puts
a first-layer Ni under the midpoint of a C-C bond — the vertical bonds run
through the centres of the surface atoms — while the code placed a carbon
on the Ni-Ni midpoint, 1.9 A away, which also left that carbon equidistant
from the fcc and hcp sites. The placement is now derived from the bond
midpoint and verified rather than asserted, and it moves the bridge
registry from 95 to 21 meV per carbon above atop/fcc, which is the shallow
saddle it should be.

starting_magnetization is indexed by position in ATOMIC_SPECIES, so the
free-standing graphene reference would have started carbon with nickel's
moment. The patch is now built per material by element, and a reference
whose elements differ from the interface's gets its own workflow.

The adsorption-energy references are off by default: they triple the job
count of a run that is meant to finish one job unattended.

Cutoffs drop to 40 Ry with an 8x density cutoff, per the GBRV guidelines
already followed elsewhere in this repo.

The scan-edge warning fired on every run, including where the minimum was
properly bracketed by the point below it. It now fires only when the lowest
chemisorbed sample is the first in the window, which is the case that
actually means the well may lie outside it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…r a default

The density cutoff was 8x the wavefunction cutoff, a ratio taken from a
sibling notebook that uses different pseudopotentials for a different
system. GBRV publishes its ultrasoft set as a 40 / 200 Ry pair, which is
also the platform default, so that is what this uses.

Each remaining parameter now states which of the three it rests on. The
k-point divisions are a multiple of three because K sits at (1/3, 1/3) and
has to lie on the grid, and dense because a metal's Fermi surface needs it.
The starting moment is Ni's bulk value. D3 is on because the hollow registry
has no chemisorbed minimum at all and is held only by dispersion. The MACE
model size is a measurement, not a preference: medium at float32 finds no
chemisorbed minimum and inverts the result.

The SCF settings are grounded in the failure they fix. A first job stopped
at "convergence NOT achieved after 100 iterations" with the total energy
oscillating in its fourth decimal — charge sloshing, not divergence. Cold
smearing leaves the free energy insensitive to degauss where the gaussian
default does not; local-TF mixing is built for the long-wavelength charge
oscillation a slab supports; a smaller mixing fraction and more iterations
let the magnetic moment settle.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant