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.

SolverMethodBest 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.

  1. 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.
  2. 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.

4321.510.70.50.350.25detector ball radius [cm], log scale — shrinking →Adjoint response0.0390.0450.0510.057point detector, 0.0403 ±0.6% (independent of radius)Volume ÷ point0.911.11.21.31.41.51.3970.9999 ± 0.0079point detector (adjoint born at a point)volume detector (adjoint born throughout the ball)
radius [cm]volumepointratio
45.6298e-024.0310e-021.3966 ± 0.0102
34.8809e-024.0310e-021.2108 ± 0.0091
24.4546e-024.0310e-021.1051 ± 0.0085
1.54.2011e-024.0310e-021.0422 ± 0.0081
14.1263e-024.0310e-021.0236 ± 0.0080
0.74.1038e-024.0310e-021.0181 ± 0.0080
0.54.1311e-024.0310e-021.0248 ± 0.0080
0.354.0450e-024.0310e-021.0035 ± 0.0079
0.254.0306e-024.0310e-020.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.

AP9 trapped protons0.9811.021.041.061.081.1= Geant41251020aluminium shield depth [mm], log scaledirect adjoint (one step)surface-coupled (two step)AE9 trapped electrons0.50.7511.251.5= Geant40.512358aluminium shield depth [mm], log scaledirect adjoint (one step)surface-coupled (two step)

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
PHITS0.9562 ± 0.0047
SRTC surface-coupled0.9508 ± 0.0011
SRTC / PHITS0.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:

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

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.

ComparisonCaseSRTC / 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.

AP9 trapped protons — dose vs depthAP9 trapped protons — dose vs depth1101000.1110Aluminium shield depth (mm)Dose in silicon (rad/day)SRTC 1DSRTC 3DGeant4Shield2Dose
AE9 trapped electrons — dose vs depthAE9 trapped electrons — dose vs depth0.11101000.010.1110100100010000Aluminium shield depth (mm)Dose in silicon (rad/day)SRTC 1DSRTC 3DGeant4Shield2Dose

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.

Protons at 1 g/cm² AlProtons at 1 g/cm² Al1e-30.010.11101001000100001101001000100001e51e6Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4
Neutrons at 1 g/cm² AlNeutrons at 1 g/cm² Al0.11101001000101001000100001e5Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4
Electrons at 1 g/cm² AlElectrons at 1 g/cm² Al1e-30.010.11101000100001e51e61e71e81e9Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4
Photons at 1 g/cm² AlPhotons at 1 g/cm² Al1e-30.010.11101e51e61e71e81e91e101e11Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4
Protons at 10 g/cm² AlProtons at 10 g/cm² Al1e-30.010.11101001000100000.11101001000100001e5Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4
Neutrons at 10 g/cm² AlNeutrons at 10 g/cm² Al1e-30.010.111010010001101001000100001e51e6Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4
Electrons at 10 g/cm² AlElectrons at 10 g/cm² Al1e-30.010.1110101001000100001e51e61e7Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4
Photons at 10 g/cm² AlPhotons at 10 g/cm² Al0.010.11101e51e61e71e81e91e101e11Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DSRTC 3DGeant4

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.

00.511.52= Geant4110polyethylenealuminiumironcoppertungstenShield areal depth (g/cm²)SRTC / Geant4AP9 trapped protons — SRTC 1D forward ÷ Geant4
00.511.52= Geant4110polyethylenealuminiumironcoppertungstenShield areal depth (g/cm²)SRTC / Geant4AP9 trapped protons — SRTC 3D adjoint ÷ Geant4
00.511.52= Geant41polyethylenealuminiumironcoppertungstenShield areal depth (g/cm²)SRTC / Geant4AE9 trapped electrons — SRTC 1D forward ÷ Geant4
00.511.52= Geant41polyethylenealuminiumironcoppertungstenShield areal depth (g/cm²)SRTC / Geant4AE9 trapped electrons — SRTC 3D adjoint ÷ Geant4

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.

speciesPHITSSRTC 3D forwardSRTC / PHITSshare of SRTC dose
proton0.45560.45781.00599.9 %
neutron0.01120.0099750.8910.0 %
photon0.023980.022580.9420.0 %
electron0.00053050.00042920.8090.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.

speciesPHITSSRTC 3D forwardSRTC / PHITSshare of SRTC dose
proton0.0014340.00047880.3344.6 %
neutron0.22110.18890.85595.2 %
photon0.034650.0053580.1550.1 %
electron0.00050659.37e-050.1850.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.

Protons at 1 g/cm² Al — vs OLTARISProtons at 1 g/cm² Al — vs OLTARIS0.010.11101001000100000.010.1110100100010000Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DOLTARIS
Protons at 10 g/cm² Al — vs OLTARISProtons at 10 g/cm² Al — vs OLTARIS0.010.11101001000100001e-30.010.11101001000Energy (MeV)Flux (1/cm²/MeV/day)SRTC 1DOLTARIS

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:

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.