Documents

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

What the prototype showed (scratch code, not in the repo)
  • 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.
So the value of this project is mainly per-panel materials and tangential accommodation, and only secondarily the exact kernel.

Where things stand

AreaToday (v2.7)Target
Panel tablePanelSoA{n, A, c}; .geom has exactly 7 columns+ material id per plate (front/back faces are already separate plates)
GSIvehicle-wide gsi, α_E | (α_N, σ_T), T_w = 300 Kper-material model + parameters; exact CLL option; coverage-dependent α; per-panel T_w
SRPvehicle-wide (c_a, c_s, c_d), renormalised to 1; IR partition globalper-material solar (ρ_s, ρ_d, τ) and IR (ε, specular fraction); thermal re-emission
Geometrysimplifier merges by normal only; part identity lostmaterial survives simplification (per-body simplify, or tagging)
Occlusionnoneoptional visibility maps for Sun and flow
materials.yamlgas: α_n, σ_t | α_t, coverageoptics: ρ_s, ρ_d, τ, ε_f/ε_b CAD (STEP bodies)body/part name →material map (vehicle.yaml) geometry.pysimplify per body.geom v2: + material col MaterialTable (C++)CLL tables per materialbuilt once at load PanelSoA + mat[]+ T_w[] (thermal)+ vis maps (opt.) sum_panelsper-panel GSI× coverage θ(n_O,T) panel_srp / earth_radper-panel optics+ re-emission Simulator::step: F_B, τ_B → RK4 (unchanged)StepOut gains per-material diagnostics (optional)
Material data flow. Only the force kernels change; integration, control and the RL env keep their interfaces.

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(w_i\!\to\! w_r)=\frac{2w_r}{\alpha_n}\exp\!\Bigl(-\frac{w_r^2+(1-\alpha_n)w_i^2}{\alpha_n}\Bigr)I_0\!\Bigl(\frac{2\sqrt{1-\alpha_n}\,w_iw_r}{\alpha_n}\Bigr),\qquad R_t=\frac{1}{\sqrt{\pi\alpha_t}}\exp\!\Bigl(-\frac{(w_{t,r}-\sqrt{1-\alpha_t}\,w_{t,i})^2}{\alpha_t}\Bigr) \]

