Usage
Aragog is primarily used as a Python library, either directly via EntropySolver or, in coupled simulations, through the PROTEUS framework wrapper. The standalone command-line interface is minimal and intentional: production runs go through the Python API.
Running Aragog from Python
The minimal workflow is load configuration โ instantiate solver โ set initial entropy โ solve โ read SolverOutput.
from pathlib import Path
from aragog.solver import EntropySolver
# Build a solver from a TOML configuration file and a directory
# of SPIDER-format pressure-entropy EOS tables.
solver = EntropySolver.from_file(
filename="src/aragog/cfg/abe_solid.toml",
eos_dir="data/lookup",
)
solver.initialize()
# When core_bc = "energy_balance", the CMB entropy gradient is part
# of the state vector. If you need to set its initial value explicitly,
# do it BEFORE set_initial_entropy; otherwise the solver derives it
# from S_init via one-sided finite differences.
# solver.set_initial_dSdr_cmb(0.0)
# Set the initial entropy profile at staggered nodes (J/kg/K).
# A scalar S_init produces a uniform isentropic profile.
solver.set_initial_entropy(2900.0)
solver.solve()
# Retrieve a SolverOutput dataclass with profiles, fluxes, and
# scalar diagnostics.
out = solver.get_state()
print(f"Status: {out.status}") # 0 success, -1 failure
print(f"T_magma: {out.T_magma:.0f} K") # surface temperature
print(f"T_core: {out.T_core:.0f} K")
print(f"Phi_global: {out.Phi_global:.4f}")
print(f"F_heat_total: {out.F_heat_total:.3e} W/m^2")
EntropySolver.from_file is a convenience constructor; in PROTEUS, the wrapper builds Parameters and EntropyEOS programmatically and passes them to the constructor directly.
What SolverOutput contains
get_state() returns a SolverOutput dataclass. The fields are flat NumPy arrays except where noted:
Profiles (staggered nodes, length \(N\)):
| Field | Unit | Description |
|---|---|---|
S_final |
J/kg/K | Specific entropy at the end of the integration |
T_stag |
K | Temperature derived from \((P, S)\) via EOS |
phi_stag |
-- | Melt fraction |
rho_stag |
kg/mยณ | Density |
visc_stag |
Paยทs | Dynamic viscosity (after the SPIDER-parity solid/liquid blend) |
Mesh geometry:
| Field | Unit | Description |
|---|---|---|
P_stag |
Pa | Pressure at staggered nodes |
r_basic |
m | Basic-node radii (length \(N+1\)) |
r_stag |
m | Staggered-node radii (length \(N\)) |
vol |
mยณ | Cell volume per staggered node |
mass_stag |
kg | Mass per staggered cell |
Per-component fluxes (basic nodes, length \(N+1\)):
| Field | Unit | Description |
|---|---|---|
jcond_b |
W/mยฒ | Conductive flux |
jconv_b |
W/mยฒ | Convective (MLT) flux |
jgrav_b |
W/mยฒ | Gravitational-separation heat flux |
jmix_b |
W/mยฒ | Chemical-mixing heat flux |
dSdr_b |
J/kg/K/m | Entropy gradient at basic nodes |
phi_basic |
-- | Melt fraction at basic nodes |
T_basic |
K | Temperature at basic nodes |
cp_basic |
J/kg/K | Heat capacity at basic nodes |
rho_basic |
kg/mยณ | Density at basic nodes |
heat_flux |
W/mยฒ | Total heat flux at basic nodes |
heating |
W/kg | Internal heating at staggered nodes (length \(N\)) |
eddy_diff |
mยฒ/s | Thermal eddy diffusivity at basic nodes |
cap_stag |
J/mยณ/K | Capacitance \(\rho T\) at staggered nodes |
Scalar diagnostics:
| Field | Unit | Description |
|---|---|---|
T_magma |
K | Top basic-node temperature; the value passed to the atmosphere module in coupled runs |
T_core |
K | Bottom staggered-node temperature (or the integrated T_core state in bower2018 mode) |
Phi_global |
-- | Mass-weighted mean melt fraction (M_liq / M_mantle) |
Phi_global_vol |
-- | Volume-weighted mean melt fraction (V_liq / V_mantle) |
M_mantle |
kg | Total mantle mass |
M_mantle_liquid |
kg | Liquid mantle mass |
M_mantle_solid |
kg | Solid mantle mass |
RF_depth |
-- | Rheological front depth, \(1 - r_\mathrm{rf}/R_\mathrm{surf}\) |
E_th |
J | Legacy thermal-energy proxy, \(\sum m_i c_p(P_i, S_i) T_i\). Carries phase-dependent jumps in the mushy band; not suitable for energy-conservation residuals. Use E_state_cons for that. |
Cp_eff |
J/kg/K | Mass-weighted mean heat capacity |
F_heat_total |
W/mยฒ | Total surface heat flux |
dt_actual |
yr | Wall-clock integration span achieved by the solver |
status |
int | 0 on success; -1 on solver failure (drives the PROTEUS retry ladder) |
Driving Aragog from PROTEUS
When Aragog is invoked as a PROTEUS submodule, the wrapper (proteus.interior_energetics.aragog.AragogRunner) constructs Parameters from the PROTEUS config object and the current helpfile row, instantiates EntropySolver directly, sets the initial entropy from the previous step (or from a Zalmoxis-derived profile on the first iteration), runs solve(), and reads the results from get_state().
PROTEUS handles:
- The mapping of PROTEUS config keys (
config.interior_energetics.*,config.interior_struct.*) onto Aragog'sParameters. - The choice of EOS table directory (
output/data/aragog_pt/for PALEOS-generated tables, or a SPIDER-bundled directory for parity runs). - The four-column external mesh file (
output/data/zalmoxis_output.datfor Zalmoxis-coupled runs,output/data/spider_mesh.datforspiderordummystructure modes) wheneos_method = 2. - A retry ladder around
solve()that callsset_initial_dSdr_cmb()and_atol_sfto recover after astatus = -1failure.
For an end-to-end coupled run, see the PROTEUS documentation.
Resetting and re-running the solver
To run multiple configurations or restart from a saved entropy profile, call reset() and then set_initial_entropy() again:
solver.reset() # rebuilds the mesh and BCs from current parameters
# Optional in energy_balance mode (must be called BEFORE set_initial_entropy):
# solver.set_initial_dSdr_cmb(dSdr_cmb_new)
solver.set_initial_entropy(S_new)
solver.solve()
out = solver.get_state()
reset() does not change the parameters; mutate solver.parameters first if a different time window or boundary value is needed.
NetCDF output
Standalone Aragog writes a NetCDF snapshot via SolverOutput.to_netcdf(path) (also exposed as EntropySolver.write_netcdf(path) and as aragog run --out path.nc on the CLI). The PROTEUS wrapper builds its own per-iteration int.nc snapshot from SolverOutput arrays for the PROTEUS analysis pipeline; that path is independent. See Inspecting NetCDF output for the snapshot schema.
Logging
aragog.aragog_file_logger(log_dir=output_dir) configures a console+file logger that writes aragog.log into the supplied directory. The logger is shared between the solver and the EOS layer; the standalone path uses it implicitly.
Command-line interface
Aragog exposes the aragog console entry point with seven subcommands: new, list-configs, validate, show-config, run, inspect, and vnv.
The CLI is a thin wrapper over the Python API โ anything it does is also reachable from from aragog.solver import EntropySolver โ but it covers the recommended standalone-user loop without writing Python:
aragog new my_first --from abe_solid
aragog validate my_first.toml
aragog run my_first.toml --eos-dir $FWL_DATA/spider/lookup-fs
aragog inspect my_first.nc
aragog run derives the initial entropy from [initial_condition].surface_temperature when the bundled config provides it (the abe_* templates do); pass --initial-entropy <S0> to override. Repeatable --set <key.path>=<value> flags accept one-shot overrides without editing the TOML. The full subcommand reference, including the --set type-coercion rules, is in Reference: CLI. PROTEUS-coupled runs bypass the CLI and call EntropySolver directly via AragogRunner.