Zalmoxis is the interior structure module of PROTEUS (/ΛproΚtiΙs/, PROH-tee-Ιs), a modular Python framework for the coupled evolution of the atmospheres and interiors of rocky planets and exoplanets. A schematic of PROTEUS components and corresponding modules can be found below. Click any module in the diagram to open its documentation, or navigate to it from the sidebar.
Schematic of PROTEUS components and corresponding modules.
Where Zalmoxis sits in a coupled run
In a PROTEUS coupled run, three submodules deliver mantle physics in a fixed per-iteration order:
| Submodule | Role | State variable |
|---|---|---|
| Outgassing (CALLIOPE / atmodeller) | Volatile partitioning between magma ocean and atmosphere | \(X_i^\mathrm{melt}\), \(X_i^\mathrm{atm}\) |
| Zalmoxis | Static structure: hydrostatic equilibrium, mass-radius, density, gravity, \(R_\mathrm{cmb}\), \(P_\mathrm{cmb}\) | \(\rho(r)\), \(g(r)\), \(P(r)\) |
| Aragog or SPIDER | Thermal evolution: entropy ODE, \(T(r)\) trajectory, surface heat flux | \(S(r)\), \(T(r)\) |
Zalmoxis is the slowest of the three, so PROTEUS gates re-solves on physical-state-change triggers (\(\Delta \phi\), \(\Delta T_\mathrm{magma}\), time-since-call ceilings) rather than calling it every iteration.
The atmosphere is closed by AGNI, JANUS, or a dummy radiative-balance module, depending on the configuration; the surface temperature couples back into the entropy ODE.
Quick links into the coupling docs
The two pages dedicated to PROTEUS coupling are:
-
How to couple Zalmoxis to PROTEUS
Practical TOML recipe: minimal
[interior_struct]block, IC modes (including the newliquidus_superanchor), Newton outer solver, equilibration, update triggers, mesh smoothing, JAX path, the--deterministicflag, common pitfalls. -
Theory of the coupling
Per-iteration control flow with diagram, the dict the wrapper passes to
zalmoxis.solver.main(), the Fei+2021-anchoredliquidus_superIC and the Noack & Lasbleis (2020) mass-aware super-Earth fallback, thezalmoxis_output.datschema contract, volatile-profile \(\phi(r)\) blending, the Newton outer-solver default, the JAX path subtleties.
For the PROTEUS-side documentation (config schema, orchestrator behavior, atmosphere modules, etc.), see proteus-framework.org/PROTEUS.
Standalone vs PROTEUS-coupled
Zalmoxis is also a fully self-contained tool for one-off mass-radius modelling and parameter sweeps. The two modes are configured independently:
| Mode | Entry point | Configuration |
|---|---|---|
| Standalone | python -m zalmoxis -c input/<cfg>.toml |
TOML sections [InputParameter], [AssumptionsAndInitialGuesses], [EOS], [Calculations], [IterativeProcess], [PressureAdjustment], [Output]. Documented under Configuration. |
| PROTEUS-coupled | proteus start -c <run>.toml |
PROTEUS-side TOML sections [planet], [interior_struct], [interior_struct.zalmoxis], plus the relevant [interior_energetics], [outgas], [atmos] blocks. The Zalmoxis-side sections above are not read. Documented in Coupling to PROTEUS. |
The EOS identifier strings (PALEOS:iron, Seager2007:MgSiO3, Chabrier:H, Analytic:graphite, etc.) are common to both modes; only the TOML scaffolding around them differs.
Where the wrapper code lives
Zalmoxis is invoked from PROTEUS via:
proteus/interior_struct/zalmoxis.py: the wrapper that builds the call-time dict, callszalmoxis.solver.main(), writes the Aragog mesh file, and validates the schema contract onzalmoxis_output.dat.proteus/config/_struct.py: the attrs-based schema for[interior_struct.zalmoxis]. All knobs documented in the how-to map back to fields here.proteus/interior_energetics/wrapper.py: hostsequilibrate_initial_state(), the pre-main-loop CALLIOPE + Zalmoxis convergence loop.
These files live in the PROTEUS repository, not in Zalmoxis. Their per-symbol API documentation is rendered in the PROTEUS docs; this site documents the Zalmoxis side of the contract.