\(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:

\[ \langle w_r\rangle(w_i)=\frac{\sqrt{\pi\alpha_n}}{2}\,e^{-x/2}\bigl[(1+x)I_0(x/2)+x\,I_1(x/2)\bigr],\qquad x=\frac{(1-\alpha_n)w_i^2}{\alpha_n} \]

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:

\[ C_p=\underbrace{\frac{(\gamma^2+\tfrac12)Z+\gamma E/\sqrt\pi}{s^2}}_{\text{incident (as Sentman)}}+\frac{2\tau_w}{s^2}\,G(\gamma,\tau_w;\alpha_n),\qquad G=\int_0^\infty u\,\frac{e^{-(u-\gamma)^2}}{\sqrt\pi}\,\langle w_r\rangle\!\Bigl(\frac{u}{\tau_w}\Bigr)du \] \[ \frac{C_\tau}{\sin\theta}=\sigma_t\,\frac{\gamma Z+E/\sqrt\pi}{s},\qquad \sigma_t=1-\sqrt{1-\alpha_t} \]
  • 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/i1e equivalents; 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. Keep cll (Walker) and sentman for 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.:

\[ \theta_c=\frac{K\,P_O}{1+K\,P_O},\quad P_O=n_Ok_BT,\qquad C=\theta_c\,C_\text{diffuse}(\alpha{=}1)+(1-\theta_c)\,C_\text{clean}(\alpha_n,\alpha_t) \]
  • 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.

\[ \mathbf F_i=-P A_i\cos\theta\Bigl[(\alpha_s+\rho_d)\hat s+\bigl(2\rho_s\cos\theta+\tfrac23\rho_d\bigr)\hat n_i\Bigr]\;-\;P A_i\cos\theta\;\alpha_s\,\frac{\tfrac23(\varepsilon_f-\varepsilon_b)}{\varepsilon_f+\varepsilon_b}\,\hat n_i \]
  • 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 reemission mode per material covers the cases: thin_sheet (uses ε_f, ε_b), none (thick body, conducts internally), or thermal (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.

\[ c_A\,\dot T=\alpha_s S\cos\theta_\odot+\alpha_s S_\text{alb}+\varepsilon_f q_\text{IR}-(\varepsilon_f+\varepsilon_b)\sigma T^4 \]

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

Honest caveat Once α is given, CLL is exact within the kernel's assumptions. But there is no authoritative per-material table of LEO accommodation coefficients. Laboratory values are for clean surfaces and specific beam energies, and flight-derived values are for whole satellites. The plan therefore treats gas-side values as priors with uncertainty, randomises them in training, and keeps a path to calibrate them against tracking data (TLE/POD-derived drag) or offline DSMC (e.g. SPARTA with the CLL model) of your actual geometry.

Starter library (typical values; verify against datasheets)

Materialα_sεReflection typeGas side (clean) prior
VDA / aluminised Mylar or Kapton, metal side0.08–0.120.03–0.05mostly specular (ρ_s ≈ 0.85–0.9)α_n 0.5–0.9, σ_t 0.6–0.9 [ASSUME]
Kapton, polymer side0.35–0.50.6–0.8 (thickness-dependent)mixedas above [ASSUME]
Black Kapton≈ 0.92≈ 0.85diffuse[ASSUME]
GaAs triple-junction cell + cover glass0.88–0.920.80–0.85small specular (glass)[ASSUME]
White paint (AZ-93 / Z-93 class)0.15–0.170.90–0.92diffuse[ASSUME]
Black paint (Z306 class)≈ 0.950.87–0.90diffuse[ASSUME]
Bare polished aluminium0.10–0.200.03–0.05specular-dominant[ASSUME]
Clear-anodised aluminium0.3–0.40.7–0.85diffuse-dominant[ASSUME]
CFRP≈ 0.90.8–0.85diffuse[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

  1. .geom v2: 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.
  2. 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.
  3. 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.
  4. damage.py must keep mat[] aligned when it rescales areas (it does not reorder plates, so this is low risk).

Code touch-points

FileChangePhase
cpp/include/arlamx/types.hppPanelSoA gains std::vector<uint16_t> mat (and later Tw); new Material / MaterialTable structs0
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.cppRice-mean quadrature, 2-D Hermite table, species mix3
cpp/src/srp/panel_srp.cppper-panel optics, no renormalisation, transmission, re-emission; Earth IR per-panel ε1
cpp/src/api.cpp, api.hppSimulator::set_materials, pass the table to the kernels, optional thermal state per panel, per-material diagnostics in StepOut0, 5
cpp/src/bindings.cppset_panels(n, A, c, mat=None), set_materials(list[dict]), cll_kernel(...) for tests0, 3
python/arlamx_v2/geometry.pyload_geom/write_geom 8th column; per-body STEP simplify; tagging helper0, 6
python/arlamx_v2/physics.py, sail_optics.pymaterials: section, validation, legacy presets → materials0, 1
python/arlamx_v2/atmosphere.py, env.pypass n_O (or the total number density) for coverage; material domain randomisation at reset4, 8
config/plant/vehicle*.yamlmaterials: name→material map, default material6
session.pysnapshot the resolved material table8
tests/aero, tests/srp, tests/geometry, tests/physicstests belowall

Phases and effort

PhaseScopeDaysDepends on
0Material data model: YAML schema, C++ table, PanelSoA.mat, bindings, .geom v2 loader. Uniform-material regression lock.2–3—
1Per-panel SRP: solar + IR bands, transmission, thin-sheet re-emission. Legacy presets as materials.2–30
2Per-panel GSI parameters on the existing Sentman / Walker kernels1–1.50
3Exact CLL kernel: quadrature, table, species mix, gsi: cll_kernel, validation4–62
4AO surface coverage (Langmuir/SESAM), n_O plumbing2–32 (3 preferred)
5Panel thermal model → T_w and re-emission3–41, 2
6Material assignment: per-body STEP simplify, name map, SolarCat tagging script2–40
7Self-shadowing / flow shielding visibility maps (optional)4–60
8Integration: env randomisation, snapshots, performance pass, docs, before/after decay + eval report2–3all used
Minimum viable = 0 + 1 + 2 + 6 + 89–14.5
Recommended = minimum + 3 + 4 + 518–27.5
Full = recommended + 722–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

TestPass criterion
T-MAT-1 regression lockA 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 additivityPlates 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 agreementFace-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 accuracyInterpolated G vs direct quadrature ≤ 1e-5 relative over the grid, including off-node points.
T-CLLK-6 literatureADBSat 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-emissionSign 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 thermalSteady 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 studySolarCat 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_t accordingly. 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

  1. Phase 0 with the T-MAT-1 lock. Nothing changes numerically.
  2. Phases 1 + 2 + 6. This is the biggest accuracy gain per day: real optics and accommodation per part.
  3. Phase 3 (exact CLL), then 4 (coverage). Together they make α physically dependent on the environment.
  4. Phase 5 if the thermal re-emission or T_w sensitivity turns out to be significant in the decay study.
  5. 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

  1. Cercignani, C. & Lampis, M. (1971). TTSP 1, 101–114. Lord, R. G. (1991). Phys. Fluids A 3, 706–710.
  2. Walker, A., Mehta, P. & Koller, J. (2014). J. Spacecraft Rockets 51(5), 1544–1563.
  3. 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).
  4. Mehta, P. M. et al. (2014). Comparing physical drag coefficients computed using different gas–surface interaction models. J. Spacecraft Rockets 51(3).
  5. 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).
  6. McInnes, C. R. (1999). Solar Sailing. Springer, ch. 2 (optical force model incl. re-emission).
  7. Henninger, J. H. (1984). Solar absorptance and thermal emittance of some common spacecraft thermal-control coatings. NASA RP-1121.
  8. Gilmore, D. G. (ed.) (2002). Spacecraft Thermal Control Handbook, Vol. I. Aerospace Press.