Documents

Physics

Free-molecular aerodynamics

Rarefied-gas force and torque on every panel, summed over the vehicle, with the atmosphere rotating with the Earth. Two gas–surface interaction (GSI) models are available: Sentman (the default) and the Walker closed-form Cercignani–Lampis–Lord (CLL) fit.

Source: cpp/src/aero/sentman.cpp (panel sum + Sentman), cpp/src/aero/cll.cpp (Walker-CLL), called from Simulator::step every substep. Switch: aero.gsi in the physics YAML, or --gsi on the CLI.

Flow state

\[ \mathbf v_\mathrm{rel}=\mathbf v-\boldsymbol\omega_\oplus\times\mathbf r-\mathbf v_\mathrm{wind},\qquad s=\frac{|\mathbf v_\mathrm{rel}|}{\sqrt{2k_BT/\bar m}},\qquad q=\tfrac12\rho|\mathbf v_\mathrm{rel}|^2 \]
  • corotating: true subtracts ω⊕ × r (ω⊕ = 7.2921150e-5 rad/s).
  • v_wind is zero until you call Simulator.set_wind(w_N). MSIS has no winds, and no HWM model ships with the code.
  • ρ, T and m̄ come from MSIS (see Atmosphere). The same (ρ, T, m̄, χ) is held within a substep and interpolated linearly across the step when atmosphere.interp is on.
  • The gas velocity in body axes is v_B_gas = −C_BN v_rel. For each panel with outward normal n̂: \(\cos\theta=-\hat v\cdot\hat n\), with θ = 0 face-on.

Panel sum (common to both GSIs)

\[ \mathbf F=q\sum_i A_i\left(-C_{p,i}\,\hat n_i+C_{\tau,i}\,\hat t_i\right),\qquad \hat t_i\,\sin\theta_i=\hat v+\cos\theta_i\,\hat n_i,\qquad \boldsymbol\tau=\sum_i \mathbf r_{c,i}\times\mathbf F_i \]
  • The code stores \(C_\tau/\sin\theta\) and multiplies by the unnormalised \(\hat v+\cos\theta\,\hat n\), so an edge-on panel has no singularity.
  • Wetted faces: every panel with \(s\cos\theta>-4\) is summed, back faces included. The erf/exp terms turn the lee-side flux off smoothly. For CLL the cut is per species (\(s_j\cos\theta\le -4\)).
  • \(C_D=\mathbf F\cdot\hat v/(qA_\mathrm{ref})\), \(C_L=|\mathbf F_\perp|/(qA_\mathrm{ref})\). With one_sided_ref, A_ref is half of ΣA (a two-sided membrane counts once).
  • Torque is about the body origin. Centroids are shifted by cp_offset_m in v8+ so the centre of pressure is offset from the CoM.
  • There is no shadowing or shielding: panels do not block one another. This is exact for convex bodies and flat membranes. For concave assemblies it is an approximation.

Sentman (default)

Sentman (1961) diffuse re-emission with the Moe & Moe (2005) energy-flux accommodation closure (project item M-01). With \(\gamma=s\cos\theta\), \(Z=1+\mathrm{erf}\,\gamma\), \(E=e^{-\gamma^2}\):

\[ C_{p,i}=\frac{(\gamma^2+\tfrac12)Z+\gamma E/\sqrt\pi}{s^2},\qquad \frac{C_\tau}{\sin\theta}=\frac{\gamma Z+E/\sqrt\pi}{s}, \] \[ \frac{T_r}{T_i}=\alpha_E\frac{T_w}{T_i}+(1-\alpha_E)\frac{s^2}{2},\qquad C_{p,r}=\sqrt{\frac{T_r}{T_i}}\;\frac{E+\sqrt\pi\,\gamma Z}{2s^2},\qquad C_p=C_{p,i}+C_{p,r} \]
  • Parameters: aero.alpha_E (0.93), aero.T_w (300 K). They are global for the whole vehicle.
  • Sentman is fully diffuse in direction. α_E only sets the re-emission energy, so there is no specular momentum.
  • Numerical guard: for γ > 6, Z = 2 and E = 0 exactly (error ≤ 1e-15).
  • Hyperthermal identity (tested): \(C_p\cos\theta+C_\tau\sin\theta\to2\cos\theta\) as s → ∞ with α_E = 1 and T_w = T_i.
  • The \((1-\alpha_E)s^2/2\) term keeps only the directed incident energy. Including the thermal part (\(+(1-\alpha_E)\)) would change face-on C_p by ≈0.2 % at s = 8, which is negligible.

