Plan
Plan: exact CLL + material-specific panels
How much work it would take to replace the vehicle-wide Sentman/Walker setting with a proper Cercignani–Lampis–Lord (CLL) gas–surface model, and to give each spacecraft part its own material. The material would then set that part's gas diffusion and reflection and its sunlight absorption, specular reflection and diffuse reflection. This is a plan only; no code was written.
Answer first
Minimum viable
≈ 9–14 working days (≈ 2–3 weeks)
Per-panel materials for SRP (solar + IR, transmission, thermal re-emission) and for the existing GSIs (Sentman / Walker-CLL with per-panel α). Material assignment from CAD parts. Regression-locked to v2.7.
Recommended (best without DSMC)
≈ 18–27 working days (≈ 4–5½ weeks)
Everything above, plus the exact CLL kernel via tabulated quadrature, atomic-oxygen surface coverage (so α depends on altitude and solar activity), and a per-panel temperature model feeding T_w and re-emission.
Full
≈ 22–33 working days (≈ 4½–7 weeks)
Everything above, plus self-shadowing and flow shielding for concave geometry such as the SolarCat petals and PCB. Retraining compute comes on top.
Estimates are for one developer who knows this codebase, working with AI assistance, and include tests and docs. The single biggest uncertainty is not the code but the material accommodation data (see Material data).
- The exact CLL plate integral reduces to a 1-D quadrature, because the CLL normal kernel is a Rice distribution with a closed-form mean. It matched the existing Walker fit to 0.02 % face-on and differed by up to 11 % at grazing incidence with α_N → 1.
- On the full 176-plate SolarCat, Walker and exact CLL agree within 0.3 % in C_D. The kernel choice matters little. The accommodation values matter a lot. Face-on C_D is 1.88 / 2.21 / 2.67 / 2.94 for α_N = 1 / 0.93 / 0.7 / 0.5. Edge-on C_D drops 32 % when σ_T goes 1 → 0.7.
- A direct quadrature costs about 14 µs per plate in numpy. It must be tabulated to stay inside the ≈ 1.2 ms/step budget used for RL.
Where things stand
| Area | Today (v2.7) | Target |
|---|---|---|
| Panel table | PanelSoA{n, A, c}; .geom has exactly 7 columns | + material id per plate (front/back faces are already separate plates) |
| GSI | vehicle-wide gsi, α_E | (α_N, σ_T), T_w = 300 K | per-material model + parameters; exact CLL option; coverage-dependent α; per-panel T_w |
| SRP | vehicle-wide (c_a, c_s, c_d), renormalised to 1; IR partition global | per-material solar (ρ_s, ρ_d, τ) and IR (ε, specular fraction); thermal re-emission |
| Geometry | simplifier merges by normal only; part identity lost | material survives simplification (per-body simplify, or tagging) |
| Occlusion | none | optional visibility maps for Sun and flow |
Physics to implement
1. Exact CLL plate coefficients (phase 3)
The CLL kernel factorises into a normal part and a tangential part (Cercignani & Lampis 1971; Lord 1991). Speeds are in wall thermal units \(c_w=\sqrt{2k_BT_w/m}\).
\(R_n\) is a Rice distribution with \(\nu=\sqrt{1-\alpha_n}\,w_i\) and \(\sigma^2=\alpha_n/2\), so the mean reflected normal speed has a closed form:
Averaging over the incident drifting Maxwellian (normal speed ratio \(u\), \(\gamma=s\cos\theta\), \(\tau_w=\sqrt{T_w/T_i}\)) gives the plate coefficients:
- Checks built into the maths. With α_n = 1, ⟨w_r⟩ = √π/2 and C_p reduces exactly to Sentman with α_E = 1. With α_n = 0 the reflection is specular in the normal direction, so C_p = 2C_{p,i}. With α_t = 0, C_τ = 0. The prototype reproduces the α = 1 identity to machine precision.
- Species independence of the table. G depends only on (γ, τ_w, α_n), not on the species mass. One 2-D table per distinct α_n serves all 7 species: evaluate at \(\gamma_j=s_j\cos\theta\) and mass-weight as in ADBSat eq. 15.
- Tabulation. γ ∈ [−6, 20] × τ_w ∈ [0.25, 1.25], about 512 × 48 nodes, with a cubic Hermite (store ∂G/∂γ). Build it at material load with 64-point Gauss–Legendre and scaled Bessel functions (
i0e/i1eequivalents; std::cyl_bessel_i needs scaling to avoid overflow). That is ≈ 1.5 M kernel evaluations, well under 0.5 s once per process. The target interpolation error is ≤ 1e-5 relative, to be verified by a test. - Name it separately, for example
gsi: cll_kernel. Keepcll(Walker) andsentmanfor regression and comparison.
2. Per-material gas–surface parameters (phase 2)
Each panel reads its GSI parameters from its material instead of SimParams. In sum_panels this is a gather by mat[i]. Walker prefactors are currently hoisted once per call; they become hoisted once per (material × species), which is still cheap with ≤ 8 materials.
3. Surface coverage by atomic oxygen (phase 4)
In LEO, adsorbed atomic oxygen covers most surfaces and makes them nearly diffuse regardless of the substrate. A material's "clean" behaviour shows only on the uncovered fraction. Use the Langmuir-isotherm approach of Pilinski et al. (SESAM) and Walker et al.:
- n_O comes from MSIS. It is already queried; χ_O·n_total needs to be passed through, which requires keeping the total number density.
- K is a fitted constant. Take it from Pilinski, Argrow, Palo & Bowman (2013) and document the value and units in code. It was not verified for this page.
- Effect: α becomes altitude- and solar-activity-dependent, as observed. Coverage is high below ~400 km and at solar max, and the material matters more at 500 km in solar minimum.
4. Per-material radiation pressure (phase 1)
Per face, the solar band has specular reflectance ρ_s, diffuse reflectance ρ_d and transmittance τ (thin films), with absorptance α_s = 1 − ρ_s − ρ_d − τ. The IR band has emissivity ε (= IR absorptance) and an IR specular fraction.
- This is the same law as today with (c_a, c_s, c_d) → (α_s, ρ_s, ρ_d) per panel, without the renormalisation to 1, so transmitted light exerts no force.
- The second term is steady-state thermal re-emission of a thin sheet with Lambertian front/back emission (McInnes 1999). A
reemissionmode per material covers the cases:thin_sheet(uses ε_f, ε_b),none(thick body, conducts internally), orthermal(phase 5, uses computed face temperatures: \(\tfrac{2}{3}\varepsilon\sigma T^4/c\) per face). - Earth IR uses ε and the IR specular fraction; albedo uses the solar-band values.
- The current vehicle-wide presets become materials (
al_mylar,black_kapton, …), so old configs map onto the new path one-to-one.
5. Panel temperature (phase 5, optional)
A one-node-per-face (or per face pair for thin sheets) energy balance. The inputs are absorbed Sun + albedo + Earth IR; the outputs are radiation from both faces and optional conduction to a structure node. It is integrated per substep with areal heat capacity from the material.
T feeds T_w in the GSI (it matters: C_{p,r} ∝ √T_w) and the re-emission force. Membranes respond in minutes, so the eclipse/sunlit cycling is captured.
6. Self-shadowing and flow shielding (phase 7, optional)
For each panel, precompute a visibility fraction over a direction grid (Fibonacci sphere, ~2–4 k directions) by ray-casting the full mesh (trimesh + embree, offline). At run time, look up the Sun direction (for SRP) and the flow direction (for aero, in the hyperthermal approximation) per panel. This is exact for flat membranes, and it fixes concave assemblies where the PCB and beams shade the petals.
Material data: the real limit on accuracy
Starter library (typical values; verify against datasheets)
| Material | α_s | ε | Reflection type | Gas side (clean) prior |
|---|---|---|---|---|
| VDA / aluminised Mylar or Kapton, metal side | 0.08–0.12 | 0.03–0.05 | mostly specular (ρ_s ≈ 0.85–0.9) | α_n 0.5–0.9, σ_t 0.6–0.9 [ASSUME] |
| Kapton, polymer side | 0.35–0.5 | 0.6–0.8 (thickness-dependent) | mixed | as above [ASSUME] |
| Black Kapton | ≈ 0.92 | ≈ 0.85 | diffuse | [ASSUME] |
| GaAs triple-junction cell + cover glass | 0.88–0.92 | 0.80–0.85 | small specular (glass) | [ASSUME] |
| White paint (AZ-93 / Z-93 class) | 0.15–0.17 | 0.90–0.92 | diffuse | [ASSUME] |
| Black paint (Z306 class) | ≈ 0.95 | 0.87–0.90 | diffuse | [ASSUME] |
| Bare polished aluminium | 0.10–0.20 | 0.03–0.05 | specular-dominant | [ASSUME] |
| Clear-anodised aluminium | 0.3–0.4 | 0.7–0.85 | diffuse-dominant | [ASSUME] |
| CFRP | ≈ 0.9 | 0.8–0.85 | diffuse | [ASSUME] |
| AO-covered (any) | — | — | — | α_n ≈ 1, σ_t ≈ 1 (the "contaminated" state) |
Optical sources: Henninger, NASA RP-1121 (1984); Gilmore, Spacecraft Thermal Control Handbook Vol. I, App. A; McInnes (1999) for sail films. The specular/diffuse split is rarely tabulated, so measure it (BRDF) or treat it as uncertain. Values in this table are ranges from memory of those sources and must be checked before use.
File formats and configuration
materials.yaml (new, config/plant/materials.yaml)
al_mylar_front:
gas: {model: cll_kernel, alpha_n: 0.80, alpha_t: 0.85, coverage: sesam} # alpha_t = CLL energy accommodation; sigma_t derived
solar: {rho_s: 0.88, rho_d: 0.04, tau: 0.0} # alpha_s = 0.08
ir: {eps: 0.04, spec_frac: 0.9}
thermal: {reemission: thin_sheet, eps_back: 0.60, c_area_J_m2K: 35.0}
uncertainty: {alpha_n: [0.6, 0.95], alpha_t: [0.6, 1.0], rho_s: [0.80, 0.90]} # for domain randomisation
gaas_cell:
gas: {model: cll_kernel, alpha_n: 0.90, alpha_t: 0.95, coverage: sesam}
solar: {rho_s: 0.06, rho_d: 0.02, tau: 0.0}
ir: {eps: 0.85, spec_frac: 0.1}
thermal: {reemission: none}
Assigning materials to plates
.geomv2: an optional 8th column with the material name. The loader accepts 7 or 8 columns (7 → the vehicle default material), so old files keep working.- From CAD: STEP files carry bodies and parts. Simplify each body separately (cascadio gives per-body meshes), then concatenate and tag the plates. The vehicle card maps names to materials:
materials: {Membrane*: al_mylar_front, Cell*: gaas_cell, Beam*: cfrp, PCB: fr4}, with front/back chosen by normal sign for thin sheets. - Existing 176-plate SolarCat: a small tagging script (spatial rules: z-normal membrane faces, beam boxes, PCB) writes the 8th column. This avoids re-simplifying.
damage.pymust keepmat[]aligned when it rescales areas (it does not reorder plates, so this is low risk).
Code touch-points
| File | Change | Phase |
|---|---|---|
cpp/include/arlamx/types.hpp | PanelSoA gains std::vector<uint16_t> mat (and later Tw); new Material / MaterialTable structs | 0 |
cpp/src/aero/sentman.cpp (sum_panels) | per-panel GSI dispatch by mat[i]; coverage blend; hoisting per (material, species) | 2, 4 |
cpp/src/aero/cll.cpp + new cll_kernel.cpp | Rice-mean quadrature, 2-D Hermite table, species mix | 3 |
cpp/src/srp/panel_srp.cpp | per-panel optics, no renormalisation, transmission, re-emission; Earth IR per-panel ε | 1 |
cpp/src/api.cpp, api.hpp | Simulator::set_materials, pass the table to the kernels, optional thermal state per panel, per-material diagnostics in StepOut | 0, 5 |
cpp/src/bindings.cpp | set_panels(n, A, c, mat=None), set_materials(list[dict]), cll_kernel(...) for tests | 0, 3 |
python/arlamx_v2/geometry.py | load_geom/write_geom 8th column; per-body STEP simplify; tagging helper | 0, 6 |
python/arlamx_v2/physics.py, sail_optics.py | materials: section, validation, legacy presets → materials | 0, 1 |
python/arlamx_v2/atmosphere.py, env.py | pass n_O (or the total number density) for coverage; material domain randomisation at reset | 4, 8 |
config/plant/vehicle*.yaml | materials: name→material map, default material | 6 |
session.py | snapshot the resolved material table | 8 |
tests/aero, tests/srp, tests/geometry, tests/physics | tests below | all |
Phases and effort
| Phase | Scope | Days | Depends on |
|---|---|---|---|
| 0 | Material data model: YAML schema, C++ table, PanelSoA.mat, bindings, .geom v2 loader. Uniform-material regression lock. | 2–3 | — |
| 1 | Per-panel SRP: solar + IR bands, transmission, thin-sheet re-emission. Legacy presets as materials. | 2–3 | 0 |
| 2 | Per-panel GSI parameters on the existing Sentman / Walker kernels | 1–1.5 | 0 |
| 3 | Exact CLL kernel: quadrature, table, species mix, gsi: cll_kernel, validation | 4–6 | 2 |
| 4 | AO surface coverage (Langmuir/SESAM), n_O plumbing | 2–3 | 2 (3 preferred) |
| 5 | Panel thermal model → T_w and re-emission | 3–4 | 1, 2 |
| 6 | Material assignment: per-body STEP simplify, name map, SolarCat tagging script | 2–4 | 0 |
| 7 | Self-shadowing / flow shielding visibility maps (optional) | 4–6 | 0 |
| 8 | Integration: env randomisation, snapshots, performance pass, docs, before/after decay + eval report | 2–3 | all used |
| Minimum viable = 0 + 1 + 2 + 6 + 8 | 9–14.5 | ||
| Recommended = minimum + 3 + 4 + 5 | 18–27.5 | ||
| Full = recommended + 7 | 22–33.5 | ||
The headline ranges round these. They do not include retraining: every change alters the plant, so v2.7 policies need re-evaluation and most likely retraining, at campaign-dependent compute cost.
Performance budget
- Today: ≈ 1.23 ms per env step (150 substeps × 176 panels on SolarCat, or the hex model).
- The per-panel material gather is negligible. The CLL table lookup is about the cost of the current Walker evaluation (one erf/exp plus a cubic interpolation per species). The coverage blend doubles the kernel work: evaluate the diffuse and clean coefficients and blend them.
- Thermal: a few flops per face per substep. Visibility: two table lookups per panel per substep.
- Target: ≤ 2 ms/step at recommended scope. Add a benchmark test that fails above a threshold.
Validation plan
| Test | Pass criterion |
|---|---|
| T-MAT-1 regression lock | A single material equal to the v2.7 global settings reproduces v2.7 forces, torques and a 1-day SolarCat trajectory to ≤ 1e-12 relative (bit-identical where possible). |
| T-MAT-2 additivity | Plates split into two materials: force = sum of the two single-material computations. |
| T-CLLK-1 diffuse limit | α_n = α_t = 1 → Sentman α_E = 1 to ≤ 1e-10 over θ ∈ [0, 90°], s ∈ {2, 8, 20}. |
| T-CLLK-2 specular limit | α_n = α_t = 0 → C_p = 2C_{p,i}, C_τ = 0. |
| T-CLLK-3 Walker agreement | Face-on and 45° within 1 % of Walker over α_n ∈ [0.3, 0.99]; grazing differences reported, not asserted. |
| T-CLLK-4 Monte-Carlo kernel check (test-only) | Sampled CLL reflection of 10⁶ molecules from a drifting Maxwellian agrees with the table within 3σ of MC error. |
| T-CLLK-5 table accuracy | Interpolated G vs direct quadrature ≤ 1e-5 relative over the grid, including off-node points. |
| T-CLLK-6 literature | ADBSat plate/sphere cases and Walker et al. (2014) figure points within the digitisation error. |
| T-SRP-M1 energy | α_s + ρ_s + ρ_d + τ = 1 is enforced; τ = 1 gives zero force; uniform material equals the v2.7 optical law. |
| T-SRP-M2 re-emission | Sign and magnitude match McInnes' flat-sail example; ε_f = ε_b gives zero. |
| T-ADS-1 coverage | θ_c → 1 gives the diffuse result and θ_c → 0 the clean result; monotone in P_O. |
| T-TH-1 thermal | Steady state matches \(\alpha_sS=(\varepsilon_f+\varepsilon_b)\sigma T^4\) for an isolated plate; the eclipse cool-down time constant matches the analytic value. |
| Decay study | SolarCat 500 → 300 km min/max-drag decay: v2.7 vs uniform material (equal) vs realistic materials (report the difference). |
Risks and open decisions
- α_t vs σ_T naming. Decide whether YAML takes the CLL α_t (then convert with σ_t = 1 − √(1 − α_t)) or σ_T directly, and rename the current
aero.alpha_taccordingly. Today it is σ_T under an α name. - Accommodation data. Values are uncertain by tens of percent. Mitigate with domain randomisation and a calibration hook, and report results as bands.
- Plant change invalidates comparisons with every campaign in
outputs/.old. The regression lock (T-MAT-1) keeps a v2.7-equivalent mode for apples-to-apples runs. - Hyperthermal shielding. Flow visibility maps assume straight-line molecular paths (valid for s ≳ 5). Light species (H, He; s ≈ 2–4) partly wrap around edges. This is acceptable because they carry little momentum at these altitudes.
- Out of scope: DSMC in the loop, multiple molecular reflections between panels, atomic-oxygen erosion (mass loss) and UV ageing of the optics. Ageing could later be a slow time-dependent material drift.
Suggested order
- Phase 0 with the T-MAT-1 lock. Nothing changes numerically.
- Phases 1 + 2 + 6. This is the biggest accuracy gain per day: real optics and accommodation per part.
- Phase 3 (exact CLL), then 4 (coverage). Together they make α physically dependent on the environment.
- Phase 5 if the thermal re-emission or T_w sensitivity turns out to be significant in the decay study.
- Phase 7 only if the SolarCat analysis shows material shading, e.g. by comparing projected area with and without ray-casting at a few attitudes (a 1-hour check before committing 4–6 days).
References
- Cercignani, C. & Lampis, M. (1971). TTSP 1, 101–114. Lord, R. G. (1991). Phys. Fluids A 3, 706–710.
- Walker, A., Mehta, P. & Koller, J. (2014). J. Spacecraft Rockets 51(5), 1544–1563.
- Pilinski, M. D., Argrow, B. M., Palo, S. E. & Bowman, B. R. (2013). Semi-empirical satellite accommodation model for spherical and randomly tumbling objects. J. Spacecraft Rockets 50(3).
- Mehta, P. M. et al. (2014). Comparing physical drag coefficients computed using different gas–surface interaction models. J. Spacecraft Rockets 51(3).
- Sinpetru, L. A. et al. (2022). ADBSat: methodology of a novel panel method tool for aerodynamic analysis of satellites. Comput. Phys. Commun. (arXiv:2104.05543).
- McInnes, C. R. (1999). Solar Sailing. Springer, ch. 2 (optical force model incl. re-emission).
- Henninger, J. H. (1984). Solar absorptance and thermal emittance of some common spacecraft thermal-control coatings. NASA RP-1121.
- Gilmore, D. G. (ed.) (2002). Spacecraft Thermal Control Handbook, Vol. I. Aerospace Press.