Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ __pycache__/
neutron/data/
neutron/work/
photon/cache/
ampoule/work/
20 changes: 18 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ Every component except one is either routine nuclear physics or recently demonst
| [simulator/](simulator/) | the digital twin: a Tier 1 machine run decay by decay, validated against exact enumeration, with decays per sample and energy per sample measured |
| [neutron/](neutron/) | the keystone at reactor scale, computed: the two region subcritical gate in OpenMC with the official ENDF/B-VIII.0 library, calibrated against three ICSBEP handbook criticals; gain, the fission matrix and its eigenvalue check, transfer curves under two absorbers, the truth tables, the superposition check, level restoration spectra, the clock and gain bandwidth product, and the temperature coefficient that prices the veto |
| [photon/](photon/) | the photon keystone searched for in ENSDF: every gateway of every isomer that holds a bit for a second, in observed and allowed classes, with its release cascade; every level restoring coincidence within rotor reach and the areal density wall each one meets; every isomer with a signal gateway and a veto gateway; the NEEC class ranked |
| [ampoule/](ampoule/) | the sealed machine in real photon transport: the vessel of the build note in OpenMC with ENDF/B-VIII.0 photoatomic data and its own beta spectra, calibrated against XCOM and the thick target rule; the photon budget, site rates in plastic and in CsI, pile up, the collar's transfer curve, the 64 × 64 Green's function and what the septum does to it, the boundary count rate, the energy budget, and the dose outside |
| [transistor/](transistor/) | the reference transistor: one pinout at three scales, the valve, the datasheet with characteristic curves and maximum ratings; with four accompanying notes: [SEALED.md](transistor/SEALED.md) (the machine), [EMBODIMENT.md](transistor/EMBODIMENT.md) (the build, at assembly grade), [VALVE.md](transistor/VALVE.md) (the logic), [COMPONENTS.md](transistor/COMPONENTS.md) (the full inventory of a working computer, missing pieces simulated), [POWER.md](transistor/POWER.md) (the metabolism), and [SCALING.md](transistor/SCALING.md) (the trajectory) |

---
Expand Down Expand Up @@ -403,15 +404,30 @@ Two lines of the theory change as a result. The convertible class of Section 2 i

---

## The ampoule, transported

