Physics & methods
How SRTC transports the space radiation environment through shielding, where its cross sections come from, and how well it currently agrees with established codes.
Three transport solvers
Space shielding problems do not have one right numerical method. A quick areal-density trade study, a detailed 3D CAD model, and a deep-shield dose point each want something different, so SRTC carries three transport methods that share the same material and source definitions.
| Solver | Method | Best for |
|---|---|---|
| 1D forward Monte Carlo | Continuous-energy transport in areal depth (g/cm²): CSDA charged-particle slowing-down with energy-loss straggling, plus discrete sampled nuclear reaction channels and a full secondary stack. | Slab and sphere-equivalent trade studies; dose-versus-depth curves; transmitted spectra. |
| 3D forward Monte Carlo | Constructive-solid-geometry transport on a coupled electron / photon / hadron / neutron multigroup library, following particles from the environment boundary inward. | Real spacecraft geometry and imported CAD; fluence and dose maps. |
| 3D adjoint Monte Carlo | The same geometry and library run on the transposed transfer operator, sourced from the detector response. | Dose at a small detector buried deep inside the spacecraft. |
Forward and adjoint
Forward transport starts particles at the environment boundary and follows them until they die, scoring whatever happens to reach the detector. For a small part buried inside a spacecraft that is enormously wasteful — the overwhelming majority of histories never contribute.
Adjoint transport runs the problem backwards. It starts from the detector response and propagates importance outward to the boundary, where it is folded against the environment spectrum. Every history contributes, so a deep, small detector becomes tractable.
SRTC's adjoint transfer operator is the exact transpose of its forward operator, built from the same multigroup matrices. That is not just an implementation convenience: it makes forward–adjoint reciprocity a property that can be tested numerically, and SRTC's regression suite does exactly that.
Surface coupling: both directions in one run
Neither direction alone gives the whole answer for a part buried in structure. Adjoint gets you a dose cheaply but not the spectrum inside the part; forward gives you the spectrum but spends almost every history somewhere else. SRTC's surface-coupled solver runs one leg of each, and you pick one thing — the volume to score in.
- Adjoint, outward. Particles leave the scoring volume's own surface for the world sphere, where they are folded against the environment and normalised. That yields the flux arriving at the surface, with its energy and direction distributions — computed with one pass over the geometry outside the part, rather than by transporting the whole environment inward and keeping the small fraction that arrives. The result is cached, so many interior analyses can share one boundary flux.
- Forward, inward. That distribution is transported back through the volume, tallying track-length flux and dose — giving the spectrum inside the part, not just a scalar.
Protons, neutrons, photons and electrons transport together, and every loaded environment runs in the same pass. That last point is not only convenience: a merged run also captures the cross-species channel — a proton-born adjoint history that converts to an electron and scores against the electron environment — which running one species at a time and adding the results discards.
The coupling is pinned against closed forms rather than against another Monte Carlo estimator, which is the only way to catch an error that scales everything equally: a Lambertian sphere of radius R carrying current I must produce a uniform interior field of exactly I/(πR²), and in vacuum an isotropic environment J across area A must be collected as A·J/4. On top of those, the answer must not depend on where the coupling surface is placed.
Volume and point detectors converge
A volume detector averages the adjoint response over its region; a point detector evaluates it at a point. Shrink the region onto that point and the two must agree — whatever the cross sections are. That makes this a check on the estimator rather than on the physics, and it is the anchor for the surface-coupled solver, whose adjoint source fills the scoring volume.
The detector ball is the same material as the shield around it, so shrinking it changes only which volume the tally averages over and never the transport. The excess over the point value falls from 40% at 4 cm to 0.01% at 0.25 cm, inside the Monte-Carlo error. Error bars are ±1 SEM.
| radius [cm] | volume | point | ratio |
|---|---|---|---|
| 4 | 5.6298e-02 | 4.0310e-02 | 1.3966 ± 0.0102 |
| 3 | 4.8809e-02 | 4.0310e-02 | 1.2108 ± 0.0091 |
| 2 | 4.4546e-02 | 4.0310e-02 | 1.1051 ± 0.0085 |
| 1.5 | 4.2011e-02 | 4.0310e-02 | 1.0422 ± 0.0081 |
| 1 | 4.1263e-02 | 4.0310e-02 | 1.0236 ± 0.0080 |
| 0.7 | 4.1038e-02 | 4.0310e-02 | 1.0181 ± 0.0080 |
| 0.5 | 4.1311e-02 | 4.0310e-02 | 1.0248 ± 0.0080 |
| 0.35 | 4.0450e-02 | 4.0310e-02 | 1.0035 ± 0.0079 |
| 0.25 | 4.0306e-02 | 4.0310e-02 | 0.9999 ± 0.0079 |
Against Geant4
Convergence and closed forms establish that the solver is consistent with itself and with analytically known limits. Neither can catch a shared misunderstanding of the physics, because both are computed by the same code. These are absolute dose comparisons against the committed Geant4 11.4 sphere references — same geometry, same IRENE environment, both in rad/day.
Two SRTC curves, not one. The direct adjoint shares no coupling machinery, so plotting both separates “the coupling is wrong” from “the physics for this species is wrong” — a ratio to Geant4 alone cannot. For protons the two track each other within 1–4%. For electrons they move together, so the depth trend is SRTC’s known electron gap rather than the coupling.
Regenerate: python3 scripts/compare_surface_coupled.py (needs the physics library; the Geant4 references are committed, so Geant4 itself does not need re-running).
Against PHITS
A second external code, on the same sphere geometry with an isotropic AP9 proton field. This one is compared as a ratio — each code run twice, with the aluminium shell and with it replaced by void — so each side’s source normalisation cancels rather than being reconciled. Reconciling normalisation across codes is where a comparison like this goes wrong quietly, and this solver has already lost two bugs to exactly that.
| Al / void dose ratio | |
|---|---|
| PHITS | 0.9562 ± 0.0047 |
| SRTC surface-coupled | 0.9508 ± 0.0011 |
| SRTC / PHITS | 0.9943 |
The ratio is not a formality. The shell moves the dose by a few percent in a direction that depends on the spectrum — for a monoenergetic 100 MeV beam it raises the dose 20%, because the protons arrive slowed and deposit more per unit path — so it is not something a merely attenuating transport would reproduce.
Spectrum truncated below 50 MeV identically on both sides: a proton needs ~2.7 g/cm² to cross the shell, so the flux below that cannot reach the detector and only costs PHITS histories. Decks, tallies and the driver are in tests/comparisons/surface_coupled_phits/.
Regenerate: cargo test --release --features geometry_3d --test adjoint_surface_coupling -- --ignored diag_volume_point_convergence_curve, then python3 scripts/make_convergence_plot.py.
Nuclear and atomic data
SRTC does not ship hand-tuned fit coefficients. Cross sections are synthesised at build time from evaluated data and standard reference tables into HDF5 libraries that the solvers read at runtime:
- JENDL-5 (and optionally ENDF/B-VIII.1, JEFF-4.0, TENDL-2025) for nuclear reaction cross sections and secondary distributions.
- NIST PSTAR / ESTAR for proton and electron stopping power.
- NIST XCOM for photon interaction cross sections.
- ENDF MF26/MT527 Seltzer–Berger bremsstrahlung spectra.
Mixtures use Bragg additivity, so any material — a compendium alloy, a composite, or one you define by element fractions — gets consistent stopping power and multigroup cross sections. Every generated library carries a digest of the cross-section sources it was built from, and the solver refuses to run against a library that does not match the code reading it.
Energy group structure
Space spectra span keV to GeV, so the multigroup meshes are log-spaced by default and defined per particle block — typically ~100 hadron groups over 1 MeV–2 GeV and ~200 electron and photon groups from 1 keV, all user-configurable per run.
Geometry
3D runs use an MCNP-subset constructive solid geometry: planes, spheres, cylinders, cones, tori and box macrobodies combined by intersection, union and complement, with material and importance assignment per cell.
Mechanical models come in directly — STEP CAD import tessellates assemblies (including instanced sub-assemblies and their transform chains) into triangle meshes that participate in transport as ordinary geometry, accelerated by a bounding-volume hierarchy.
Secondary physics
- Bremsstrahlung from Seltzer–Berger spectra, with discrete radiative-loss straggling — the dominant deep-dose channel behind thick shields for trapped electrons.
- Nuclear reactions: sampled channels with secondary protons and neutrons, including proton→neutron production and the neutron return channel.
- δ-rays (Møller knock-on electrons), available as an option.
- Heavy ions: GCR transport with silicon LET spectra for single-event-effect work.
- Displacement damage: NIEL for protons and electrons in any material, combining Coulomb elastic scattering with a JENDL MF6 nuclear term, for total non-ionising dose.
Validation status
SRTC is benchmarked against NASA OLTARIS, Shield2Dose, Geant4 and PHITS. The figures below are ratios of SRTC to the reference code, measured from committed reference curves that the regression suite asserts against on every change, so they cannot silently drift.
| Comparison | Case | SRTC / reference |
|---|---|---|
| Shield2Dose (IRENE AP9/AE9, 350 km × 53°) | Proton dose vs aluminium depth, 0.5–10 mm | 0.86 – 0.97 |
| Shield2Dose | Electron dose vs aluminium depth, 1–2 mm | 1.01 – 1.07 |
| Geant4 forward slab | 100 MeV proton pencil beam, silicon energy deposition, 1–30 mm Al | 0.99 – 1.05 |
| Geant4 adjoint sphere | AE9 electron dose in central silicon, solid Al sphere, 0.54 / 1.35 g/cm² | 1.01 / 0.69 (point detector) |
| Geant4 adjoint sphere | Same, shield material at matched areal depth: Fe / Cu / W at 0.54 g/cm² | 0.77 / 0.56 / 0.38 |
| Geant4 forward sphere | AE9 electron dose vs aluminium depth, 0.5–5 mm | 0.95 → 0.47 with depth |
| OLTARIS | Secondary fast-neutron flux (> 1 MeV), iron spheres 1–500 mm | 0.71 – 0.99 |
| OLTARIS heavy ions (GCR) | Transmitted helium, Al slabs and Fe / W spheres to ~39 g/cm² | 0.95 – 1.05 |
| OLTARIS heavy ions (GCR) | Transmitted 56Fe, same shields — over-predicts with depth | 1.00 shallow → 1.56 at 39 g/cm² |
Detector convention changes these numbers, so it is stated with them. SRTC scores dose on a point detector with a thin-detector response (dose ∝ dE/dx under charged-particle equilibrium), which is also the convention Shield2Dose uses. A finite volume detector is a different measurement: an electron that stops inside it deposits its whole energy instead of a dE/dx sample, and the dose is diluted by the volume's mass. On a 2 mm aluminium sphere, going from a point to a 1 mm silicon ball costs Geant4 a factor 2.45 and SRTC only 1.46 — so the same problem reads SRTC/Geant4 = 1.01 with a point detector and 1.70 with the ball. A ratio quoted without its detector convention is not a result. The figures above are all point-detector.
Dose vs depth
Silicon dose behind a solid aluminium sphere for the two trapped environments, with SRTC's 1D forward Monte Carlo and 3D adjoint solvers plotted against Geant4 and Shield2Dose on the same problem.
Transmitted spectra at 1 and 10 g/cm² aluminium
Differential flux behind the shield, against Geant4 in the same solid-sphere geometry and driven by the same IRENE environment. Protons and neutrons come from the AP9 proton environment; electrons and photons from AE9. The 3D adjoint solves for dose rather than flux, so its spectrum is recovered by dividing out the silicon dose response; that inversion is only meaningful where the response is appreciable, so the 3D series is drawn over the energies carrying at least 1% of the peak dose contribution rather than the full mesh.
Five shield materials, both solvers, against Geant4
Dose behind polyethylene, aluminium, iron, copper and tungsten, plotted as the ratio to Geant4 so the axis is "how far from the reference" rather than "how big is the dose". Same solid-sphere geometry and the same IRENE environment on both sides; the shields are compared at matched areal depth, which is why the physical thicknesses differ by 50×. A caret at the frame is a point off scale. Protons hold across the whole Z range on both solvers, with copper low in both at once — two independent transport paths agreeing with each other and departing from Geant4 together, which points at the data rather than at either solver. Electrons are where the two legs separate: the forward runs high in low-Z past the primary range and low in tungsten, the same bremsstrahlung chain with the sign following Z, while the adjoint carries its known deep-electron deficit. Both are tracked in the repository as pinned regressions with targets that flip when they close.
3D forward vs PHITS
The charts above test the 1D forward and 3D adjoint solvers. These test the 3D forward engine against PHITS 3.33 on identical geometry, both codes reporting cell flux per source particle so the numbers compare with no normalisation step. Every input file is listed so the comparison can be reproduced.
100 MeV proton → Al shell → Si sphere
Cell flux in the Si sphere by species, per source proton. Thin shell, so secondaries are made close to the detector.
| species | PHITS | SRTC 3D forward | SRTC / PHITS | share of SRTC dose |
|---|---|---|---|---|
| proton | 0.4556 | 0.4578 | 1.005 | 99.9 % |
| neutron | 0.0112 | 0.009975 | 0.891 | 0.0 % |
| photon | 0.02398 | 0.02258 | 0.942 | 0.0 % |
| electron | 0.0005305 | 0.0004292 | 0.809 | 0.0 % |
Files under tests/comparisons/forward3d_phits_species/ —
PHITS input proton_100mev.inp,
SRTC input srtc_match.toml + geom.mcnp,
comparison compare_species.py,
saved output results.txt.
100 MeV neutron → 10 cm Fe → Si sphere
Thick target (~4 mean free paths), so the (n,xn) cascade develops and the photon field is dominated by de-excitation γ from slowed neutrons.
| species | PHITS | SRTC 3D forward | SRTC / PHITS | share of SRTC dose |
|---|---|---|---|---|
| proton | 0.001434 | 0.0004788 | 0.334 | 4.6 % |
| neutron | 0.2211 | 0.1889 | 0.855 | 95.2 % |
| photon | 0.03465 | 0.005358 | 0.155 | 0.1 % |
| electron | 0.0005065 | 9.37e-05 | 0.185 | 0.1 % |
The last column is why the photon row is not the headline it looks like: photons carry 0.1% of the dose here, so a 6.5× deficit costs well under a percent of the answer, while the 15% neutron shortfall is nearly all of it. Scaling each species by its own ratio puts the total dose near 0.79 of PHITS. The photon row is still a sharp diagnostic — of a nuclear-data gap rather than a transport one: the n→γ yield comes from MF6 MT5, which only has coverage above ~20 MeV, and in a thick target most neutrons have slowed below that before interacting, where the de-excitation γ lives in the MF12/13/14/15 the pipeline does not yet read. Capture γ is a single hard-coded 7 MeV line.
Files under tests/comparisons/forward3d_phits_neutron/ —
PHITS input neutron_100mev.inp,
SRTC input srtc_match.toml + geom.mcnp,
comparison compare_species.py,
saved output results.txt.
Transmitted protons vs OLTARIS
Shown separately because OLTARIS uses a slab areal depth rather than a sphere, and its environment export sits about 24× below the IRENE one used above. Both differences are source and geometry conventions rather than transport, so this comparison runs SRTC in slab geometry driven by OLTARIS's own incident spectrum. OLTARIS publishes depth-resolved data for protons only.
Known limitations
These are open, documented gaps rather than surprises — each is pinned by a regression test at its current value so that it cannot get quietly worse. Most are limits on a flux or spectrum, which is not the same thing as a limit on dose: a species can be badly under-predicted and still carry a negligible share of the answer. The comparison tables above give the dose share alongside every ratio for exactly that reason, and where a dose impact is known it is stated below rather than left to inference:
- Very thin shields. Below roughly 0.5 mm aluminium, proton dose is under-predicted — about 0.6× at 0.1 mm.
- High-Z bremsstrahlung buildup. Electron dose behind tungsten is substantially under-predicted in the 1D forward solver; use SRTC's tungsten electron results qualitatively only.
- Deep electron dose in 3D adjoint. Under-predicts with depth relative to Geant4 — about 0.69 at 1.35 g/cm² aluminium and falling further past that. The deficit is in the reverse walk's arrival flux, and it shows up independently in how weakly the answer responds to detector thickness: too few arriving electrons are soft enough to stop inside a volume detector, so SRTC's arriving spectrum is too hard.
- Electron dose behind high-Z shields falls further short than behind aluminium — at matched areal depth, 0.77 in iron, 0.56 in copper and 0.38 in tungsten against the Geant4 adjoint where aluminium reads 1.01.
- Heavy-ion attenuation is too weak at depth. SRTC transports ions with stopping power and Tripathi/Kox attenuation and produces no fragments, so surviving primaries are over-predicted and the error compounds: transmitted 56Fe runs 1.56× OLTARIS through 39 g/cm² of iron. Helium stays within 5% at every depth in aluminium, iron and tungsten, but that is two errors of opposite sign cancelling — the too-weak attenuation pushing it up and the missing fragment source pushing it down — not a validated fragment model.
- Proton stopping in the 3D multigroup forward solver is an open discrepancy; prefer the 1D continuous-energy solver or the adjoint path for proton dose.
- Thin-geometry electron exit spectra. The transport-corrected multigroup model is diffusion-limited, so electron leakage from geometry thinner than an electron range is under-predicted. This is a model limitation, not a defect; bulk dose-versus-depth is unaffected.
- Secondary electrons behind thick shields. At 10 g/cm² the plot above shows SRTC's secondary-electron flux orders of magnitude below Geant4, while the photon field at the same depth agrees closely. Primary electrons are fully stopped by that depth, so this isolates the photon→electron secondary channel rather than the photon transport. Open, not yet root-caused — do not use SRTC deep secondary-electron spectra.
- Secondary neutron production runs about 1.5–3.7× above Geant4 in the sphere geometry at these depths, while the 1D fast-neutron integral sits below OLTARIS (0.71–0.99). The two references disagree in direction, so treat secondary-neutron magnitudes as uncertain to a factor of a few.
- Thermal neutrons are not resolved — there is no thermal group mesh.
Validation figures were last re-measured on 2026-08-31 and reflect the specific cases listed, not a general accuracy guarantee. They track development, so some are newer than the v0.1.4-beta bundle on the downloads page — where they differ, the figures here are the current ones and that release’s own notes describe what it shipped. Treat SRTC results as one input alongside an established code for any flight-hardware decision.