Repository navigation
docs(validation): attribute the Si δ(E) rise of #364 by bisect (#379) - #382
Conversation
Bisected the Si secondary-electron yield rise of the #364 regeneration across the merges of #241 (PR #289), #340 (PR #343), #342 (PR #344) and #339 (PRs #351, #355), Si default at 200/400/1000 eV and Al at 400 eV. - #241 alone doubles Si (0.80 -> 1.57 at 200 eV), Al unchanged; the `legacy` mode of inelastic_low_energy reproduces abd6a5e exactly, so the table axis is the whole change. - #355 (rate refinement) adds +6 to +10 % (Si) and +10 % (Al). - #340, #342, #351: no change. No table cache in se_yield runs. Mechanism: the pre-#241 model-axis table drew losses beyond E - E_F that the Kieft-Bosch clamp moved to E - E_F; for a metal that event is an energy-neutral swap, for Si it costs E_g and doubles the event rate. Verdict, with cstool 0c739eb (get_min_excitation, compile_full_imfp_icdf), S2017 eq. (3) and Verduin Eq. 3.86/p. 78: correct consequence of the adopted convention, not a defect. Mid-gap reference sensitivity (-6 to -11 %) recorded; #149 verdict sensitivity flagged for operator sign-off. No code, results or bounds changed. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Judge review: changes requestedThe analysis holds up. I verified the sources and reproduced one bisect point. Several small fixes are needed before merge, mainly because #378 merged while this PR was open. With both merged, Verified
Required changes
Optional (not blocking)
CI17 checks pass and 1 is skipped (Pages deploy). At verdict time Labels: |
…d E_max note (#379) Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
|
Doctor: feedback addressed in 0b4ccae. Merged origin/main; the two stale 'not isolated (#379)' sentences now point to the new paragraph; figures recomputed (#355 Si +6.2/+4.7/+10.3 %, #241 ×2.0/×2.4/×2.4, mid-gap −8.3/−6.6/−11.5 %); Effect on #149 now states the E_max failure (ratio 0.47) is convention-independent. update_docs.py --check and cargo fmt pass. Back to review. |
|
Judge deferred: |
|
Judge review of head Evidence and limits:
Releasing |
Judge re-review: approved (head
|
| Claim | Recomputed |
|---|---|
| #241, Si ×2.0 / ×2.4 / ×2.4 | 1.567/0.7965 = 1.967, 1.508/0.6335 = 2.380, 0.885/0.363 = 2.438 |
| #241, Al −0.2 % | 6.509/6.522 = −0.20 % |
| #355, Si +6.2 / +4.7 / +10.3 % | +6.19, +4.74, +10.28 % |
| #355, Al +10 % | +10.34 % |
| Mid-gap −8.3 / −6.6 / −11.5 % ("7 to 12 %") | −8.29, −6.55, −11.48 % |
| δ_max +55 % / mid-gap +42 % (vs 1.074) | +54.9 %, +42.1 % |
| E_max ratio 0.47 | 200/425 = 0.471 |
docs/validation.md, CHANGELOG.md and the PR body all agree.
3. Si E_max caveat: resolved. The #149 paragraph now says that Si fails the factor-2 E_max bound (ratio 0.47), that it failed before #364 too (peak at 150 eV), and that this failure does not depend on the convention. The overall Si verdict is therefore a fail under either reference, and the reference choice decides only the δ_max line. The PR body says the same.
Merge commit 8bb8dee. Diffing it against its main parent (bd91a73) shows only CHANGELOG.md (+7) and docs/validation.md (+101), which are this PR's own changes. The merge introduced nothing unintended. Main has since moved on with #383 and #384, which touch the same two files. git merge-tree against the current origin/main reports no conflict, and GitHub reports mergeStateStatus CLEAN.
CI. All checks pass on 0b4ccae, including Rust on ubuntu-latest, macos-latest and ubuntu-24.04-arm, Python bindings, CodeQL Analyze, the book, and the validation tables and figures. Pages deploy is skipped, as expected on a PR. There are no formal reviews and no inline review threads.
Non-blocking note. #365, now on main, adds a separate "Not explained" sentence about the Si δ gap against Nebula, which widened when Si δ roughly doubled. This PR's paragraph is the natural place for a later doc pass to cross-reference it. It is not a defect here and does not block approval.
Not done in this pass: no builds or simulations, per the sweep's memory constraint. Approval does not grant the #149 operator sign-off the PR asks for.
Verdict: approved. Swapping loom:review-requested for loom:pr.
Closes #379
Summary
This PR bisects the Si secondary-electron yield rise of the #364 regeneration (PR #378) and gives a verdict backed by primary sources. The new Si δ follows from the convention #241 adopted. It is not a defect, so the PR changes documentation only, with no code or results changes. The new paragraph is "Why Si δ doubled after #241 (#379)" in
docs/validation.md, just before## Reporting. It sits outside #378's hunks, so the two PRs should merge in either order.Bisect
Each build is a release CLI built in its own target dir with
CARGO_BUILD_JOBS=4. Each run is thedefaultinput ofse_yield.py, with 2,000 histories, seed 1,threads = 2and no table cache.se_yield.pynever passes--table-cache, which rules out hypothesis 4. Values are δ per primary.abd6a5e(committed before #364)f64e9df(before #289)f5e2be8(#289, #241)f0786fa/882fbc4(#343, #340)f7895dc/377b5da(#344, #342)a26cdad/eb24e8e(#351, #339 pt 1)a0359ff(before #355)09bc1dd(#355, #339)74a5ce3,2c1e28eAttribution:
The
legacymode ofinelastic_low_energybuilds the inelastic table the pre-#241 way inside the current build. It reproducesabd6a5eexactly (Si 0.796 / 0.633 / 0.363, Al 6.522), so the table axis accounts for the whole #241 change.Mechanism
Before #241, a row read at band-bottom energy
Eallowed losses up toE, and the Kieft-Bosch clamp moved them toE - E_F. At 400 eV, for electrons 5 to 20 eV aboveE_F, the clamp took 61 to 83 % of Si events and 78 to 82 % of Al events. The two materials react differently:E_F + (E-E_F) - 0 = E. That is an energy-neutral swap, so Al is unaffected.E_Fand the secondary leaves withE - E_g. Each event costs 1.1 eV, and there were about twice as many events (54.7 against 28.0 per primary at 5 to 10 eV aboveE_F). Electrons near the vacuum level (U - E_F= 4.6 eV) get ground below it.Verdict and sources
The new Si δ is the correct consequence of the adopted convention. The sources:
ω_max = T' - E_F, so the primary cannot end below the lowest free state.0c739eb, minimum excitation.get_min_excitation()(cstool/input_data/band_structure.py) isW_v + E_gfor an insulator. Its docstring says "both the primary and secondary electron must be in the conduction band".0c739eb, dielectric table.apps/cstool.pypassesget_min_excitation()asFtocompile_full_imfp_icdf, whose "Fermi correction" keepsω < K - F.E_F + W - E_gwith mid-gapE_Fis Verduin Eq. 3.86 with B = band gap (p. 78). Electron inelastic tables: build rows on the band-bottom axis with the band's Fermi energy (cstool convention) instead of relying on the E - E_F clamp #241 did not change it. Because the clamp atE - E_Flies above every tabulated loss, the two references do not double-count.Sensitivity runs at
2c1e28e(diagnostic builds, not committed):E_F, as cstool does for its Kieft/Ashley table, gives Si 1.526 / 1.476 / 0.864. That is 7 to 12 % below (−8.3 / −6.6 / −11.5 %) the adopted convention, so this reference is a minor factor, not the doubling.W_v + Wgives 1.869 / 1.852 / 1.140.Operator sign-off needed (#149). The Si
defaultδ_max of 1.664 is +55 % against the measured median and fails the bound. The mid-gap diagnostic at 200 eV would be +42 %, which passes. The δ_max verdict therefore sits near the bound. Si also fails the factor-2 E_max bound (200 vs 425 eV, ratio 0.47), as it did before #364, and that does not depend on the convention. The bounds are not changed; whether to record the result as the known single-pole low-energy overestimate is the operator's call.Results that change
None. No code changed and no δ table was regenerated. The #364 tables in PR #378 already use the convention this PR attributes, so no rerun is needed.
Follow-ups (done in the second commit after merging
origin/main):mainstill says Electron inelastic tables: build rows on the band-bottom axis with the band's Fermi energy (cstool convention) instead of relying on the E - E_F clamp #241 changes δ by "a few per cent". validation: regenerate the δ(E) tables on band-bottom inelastic tables (#364) #378 rewrites that bullet, so I left it alone to avoid a conflict.Verification
python3 validation/update_docs.py --check: passes.python3 validation/oracles/bench_electron.py --update-docs --check: passes.python3 validation/check_manual_coverage.py: passes.cargo fmt --all --check: passes.The bisect ran one build and one run at a time with
RAYON_NUM_THREADS=2, with ≥ 40 % free memory before each step. No full Penn runs and no campaigns. Scratch targets were deleted.🤖 Generated with Claude Code
loom dashboard