Walker–CLL (optional, gsi: cll)

Walker, Mehta & Koller (2014) fitted closed-form plate coefficients to CLL-kernel simulations, as transcribed in ADBSat (Sinpetru et al., arXiv:2104.05543, eqs. 9–15). The model has one fit per species and is not the exact kernel. With \(\Gamma_1=\gamma E/\sqrt\pi+\tfrac12(1+2\gamma^2)Z\) and \(\Gamma_2=E/\sqrt\pi+\gamma Z\):

\[ C_{p,j}=\frac1{s_j^2}\Bigl[(1+\sqrt{1-\alpha_N})\Gamma_1+\tfrac12\,e^{-\beta_j(1-\alpha_N)^{\gamma_j}}\Bigl(\tfrac{T_w}{T_i}\Bigr)^{\delta_j}\frac{\zeta_j}{s_j}\sqrt{\tfrac{T_w}{T_i}}\sqrt\pi\,\Gamma_2\Bigr],\qquad \frac{C_{\tau,j}}{\sin\theta}=\frac{\sigma_T\,\Gamma_2}{s_j} \]
  • α_N = 1 switches to the Schaaf–Chambre branch (ADBSat eq. 9), which equals Sentman with α_E = 1.
  • Species mix (eq. 15): \(C=\sum_j\chi_jm_jC_j/\sum_j\chi_jm_j\) over He, O, N₂, O₂, Ar, H, N, with a per-species speed ratio \(s_j\). MSIS anomalous O is folded into O, and NO is dropped. Without χ the model uses the atomic-O row and the mixture s.
  • Walker fit rows β, γ, δ, ζ are in walker_fit(). He and H depend on the α_N band; Ar reuses the N₂ row.
  • Parameters: aero.alpha_n (Walker α_N, normal energy accommodation), aero.alpha_t (σ_T, tangential momentum accommodation), aero.T_w. They are global for the vehicle.
Naming trap: alpha_t is σ_T, not the CLL kernel's α_t In the CLL kernel, the tangential parameter α_t is an energy accommodation and the reflected mean tangential velocity is \(\sqrt{1-\alpha_t}\,v_t^i\). The tangential momentum accommodation is therefore \(\sigma_T=1-\sqrt{1-\alpha_t}\). The code multiplies \(C_\tau\) by the value you pass, so treat alpha_t as σ_T. If a paper gives you a CLL α_t, convert it first: α_t = 0.9 → σ_T = 0.684.
α_N is not α_E The high preset uses α_N = 0.93 so that standard-vs-high isolates the kernel and species mix. It is not a Walker-derived value. Face-on plate at s = 8, T_w/T_i = 1/3: Sentman(0.93) C_p = 2.37, Walker-CLL(α_N = 0.93) = 2.56, Walker-CLL(α_N = 1) = 2.14.

How close is the Walker fit to the exact CLL kernel?

For this documentation pass I integrated the exact CLL kernel per plate with a scratch quadrature. The normal kernel is a Rice distribution, so its mean has a closed form in Bessel functions, and only the average over the incident Maxwellian needs a 1-D integral. No project code was changed. Atomic O, s = 8, T_w/T_i = 1/3, σ_T = 1:

θα_Nexact CLL C_pWalker fit C_pSentman(α_E = α_N) C_p
0°1.002.14352.14352.1435
0°0.932.55812.55832.3694
0°0.503.44273.44272.9065
45°0.931.29371.29101.2658
80°0.990.09920.0884 (−11 %)0.1070
80°0.930.10470.0975 (−7 %)0.1376
80°0.500.13130.12980.2313

The Walker fit is excellent face-on and at moderate incidence, but it drifts at grazing incidence as α_N → 1 (at 80° the fitted C_p even drops below the α_N = 1 value). On the whole 176-plate SolarCat the effect averages out to ≤ 0.3 % in C_D. The much larger lever is the accommodation values themselves (see the plan).

Drag baseline and energy terms