The sealed machine of the two notes above was a design at assembly grade whose every number, beyond the decay constants, was an assumption. [ampoule/](ampoule/) builds the vessel shell by shell in OpenMC with the official ENDF/B-VIII.0 photoatomic library, drives it with the beta spectra of its own ⁹⁰Sr/⁹⁰Y core through a thick target bremsstrahlung treatment, calibrates the instrument first (attenuation to 0.4 percent of NIST XCOM, slab transmission to 1.0 percent of the exponential, thick target yields within the rule's own tolerance), and replaces the assumptions with tallies.

- **The light is scarce and hard.** A gigabecquerel of each nuclide makes 0.0569 bremsstrahlung photons per decay, and its own pellet and capsule absorb the soft majority of them: **43.9 M/s** leave the core, at a mean energy of 252 keV, while the vessel deposits 183 µW against the ledger's 181 µW per GBq. Everything the compute shell, the boundary and the shield do, they do with that.
- **The budget closes only where the cells are dense.** The boundary ring counts **3.25 M/s**, 7% of the photons leaving the core but 0.33× the note's 10⁷ per second, so the precision law gives 50 eight bit reads per second where the note priced 153. The 64 sites, as 2 mm plastic cells, see 32.9 k/s of interactions together, 0.033× the proposal budget the sampler was priced at; the same cells in CsI, the note's other option, see **1.02 M/s**, 31× more, which meets the budget. The build note is amended: the cells are CsI, and the mouth is a factor 3.0 narrower than it was priced.
- **The weights are small and the controls are knobs.** The Green's function between sites, measured 64 × 64, puts a nearest neighbour coupling at 3×10⁻⁵ per photon and the whole fan out of a site to its 63 neighbours at 0.1%: the fan out tax of theory Section 1.3 for a real shell, three orders below the compiler's toy fabric, and an attenuation of 3×10⁴ per hop. The tungsten collar, the reference transistor's GATE terminal, has an ON/OFF contrast of 6.34 with plastic cells and 11.94 with CsI, and the lead septum, the build note's inhibitory blocking, leaves the coupling it sits across at 0.49 of its open value against 1.00 on the unshielded side. Both are filters for a hard spectrum, not barriers: the same finding as the cadmium sheet of the neutron gate, for the same reason.
- **The wall is thinner than the spectrum.** 3.4 M/s escape the shield, 7.7% of what left the core at a mean 565 keV, and the ambient dose rate is **67.8 µSv/h** at the titanium wall and **0.261 µSv/h** at one metre (ICRP 116). The build note deferred this figure to the builder; it is now on the table, and it says a gigabecquerel ⁹⁰Sr ampoule behind 4 mm of lead is an instrument for a lead pot, which is the licence class the note already gave it.

![The ampoule in photon transport](figures/fig17_ampoule.svg)

The machine the theory can seal today is therefore a rate coded sampler whose photons are hard, whose weights are small, whose mouth is narrower than it was priced, and whose two mechanical controls are analog. Every one of those adjectives was an adjective; each is now a number, and the notes are corrected where the numbers say so.

---

## Open problems and how to contribute

1. **Keystone:** propose or measure a compact state meeting the leak condition with β>1 *in a level restoring or convertible class* (theory, Section 2). *This is problem number one.* A concrete, computable subproblem: search ENSDF for heterogeneous pairs of isomers whose cascade lines and gateway lines are mutually resonant (gate A's output pumps gate B and vice versa); the search space is already tabulated in `/gates`. The computed neutron gate ([neutron/](neutron/)) adds a second requirement that the photon sector had not been asked for: the state must also supply a *signal controlled inhibition*, because the only one the neutron sector has is heat and it is worth a fraction of the gain. A gate with gain but no inversion is a linear amplifier with a comparator bolted to its boundary, and the machine it builds is the Bernstein machine of Section 6 with better numbers, not a logic family.
2. Tighten the throughput law for fan out reuse: when is a count "spent"?
3. A learning rule: aperture update Δα ∝ coincidence(pre,post) is Hebbian or STDP using the *same* coincidence primitive as the AND gate (Appendix B.4); formalize and simulate.
4. Transport level 𝒢 for a real geometry that implements a target weight matrix (signed weights via complementary channels).
4. Transport level 𝒢 for a real geometry that implements a target weight matrix (signed weights via complementary channels). *The measurement half is done:* [ampoule/](ampoule/) has the 64 × 64 Green's function of the build note's compute shell, nearest neighbour weights of 3×10⁻⁵ per photon with 0.1% total fan out; what remains is to run the compiler of theory Section 11 on that geometry rather than on the toy fabric.
5. Tier 2: a concrete two qubit gate on nuclear spin or Mössbauer DOF with a room temperature error budget.
6. **The addressed long retention write.** The broadband route to self written memory is dead by a bandwidth ratio of 10¹⁸, and the narrowline route is now open in principle (nuclear lamps, radiogenic feeding, resonance addressing: theory Section 9); what remains is a state that is simultaneously *parent fed, gradient addressable, and long lived*. A concrete, computable search: scan the catalog in `/gates` for isomers with lifetime above seconds whose feeding parents emit Mössbauer class lines, and rank by the addressing sensitivity Γ/(dE/dB).
7. Measure realized bits per detected quantum for a pixelated spectroscopic boundary against the log_2(N_E N_x N_τ) ceiling of the boundary theory.
7. Measure realized bits per detected quantum for a pixelated spectroscopic boundary against the log_2(N_E N_x N_τ) ceiling of the boundary theory. The boundary's raw budget is now computed, 3.25 M/s detected in the build note's ring, 0.33× what it was priced at ([ampoule/](ampoule/)); the ceiling is still to be measured against it.

Open an Issue stating the claim and the test; pair every Pull Request with the Issue it closes.

Expand Down
61 changes: 61 additions & 0 deletions ampoule/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# /ampoule: the sealed machine in real photon transport

The ampoule of [transistor/SEALED.md](../transistor/SEALED.md) is the one machine the theory says it can seal today, and [transistor/EMBODIMENT.md](../transistor/EMBODIMENT.md) specifies it at assembly grade. Every number in those two notes that is not a decay constant was an assumption: the photons a gigabecquerel of ⁹⁰Sr/⁹⁰Y actually sends into the compute shell, the rate at which the boundary counts them, the pile up in a 2 mm site, the coupling between sites through a real glass plate, what a tungsten aperture and a lead septum actually do to a hard bremsstrahlung spectrum, and the dose outside a wall the build note said the builder must certify. This directory builds the vessel in OpenMC with the official ENDF/B-VIII.0 photoatomic library, drives it with the beta spectra of its own core, calibrates the instrument first, and replaces every one of those assumptions with a tally.

| file | what it is |
|---|---|
| [`beta.py`](beta.py) | the ⁹⁰Sr and ⁹⁰Y beta spectra (unique first forbidden shape, Fermi function), checked against the ICRP 107 mean energies |
| [`calibrate.py`](calibrate.py) | the instrument against references that are not OpenMC: attenuation against NIST XCOM, slab transmission against the exponential, thick target bremsstrahlung against the textbook rule; writes `calibration.json` |
| [`model.py`](model.py) | the vessel, shell by shell, its sources and tallies, and the stages below; writes `tallies.json` (needs OpenMC and the data) |
| [`report.py`](report.py) | every derived number, `results.md`, and figure 17, from the two JSON files (numpy and matplotlib only) |
| [`results.md`](results.md) | the numbers, regenerated by `report.py` |
| `tallies.json`, `calibration.json` | the committed run, with uncertainties |

## The vessel as built

Nested cylinders on one axis, dimensions from the build note where it gives them and stated where it does not:

- **core**: an 8 mm × 10 mm SrTiO₃ pellet in a 1 mm 316L capsule at the centre of a 30 mm × 40 mm krypton cell at 5 bar with 2 mm aluminium walls;
- **collar**: a 2 mm tungsten sleeve around the lamp cell with one opening per site, ±10° by 6 mm at nominal, the mechanical GATE terminal of the reference transistor;
- **compute shell**: borosilicate glass from 19 to 25 mm radius carrying 64 sites, 2 mm scintillator cells on a lattice of 8 heights by 8 azimuths at 22 mm radius, plastic throughout and CsI in one variant run (the build note offers either), with an optional 1 mm lead septum between two sectors, the build note's inhibitory blocking;
- **boundary**: a 6 mm plastic scintillator ring with end caps (the 24 SiPM paddles), 1 mm of silicon behind it, and four 5 mm CZT pixels in the ring;
- **shield**: 8 mm PMMA, 4 mm lead, 3 mm titanium, outer radius 4.9 cm and half length 6.6 cm, then air to a metre.

The betas are handled by OpenMC's thick target bremsstrahlung treatment: an electron born in the pellet deposits its energy there and emits the bremsstrahlung a thick target of that material would. For a ceramic pellet whose radius exceeds the range of most of the spectrum this is the right approximation and it is stated wherever a number descends from it.

## The stages

1. **Calibration.** The library's total attenuation for lead, iron, tungsten and water at 100 keV to 2 MeV against NIST XCOM; uncollided transmission through slabs of up to three mean free paths against exp(−μx); the energy an electron radiates stopping in water and iron at 0.5, 1 and 2 MeV against the thick target rule. The last is the source term of everything and the least certain link, and the report says so.
2. **The source.** An emission stage first: the betas at their real activities in the pellet ceramic, and the bremsstrahlung they make, per second. Then the nominal vessel driven by that spectrum: photons leaving the capsule, the field in every site, the boundary counts and their spectra, the energy deposited in every cell, the dose in air at contact, ten centimetres and a metre, and the leakage through the shield. The same stage is run once more with CsI cells in place of plastic.
3. **The gate.** The collar opening at 0, 25, 50, 75 and 100 percent of nominal: the transfer curve.
4. **The septum.** The nominal vessel with the lead sheet in place.
5. **The synapse.** Photons born in each site in turn, with the spectrum the source stage found there, tallied in every site: the 64 × 64 Green's function, open and with the septum.

## What came out

| what | assumed in the notes | computed | where it lands |
|---|---|---|---|
| photons leaving the core | not given | 43.9 M/s, mean 252 keV, 0.0569 per decay | the whole budget, a few percent of the beta energy |
| deposited power | 181 µW per GBq | 183 µW for the pair | the ledger holds |
| site interactions, all 64 | proposal budget 10⁶/s | 32.9 k/s in plastic, 1.02 M/s in CsI | plastic is 30× short; CsI meets the budget |
| pile up per site | n ≳ λ τ_d | 0.16 percent of events overlap at 100 ns in CsI | the floor plan holds |
| accidental coincidences, two mean sites | the coincidence multiplier's raw material | 51 /s in CsI (0.2 four bit readings per second) | enough for a slow four bit AND gate |
| boundary events | 10⁷/s at percent level collection | 3.25 M/s, from 7% of core photons | 0.33× the assumption; 50 eight bit reads per second, not 153 |
| collar contrast | the GATE terminal | 6.34 in plastic, 11.94 in CsI | a knob, not a switch |
| synapse weights | written by geometry | nearest neighbour 3×10⁻⁵, fan out 0.1% | the fan out tax, three orders below the toy fabric |
| septum blocking | inhibitory | coupling left at 0.49 (unshielded side 1.00) | a filter, not a wall |
| dose | to be certified | 67.8 µSv/h at the wall, 0.261 µSv/h at 1 m; 7.7% of core photons escape | a lead pot instrument, as the licence class said |

The design's power ledger holds; its proposal budget holds only with CsI cells; its boundary budget is a factor 3.0 optimistic; its two mechanical controls are analog because its light is hard; and its wall is a filter for the same reason. The ampoule is a rate coded sampler with small weights and a narrower mouth than it was priced with, and each of those words is now a number.

## Running it

```
python3 calibrate.py # a minute
python3 model.py # about ten minutes on a laptop; --quick for a tenth of the particles
python3 report.py # seconds; numpy and matplotlib only
```

Requires OpenMC 0.16 and the data that [`neutron/data.py`](../neutron/data.py) fetches, which now includes the photoatomic files and the natural isotopes of every element in the vessel.

*The theory's sealed machine was a design; it is now a transport calculation, and the calculation says what the design could not: how many photons there are, where they go, how much of each site's traffic is another site's, what the two mechanical controls are worth, and what the wall lets through.*
72 changes: 72 additions & 0 deletions ampoule/beta.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#!/usr/bin/env python3
# Copyright 2026 Max Freedom Pollard
# SPDX-License-Identifier: Apache-2.0
"""
The beta spectra of the ampoule's core, ⁹⁰Sr and its daughter ⁹⁰Y, from the
Fermi theory with the shape factor both decays require.

Both are unique first forbidden transitions (0⁺ → 2⁻ and 2⁻ → 0⁺), whose
spectrum is the allowed one times the shape factor p² + q² (electron and
neutrino momenta). The Fermi function is the standard nonrelativistic
Coulomb correction with the relativistic exponent, adequate here to about
a percent, which is far below what the bremsstrahlung yield needs. The
check is the mean energy: the tabulated values are 195.8 keV for ⁹⁰Sr and
933.6 keV for ⁹⁰Y (ICRP 107), and the spectra built here must reproduce
them.

Used by model.py as tabular source distributions; run directly to print
the check.
"""
import math

import numpy as np

ME_KEV = 510.99895 # electron rest energy, keV
ALPHA = 1.0 / 137.035999 # fine structure constant

# endpoint kinetic energy (keV), daughter Z, tabulated mean (keV, ICRP 107)
BRANCHES = {
"90Sr": dict(Q=546.0, Z=39, mean_ref=195.8),
"90Y": dict(Q=2280.1, Z=40, mean_ref=933.6),
}


def fermi_simple(Z, T):
"""The nonrelativistic Fermi function 2πη/(1 − e^(−2πη)) with a first
order relativistic correction (p/W)^(2(γ−1)); accurate to a percent for
Z near 40, which is all the yield calculation can use."""
W = 1.0 + T / ME_KEV
p = math.sqrt(W * W - 1.0)
eta = ALPHA * Z * W / p
gamma = math.sqrt(1.0 - (ALPHA * Z) ** 2)
f = 2.0 * math.pi * eta / (1.0 - math.exp(-2.0 * math.pi * eta))
return f * (2.0 * p) ** (2.0 * (gamma - 1.0))


def spectrum(name, n=400):
"""Kinetic energy grid (keV) and normalised probability per bin for the
named branch, on a linear grid from 0 to the endpoint."""
b = BRANCHES[name]
Q, Z = b["Q"], b["Z"]
T = np.linspace(0.0, Q, n + 1)
Tm = 0.5 * (T[1:] + T[:-1])
W = 1.0 + Tm / ME_KEV
p = np.sqrt(W * W - 1.0) # electron momentum, m_e c
q = (Q - Tm) / ME_KEV # neutrino momentum, m_e c
F = np.array([fermi_simple(Z, t) for t in Tm])
shape = p * p + q * q # unique first forbidden
N = F * p * W * q * q * shape
N /= N.sum()
return T, Tm, N


def mean_energy(name):
T, Tm, N = spectrum(name)
return float((Tm * N).sum())


if __name__ == "__main__":
for name, b in BRANCHES.items():
m = mean_energy(name)
print(f"{name}: endpoint {b['Q']:.1f} keV, mean {m:.1f} keV, tabulated {b['mean_ref']:.1f} keV, "
f"difference {100*(m/b['mean_ref']-1):+.2f} percent")
Loading
Loading