Physics
Atmosphere & space weather
Density, temperature, mean molecular mass and species fractions from NRLMSIS, driven by F10.7 and Ap. Those two indices are randomised and made to jump during training episodes.
Source: python/arlamx_v2/atmosphere.py (query_msis), env.py (_atmo_at, reset, _plan_jumps, _apply_jumps), plant hooks Simulator.set_atmosphere / set_atmosphere_end. There is no atmosphere model inside the C++ plant.
MSIS query
- Library:
pymsis.atmosphere.model=msis21(NRLMSIS 2.1, the default),nrlmsise00(version 0), orconstant(atmosphere.constant: {rho, T, m_bar}). - Where: geodetic height and latitude (Bowring, WGS-84) and Earth-fixed longitude (GMST rotation) of the spacecraft.
- When: the start of every advisor step (every 300 s). With
atmosphere.interp: true(standard and high) a second query runs at the position predicted by the FP32 propagator for t + 300 s. The plant interpolates ρ, T, m̄ and χ linearly across the 150 substeps. That is 2 MSIS calls per decision instead of 150. - Returned: ρ (kg/m³), temperature T (the MSIS local temperature at altitude, index 10), \(\bar m=\sum n_im_i/\sum n_i\) over He, O, N₂, O₂, Ar, H, N, and optionally the mole fractions χ in the Walker order (He, O, N₂, O₂, Ar, H, N). Anomalous O is folded into O and NO is dropped.
- Safety: if pymsis throws, the process falls back to ρ = 3e-12, T = 900 K for the rest of the run and warns once. Out-of-range results (ρ ≥ 1e-8, T ∉ (150, 4000) K, m̄ outside bounds) are replaced by ρ = 1e-13, T = 600 K.
Space-weather inputs
\[
\texttt{f107s}=\texttt{f107as}=F_{10.7},\qquad \texttt{aps}=[A_p]\times 7\ \ \text{(scalar)}\quad\text{or}\quad [\text{daily},\ 3\mathrm h,\ -3,\ -6,\ -9\,\mathrm h,\ \overline{-12..-33},\ \overline{-36..-57}]
\]
- A scalar Ap fills all 7 slots (steady-Ap, daily mode). A length-7 history switches MSIS to storm-time mode (
geomagnetic_activity = −1).query_msissupports this, but the env always passes a scalar. - The 81-day centred mean F10.7a is set equal to the daily F10.7. Real conditions often differ by 20–40 % between the two, and MSIS density responds to both.
How space weather is made dynamic in training
| Variant | Draw at reset | Jumps per episode | Jump size | Clip |
|---|---|---|---|---|
| v3 | F10.7 U(80, 200), Ap U(2, 15) | none (static per episode) | — | — |
| v4–v9 | F10.7 U(65, 250), Ap U(2, 40) | 1–4 | ΔF ±80, ΔAp −20…+35 | F [65, 250], Ap [2, 80] |
| v10, v11, v10r6 (and the v12–v14 wrappers) | F10.7 U(5, 250), Ap U(2, 200) | 2–8 | ΔF ±150, ΔAp −60…+150 | F [5, 250], Ap [2, 200] |
config/orbit.yaml → training.f107 / apoverrides the ranges ([lo, hi], a number, ornull).reset(options={"f107":…, "ap":…})pins them for evaluation.- Jumps are applied at the start of the scheduled step and then held. They are step changes, not a physical storm profile (no ~1–3 day recovery), and there is no thermosphere time lag.
- The v14b "climate mix" (40 % quiet / 35 % gradual + spikes / 25 % storm) is a wrapper-level re-draw in
train_v12.py.
F10.7 below ~65 sfu is unphysical
The v10 envelope floor of F10.7 = 5 sfu is below the observed solar-minimum floor (≈ 63–65 sfu) and outside the conditions MSIS was fitted on. Densities there are extrapolations. That is useful as a domain-randomisation stressor, but do not quote it as a real solar condition.
Wind
v_rel = v − ω⊕ × r − v_wind. Simulator.set_wind(w_N) sets a constant inertial wind. It is zero by default because no cited horizontal wind model (HWM14) is wired in.
Configuration
| Key | Default | Meaning |
|---|---|---|
atmosphere.model | msis21 | msis21 | nrlmsise00 | constant |
atmosphere.f107, ap | 150, 4 | seed values for the plant. Env resets overwrite them from the envelope. |
atmosphere.corotating | true | co-rotating atmosphere |
atmosphere.interp | true (fast: false) | second MSIS sample at step end, linear in time |
atmosphere.constant | — | {rho, T, m_bar} for model: constant |
orbit.training.f107 / ap | [5, 250] / [2, 200] | training envelope |
orbit.simulation.f107 / ap | 150 / 4 | decay-run values |
What a “real space weather” mode would need
This is not implemented. It is listed because you asked for dynamic space weather.
- A reader for CelesTrak
SW-All.csv(observed daily F10.7 adjusted/observed, 81-day centred average, 8 × 3-hour Kp/Ap, daily Ap). It could also read the NOAA SWPC 45-day forecast for predictive runs. - Per step: pass daily F10.7 of the previous day, the 81-day mean, and the 7-element Ap history built from the 3-hour Ap series.
query_msisalready accepts the history. - Training: sample episode start dates from the record (a solar-cycle-weighted draw) instead of uniform indices. This gives realistic storm onsets, recoveries and F10.7/F10.7a correlations.
This is roughly 1–2 days of work plus tests, and it is independent of the CLL/material work.
References
- Emmert, J. T. et al. (2021). NRLMSIS 2.0. Earth Space Sci. 8, e2020EA001321.
- Picone, J. M. et al. (2002). NRLMSISE-00. JGR 107(A12), 1468.
- Vallado, D. A. & Kelso, T. S. (2013). Earth orientation parameter and space weather data for flight operations. AAS 13-373 (CelesTrak SW format).