Each substep also evaluates coefficients_only with the flow along the vehicle's minimum-projected-area body axis (min_drag_axis). The result is cached until s changes by more than 2e-4 relative. That gives the counterfactual \(F_\mathrm{base}=C_{D,\mathrm{base}}\,q\,A_\mathrm{ref}\), and the plant integrates:

\[ \Delta E_\mathrm{actual}=\sum \frac{(\mathbf F_\mathrm{aero}+\mathbf F_\mathrm{SRP}+\mathbf F_\mathrm{ERP})_N\cdot\mathbf v\,\Delta t}{m},\quad \Delta E_\mathrm{baseline}=-\sum\frac{F_\mathrm{base}\,(\hat v_\mathrm{rel}\cdot\mathbf v)\Delta t}{m} \]

dE_drag and dE_lift split the aero part along and across \(\hat v_\mathrm{rel}\). These feed the RL reward (dE_vs_baseline).

Configuration

YAML keySimParamsDefaultMeaning
aero.gsigsisentmansentman | cll. Any other string throws.
aero.alpha_Ealpha_E0.93Sentman energy accommodation
aero.alpha_nalpha_n1.0 (high: 0.93)Walker α_N
aero.alpha_talpha_t1.0σ_T, tangential momentum accommodation
aero.T_wT_w300 Kwall temperature (same for all panels)
aero.one_sided_refone_sided_reftrueA_ref = ½ΣA
atmosphere.corotatingcorotatingtruesubtract ω⊕ × r

Standalone use

from arlamx_v2 import cpp
from arlamx_v2.geometry import load_geom
n, A, c = load_geom("data/SolarCat_v3_1pct_plates.geom")
out = cpp.spacecraft_aero(n, A, c, v_rel_B=[7600, 0, 0], rho=3e-12, T=900, m_bar=2.656e-26,
                          T_w=300, alpha_E=0.93, one_sided_ref=True,
                          gsi="cll", alpha_n=0.93, alpha_t=1.0, chi=[0, 1, 0, 0, 0, 0, 0])
out["F"], out["tau"], out["Cd"], out["Cl"], out["A_ref"]
cpp.sentman(theta, s, Tw_Ti, alpha_E)          # (Cp, Ctau) for one plate
cpp.cll(theta, s, Tw_Ti, alpha_n, alpha_t)      # (Cp, Ctau), atomic-O row

Validation

  • tests/aero/test_sentman.py: hyperthermal identity (1e-3 at s = 8, 1e-8 at s = 80), α_E limits, face-on bands.
  • tests/aero/test_cll.py: T-CLL-1 (α = 1 equals Sentman α_E = 1), T-CLL-4 (mixture differs from pure O), T-CLL-5 (unknown GSI throws). T-CLL-2/3 are specified in docs/CLL_TEST_SPEC.md but not yet written.
  • tests/validation/verify_physics.py: independent scipy quadrature of the Sentman integrals.
  • ACEnv/Reports/verify_sentman.md: audit record.

Limits

  • One global (α, T_w) for all panels, with no per-material behaviour. See the plan.
  • No shadowing or multiple reflection between panels (concave geometry).
  • No surface-coverage (atomic-O adsorption) model, so α does not change with altitude or solar activity.
  • Sentman is fully diffuse. Walker-CLL is a fit that is weakest at grazing incidence with α_N → 1.
  • The onboard FP32 forecast uses a constant ballistic coefficient and an exponential atmosphere, not the panel model.

References

  1. Sentman, L. H. (1961). Free molecule flow theory and its application to the determination of aerodynamic forces. LMSC-448514.
  2. Moe, K. & Moe, M. M. (2005). Gas–surface interactions and satellite drag coefficients. Planet. Space Sci. 53, 793–801.
  3. Cercignani, C. & Lampis, M. (1971). Kinetic models for gas–surface interactions. TTSP 1, 101–114; Lord, R. G. (1991) Phys. Fluids A 3, 706.
  4. Walker, A., Mehta, P. & Koller, J. (2014). Drag coefficient model using the CLL GSI. J. Spacecraft Rockets 51(5), 1544–1563.
  5. Sinpetru, L. et al. (2022). ADBSat. arXiv:2104.05543.
  6. Doornbos, E. (2012). Thermospheric Density and Wind Determination from Satellite Dynamics. Springer.