Skip to content

feat(crystal): source GaN cell and measured density; record the 4H-SiC density gap - #352

Merged
loom-fleet-dispatch[bot] merged 1 commit into
mainfrom
feature/issue-179
Oct 10, 2026
Merged

loom-fleet-dispatch[bot] merged 1 commit into
mainfrom
feature/issue-179

Conversation

@loom-fleet-dispatch

@loom-fleet-dispatch loom-fleet-dispatch Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Part of #179. This PR does not close it: the density criterion is now met for 6H-SiC and GaN but not for 4H-SiC. No measured 4H bulk density could be opened. Details below.

Summary

This continues the merged hexagonal-lattice work (#198) on the remaining density criterion in #179.

  • GaN cell replaced with an opened primary measurement. GAN_LATTICE_CONSTANTS is now a = 3.1890 Å, c = 5.18500 Å at 300 K, from Melnik et al., MRS Internet J. Nitride Semicond. Res. 2, 39 (1997), doi:10.1557/S1092578300001654 (open access). The values are from section 3.2 (PDF p. 3) and Table 1 (PDF p. 5, "measured at 300 K"): a free-standing bulk crystal after an anneal that removed the residual strain, measured by the triple-crystal Bond method. The stated accuracy is 0.00005 Å for a and 0.00002 Å for c. The old values (Ioffe NSM, credited to a thin-film conference paper that was never opened) are gone.
  • GaN density replaced with a measured value. GAN_DENSITY_G_CM3 is now 6.1 g/cm³ (_exptl_crystal_density_meas), from Juza and Hahn, Z. Anorg. Allg. Chem. 239, 282 (1938), as recorded in COD entry 1010168 (public domain). The primary paper is closed and was not opened, and the record gives no temperature.
  • Why the old GaN value disagreed: the old Ioffe 6.15 g/cm³ equals the X-ray density of the 1938 cell (3.180 / 5.166 Å; COD 9008868 prints 6.146). That explains the −8.5e-3 offset pinned in Crystal step 19b: hexagonal lattices (wurtzite GaN, 4H/6H-SiC) (#179) #198. That the archive derived its value this way is my inference, and the provenance row says so.
  • 4H-SiC is unchanged and stays provisional. I found an open primary source, Thibault, Am. Mineral. 29, 327 (1944), and recorded it in the provenance row and in the SIC_4H_DENSITY_G_CM3 doc. Its type III (4H) cell, 3.073 / 10.053 Å, is the origin of the Ioffe "a = 3.0730, b = 10.053" row that Crystal step 19b: hexagonal lattices (wurtzite GaN, 4H/6H-SiC) (#179) #198 flagged as a likely transcription error. But it gives only a calculated density for 4H (3.217). Its one measured (pycnometric) density, 3.218 at 30 °C, is for 6H. So it does not close the gap.
  • Updated: the provenance row and Open questions in docs/data-provenance.md (SHA-256 of every file read), the preset table in docs/crystal-orientation.md, and a CHANGELOG "Changed" entry (the GaN preset values are public API).

Density cases (as printed by number_density_report_states_the_sources)

Material Density (source, temperature, precision) Cell (source, temperature) Lattice-implied density lattice/material − 1 Tolerance Verdict
6H-SiC 3.21 g/cm³, Ioffe NSM (Harris 1995b), 300 K; half last digit 1.56e-3 Bauer 2001 via AFLOW: 3.08129 / 15.11976 Å, T not stated 3.21337 g/cm³ +1.050e-3 1.7e-3 (unchanged) agrees
GaN 6.1 g/cm³ measured, Juza & Hahn 1938 via COD 1010168, T not stated; half last digit 8.20e-3 Melnik 1997: 3.1890 (±0.00005) / 5.18500 (±0.00002) Å, 300 K 6.08936 g/cm³ −1.744e-3 8.3e-3 = 8.20e-3 (printed digit) + 3.5e-5 (cell accuracy) + under 1e-4 (standard weights) agrees
4H-SiC 3.211 g/cm³, Ioffe NSM (credited to Gomes de Mesquita 1967, a 6H paper), 300 K; half last digit 1.56e-4 Bauer 2001 via AFLOW: 3.08051 / 10.0848 Å, T not stated 3.21342 g/cm³ +7.525e-4 none (pinned regression, not an agreement claim) does not agree; gap

Caveats, so that nobody reads more into this than is there:

  • The GaN agreement is real but coarse. The only open measured GaN bulk density I found has two significant figures. The tolerance is that printed precision and was not widened. With the old Ioffe cell the GaN difference would have been −3.9e-4, so changing the cell is not what makes the test pass. The cell changed because Melnik is a primary, opened, bulk measurement with a temperature.
  • Against Thibault's 4-figure measured 6H density (3.218), the Bauer 6H cell is −1.44e-3 off, which is more than that figure's last digit. The 6H test still uses the Ioffe 3.21 (unchanged from Crystal step 19b: hexagonal lattices (wurtzite GaN, 4H/6H-SiC) (#179) #198). I recorded this in Open questions instead of switching sources.
  • No tolerance was widened and no constant was tuned. The approved criterion is unchanged. Closing [Epic #12] Crystal step 19b: hexagonal lattices (wurtzite GaN, 4H/6H-SiC) #179 needs a measured 4H-SiC bulk density, with its temperature, that I could open, or fresh approval to change the criterion.

What remains for #179

  • A measured 4H-SiC bulk density (pycnometric or hydrostatic, with temperature and precision). What I searched on 2026-10-10:
    • OpenAlex searches for pycnometric, hydrostatic and Brillouin-scattering work on 4H-SiC.
    • Thibault 1944 (opened; no 4H measurement).
    • Stockmeier et al., J. Appl. Phys. 105, 033511 (2009) (closed), and Stockmeier's 2008 FAU dissertation (the repository serves a bot-check page).
    • Gomes de Mesquita 1967 (closed; titled as a 6H paper).
  • Optional: a GaN density with more than two figures would tighten the GaN check.
  • Not in scope here but still open: a measured GaN u (the preset keeps the documented equal-bond placeholder, now about 0.3761 for the new a, c).

Unchanged invariants

  • Channel directions are still checked to 1e-12 (channel_directions_to_1e_12). The stacking period is still checked by counting layers per c (stacking_period_from_layers_per_c, search_along_c_counts_the_layers). Cubic search regression coverage (crystal_search) is untouched.
  • Data-only change to one preset. The engine, the amorphous transport and the determinism tests are untouched.
  • No Tier B/C code was consulted and no SRIM data was used. The COD records are public-domain database entries citing their papers.

Verification (worktree target dir target/wt/issue-179, -j 2)

  • cargo test -p lindhard --test crystal_hex -- --nocapture: 13 passed (output above).
  • cargo fmt --all -- --check: clean.
  • cargo clippy -j 2 --workspace --all-targets -- -D warnings: clean (local toolchain, not the CI pin).
  • cargo test -j 2 --workspace -- --test-threads=2: 55 test binaries, 805 passed, 0 failed, 18 ignored.
  • RUSTDOCFLAGS="-D warnings" cargo doc -j 2 -p lindhard --no-deps: clean.

🤖 Generated with Claude Code

loom dashboard

…179)

GaN: the preset now uses the strain-free annealed bulk crystal of Melnik
et al., MRS Internet J. Nitride Semicond. Res. 2, 39 (1997), Table 1
(a = 3.1890 A, c = 5.18500 A at 300 K, stated accuracy 5e-5 / 2e-5 A),
an opened primary, replacing the Ioffe values credited to a thin-film
paper. GAN_DENSITY_G_CM3 is now the measured 6.1 g/cm3 of Juza and Hahn
(1938) as recorded in COD 1010168 (primary closed). The number-density
test agrees within that figure's printed precision (-1.74e-3 against
8.3e-3). The old Ioffe 6.15 equals the X-ray density of the 1938 cell
(COD 9008868), which explains its earlier mismatch.

4H-SiC: no measured 4H bulk density could be opened. Thibault, Am.
Mineral. 29, 327 (1944) (open) gives a 4H cell and a calculated density
only, and is recorded in the provenance row; the 4H offset stays pinned
as a gap and the criterion is not claimed for it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Loom-Story: #179
Loom-Trace-Id: 1a4812e20b098de7332cf09f21dc6b60
Loom-Build: 0.19.1009 8889f7bd1eccfb4bc8239e7f5669b65f9815c30e clean
@loom-fleet-dispatch loom-fleet-dispatch Bot added loom:review-requested PR ready for Judge to review. Applied by: Builder when opening PR. loom:reviewing Judge is reviewing this PR. Applied by: Judge only. Stale after LOOM_STALE_REVIEWING_MINUTES (30m). labels Oct 10, 2026
@loom-fleet-dispatch

loom-fleet-dispatch Bot commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor Author

Judge pass: still carries a fresh loom:reviewing claim (claimed 2026-10-10T17:08:52Z, idle 18m) — standing down without reclaiming. Not stomping.

Stand-down passes against this claim: 5 of 3 (streak cap met); claim age 18m of 30m (age floor NOT met). The bounded fallback force-reclaims only once BOTH are met (#9927). This comment is edited in place on each pass rather than reposted (#5123, #6514).

@loom-fleet-dispatch

Copy link
Copy Markdown
Contributor Author

Judge review: APPROVED

I reviewed this at head ce05aa6, at the PR's request. CI: 22 checks pass, 3 skipped (release and deploy jobs). Merge state: CLEAN.

I opened the sources myself

  • Melnik et al. 1997 (fetched from Cambridge Core): the SHA-256 matches the provenance row (ccae2c25…). Section 3.2 says "measurement accuracy was 0.00005 Å for a lattice constant and 0.00002 Å for c". After the 1100 K / 40 min N2 anneal it gives "c= 5.18500 Å, a= 3.1890 Å" on both the N face and the Ga face. Table 1 ("measured at 300 K") has the row "Annealed bulk GaN crystal grown by HVPE: 3.1890 / 5.18500". The quotes and page references are accurate.
  • COD 1010168: the SHA-256 matches (3344d12e…). It has _exptl_crystal_density_meas 6.1, cell 3.180(4) / 5.166(5), doi 10.1002/zaac.19382390307, and no temperature field.
  • COD 9008868: the SHA-256 matches (7606ee5c…). It has _exptl_crystal_density_diffrn 6.146 for the same cell. I recomputed it: 2·M(GaN) / (√3/2·a²c·N_A) = 6.146. So the explanation that the old Ioffe 6.15 is the 1938 X-ray density holds up, and the row correctly marks it as an inference.
  • Thibault 1944 (minsocam): the SHA-256 matches (353fb75c…). I confirmed: "Calculated density of all α-SiC types: 3.217; observed density, type II: 3.218". p. 341 says "d at 30°/4° C. = 3.218, using a 5 cc. pycnometer and xylene". The type III row in Table 25 is 3.073 / 10.053 with no observed density. The PR is right that this gives no measured 4H density.

Tolerances and tests

  • GaN tolerance of 8.3e-3: half a unit of the printed 6.1 is 8.197e-3. The cell accuracy adds 2·5e-5/3.189 + 2e-5/5.185 ≈ 3.5e-5. The standard-weight intervals add about 2e-5. The total is about 8.25e-3, below 8.3e-3. It is the printed precision, built the same way as the 6H tolerance, and was not widened to make the test pass. The value found, −1.744e-3, is well inside it. The counterfactual is also correct: the old cell with 6.1 gives −3.9e-4. So the new cell is not what makes the test pass.
  • The 4H pin (+7.52e-4, ±5e-6) is unchanged, and the docs still label it as not an agreement test. Using Part of #179 is the honest choice.
  • channel_directions_to_1e_12, the stacking-period tests and the brute-force search test are all unchanged. The engine and the determinism tests are not touched. The only users of the GaN preset are lattice.rs and crystal_hex.rs.
  • The placeholder u of about 0.3761 checks out: 1/4 + a²/(3c²) = 0.37609.
  • Locally (worktree target dir, -j 2): cargo test -p lindhard --test crystal_hex passes 13/13, and the printed report matches the PR table exactly. cargo test -p lindhard --lib crystal passes 30/30.

Honesty, clean room and hygiene

  • The coarse two-figure GaN density is stated clearly in the constant's doc, the test doc, the provenance row and the Open questions. The −1.44e-3 gap between Thibault's 6H value and the Bauer cell is recorded rather than hidden or "fixed" by switching sources.
  • The sources are an open-access paper, public-domain COD records and a 1944 open journal article. No Tier B/C code, no SRIM data. The clean-room CI check passes. No downstream-application text.
  • The CHANGELOG entry is under Unreleased → Changed, which is right because the GaN preset values are public API.

Non-blocking nits (follow-up optional)

  1. The provenance row's Category column still says "read from secondary compilations". The GaN cell is now a primary measurement, so something like "primary (GaN cell) and secondary compilations" would be more precise.
  2. The Juza & Hahn density is called the "measured GaN bulk density" in a few places. The primary was not opened, and a 1938 measurement may well have been on powder. "Measured (pycnometric/unspecified) density" would avoid claiming more than the COD record says. This only matters for wording; the tolerance is unaffected.

Approving and applying loom:pr.

loom dashboard

@loom-fleet-dispatch loom-fleet-dispatch Bot added loom:pr PR approved by Judge, ready for Champion auto-merge. Applied by: Judge. and removed loom:review-requested PR ready for Judge to review. Applied by: Builder when opening PR. loom:reviewing Judge is reviewing this PR. Applied by: Judge only. Stale after LOOM_STALE_REVIEWING_MINUTES (30m). labels Oct 10, 2026
@loom-fleet-dispatch
loom-fleet-dispatch Bot merged commit ff2511c into main Oct 10, 2026
25 checks passed
@loom-fleet-dispatch
loom-fleet-dispatch Bot deleted the feature/issue-179 branch October 10, 2026 17:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

loom:pr PR approved by Judge, ready for Champion auto-merge. Applied by: Judge.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants