Interior Structure Model
Zalmoxis solves the coupled ordinary differential equations (ODEs) of hydrostatic equilibrium for a differentiated planet with 2 to 3 compositionally distinct layers (iron core, silicate mantle, and optional water/ice envelope). Given a total planet mass, layer mass fractions, and a per-layer equation of state (EOS) specification, the code iteratively determines self-consistent radial profiles of pressure, density, gravity, and enclosed mass from the center to the surface.
Several EOS families are supported (see Equations of State for detailed physics):
- PALEOS (recommended): all stable phases per material in a single file, \(T\)-dependent with \(\nabla_{\mathrm{ad}}\), up to 50 \(M_\oplus\)
- PALEOS-2phase: separate solid/liquid tables with explicit melting curve control (MgSiO\(_3\) only)
- Seager et al. (2007): merged tabulated EOS at 300 K
- Wolf & Bower (2018): temperature-dependent RTpress EOS (\(\leq 7\,M_\oplus\))
- RTPress100TPa: extended melt table to 100 TPa
- Chabrier H/He: pure H\(_2\) EOS for sub-Neptune interiors (use as mixing component)
- Analytic polytrope: fast closed-form approximation, no data files
Layers can contain multiple materials mixed by volume additivity, with phase-aware suppression of non-condensed volatiles.
Governing Equations
The internal structure model assumes hydrostatic and thermodynamic equilibrium within each layer.
Starting from the center and integrating outward, the code solves the following coupled ODEs using scipy.integrate.solve_ivp (explicit Runge-Kutta, RK45):
where \(M(r)\) is the enclosed mass within radius \(r\), \(\rho(r)\) is the local density, \(g(r)\) is the gravitational acceleration, \(P(r)\) is the pressure, and \(G\) is the gravitational constant.
The density \(\rho(P)\) (or \(\rho(P, T)\) when a temperature-dependent EOS is used) closes the system at each radial shell.
Per-Layer EOS Architecture
Configuration format
Each structural layer is assigned its own EOS via a string of the form "<source>:<composition>" in the [EOS] section of the TOML configuration file:
[EOS]
core = "PALEOS:iron"
mantle = "PALEOS:MgSiO3"
ice_layer = "" # empty = 2-layer model
Layer boundaries are determined by cumulative mass fractions: a radial shell belongs to the core when \(M(r) < M_{\mathrm{core}}\), to the mantle when \(M_{\mathrm{core}} \le M(r) < M_{\mathrm{core}} + M_{\mathrm{mantle}}\), and to the outer ice layer (if present) otherwise.
The function get_layer_mixture() in structure_model.py maps the enclosed mass at each integration step to the appropriate per-layer EOS string, which is then dispatched to calculate_density().
The per-layer system allows arbitrary mixing of tabulated and analytic EOS across layers (for instance, an analytic iron core with a temperature-dependent silicate mantle) without modifying the solver.
A legacy global-string format is still accepted for backward compatibility via parse_eos_config().
Each layer can also contain multiple materials mixed by volume additivity.
The config format uses + to combine materials with mass fractions: "PALEOS:MgSiO3:0.85+PALEOS:H2O:0.15".
See the multi-material mixing page for the full mixing model, including the phase-aware density suppression that prevents non-condensed volatiles from dominating the mixture.
In the PROTEUS ecosystem, mixing fractions are set by CALLIOPE (solubility model) or PROTEUS (volatile trapping in the mantle) at runtime via LayerMixture.update_fractions().
Valid per-layer EOS identifiers
| Identifier | Source | Material | Temperature |
|---|---|---|---|
PALEOS:iron |
PALEOS | Fe (5 phases) | \(T\)-dependent (\(\leq 50\,M_\oplus\)), includes \(\nabla_{\mathrm{ad}}\) |
PALEOS:MgSiO3 |
PALEOS | MgSiO\(_3\) (6 phases) | \(T\)-dependent (\(\leq 50\,M_\oplus\)), includes \(\nabla_{\mathrm{ad}}\) |
PALEOS:H2O |
PALEOS | H\(_2\)O (7 EOS) | \(T\)-dependent (\(\leq 50\,M_\oplus\)), includes \(\nabla_{\mathrm{ad}}\) |
PALEOS-2phase:MgSiO3 |
PALEOS (2-phase variant) | MgSiO\(_3\) (solid + liquid) | \(T\)-dependent (\(\leq 50\,M_\oplus\)), includes \(\nabla_{\mathrm{ad}}\) |
Seager2007:iron |
Tabulated | Fe (\(\epsilon\)) | 300 K |
Seager2007:MgSiO3 |
Tabulated | MgSiO\(_3\) perovskite | 300 K |
Seager2007:H2O |
Tabulated | Water ice (VII/VIII/X) | 300 K |
WolfBower2018:MgSiO3 |
Tabulated | MgSiO\(_3\) (solid + melt) | \(T\)-dependent (\(\leq 7\,M_\oplus\)) |
RTPress100TPa:MgSiO3 |
Tabulated | MgSiO\(_3\) (solid + melt) | \(T\)-dependent (\(\leq 50\,M_\oplus\)) |
Chabrier:H |
Chabrier+2019/2021 | Pure H\(_2\) (molecular, atomic, ionized) | \(T\)-dependent, \(\nabla_{\mathrm{ad}}\) |
Analytic:<material> |
Analytic fit | Any of 6 materials | 300 K |
See Equations of State for detailed physics of each EOS family.
Validity Ranges
By EOS type
| EOS | Pressure range | Temperature | Max planet mass | Notes |
|---|---|---|---|---|
Seager2007:iron |
0 to \(10^{16}\) Pa | 300 K (fixed) | ~50 \(M_\oplus\) | Vinet + DFT + TFD |
Seager2007:MgSiO3 |
0 to \(10^{16}\) Pa | 300 K (fixed) | ~50 \(M_\oplus\) | 4th-order BME + DFT + TFD |
Seager2007:H2O |
0 to \(10^{16}\) Pa | 300 K (fixed) | ~50 \(M_\oplus\) | Experimental + DFT + TFD |
WolfBower2018:MgSiO3 |
0 to \(10^{12}\) Pa (1 TPa) | 0 to 16500 K | 7 \(M_\oplus\) | RTpress; \(P\) clamped at table edge, \(T\) out-of-bounds raises error |
RTPress100TPa:MgSiO3 |
\(10^3\) to \(10^{14}\) Pa (100 TPa) | 400 to 50,000 K | 50 \(M_\oplus\) | Extended melt table; solid from WB2018 (clamped at 1 TPa) |
PALEOS-2phase:MgSiO3 |
1 bar to 100 TPa | 300 to 100,000 K | 50 \(M_\oplus\) | Solid + liquid with \(\nabla_{\mathrm{ad}}\); 75%/53% grid fill |
PALEOS:iron |
1 bar to 100 TPa | 300 to 100,000 K | 50 \(M_\oplus\) | Unified 5-phase Fe with \(\nabla_{\mathrm{ad}}\) |
PALEOS:MgSiO3 |
1 bar to 100 TPa | 300 to 100,000 K | 50 \(M_\oplus\) | Unified 6-phase MgSiO\(_3\) with \(\nabla_{\mathrm{ad}}\) |
PALEOS:H2O |
1 bar to 100 TPa | 100 to 100,000 K | 50 \(M_\oplus\) | Unified 7-EOS H\(_2\)O with \(\nabla_{\mathrm{ad}}\) |
Chabrier:H |
1 Pa to \(10^{22}\) Pa | 100 to \(10^8\) K | -- | Pure H\(_2\); use as mixing component only |
Analytic:* |
0 to \(10^{16}\) Pa | 300 K (fixed) | ~50 \(M_\oplus\) | 2 to 12% accuracy vs. tabulated |
General limits
- Mass range: The model is designed for rocky and water-rich planets in the range \(\sim 0.1\) to \(50 \, M_{\oplus}\).
Below \(\sim 0.1 \, M_{\oplus}\), the assumption of hydrostatic equilibrium and the EOS parameterizations become unreliable.
Above \(\sim 50 \, M_{\oplus}\), the planet enters the gas-giant regime. The
Chabrier:HEOS supports dissolved H\(_2\) as a mixing component in the mantle, but Zalmoxis does not model a free H/He envelope as a separate structural layer. - Pressure range: The Seager et al. (2007) tabulated and analytic EOS are valid up to \(P \sim 10^{16}\) Pa (\(10^{10}\) GPa), which exceeds central pressures for all planets within the supported mass range. The WolfBower2018 tables are limited to ~1 TPa; out-of-bounds pressures are clamped to the table edge (see EOS Physics > Wolf & Bower 2018).
- Temperature range (Wolf & Bower 2018 only): The \(P\)-\(T\) tables cover 0 to 16500 K; the code raises a
ValueErrorif the requested temperature falls outside this grid. Out-of-bounds pressures are clamped to the table edge (see above), but out-of-bounds temperatures are not. The Seager et al. (2007) EOS (both tabulated and analytic) is evaluated at a fixed 300 K and carries no temperature dependence. - Composition: Multi-material volume-additive mixing is supported within layers (see Multi-material mixing). Layer boundaries (core/mantle/ice) remain sharp. Non-condensed volatile components are smoothly suppressed to prevent unphysical density deflation.