Skip to main content

Combustion equilibrium solver for Python

Project description

Prometheus

Prometheus is an open-source Python package for chemical equilibrium and rocket-combustion analysis. It parses multiple thermo-data formats, builds a unified species database, and solves equilibrium problems such as adiabatic chamber combustion (HP) and isentropic nozzle expansion (SP).

Project Status

Pre-1.0 (v0.1), active development. Core solver infrastructure, all thermo-data parsers, and the desktop GUI are complete. The recommended solver is GordonMcBrideSolver. Expect breaking changes to the API and data formats before 1.0.

Roadmap

Core Solver

  • Implement PEPSolver._tp_equilibrium (currently raises NotImplementedError).
  • Add optional numerical-stability fallback modes for difficult edge cases.
  • Add lightweight profiling hooks to report per-iteration timing and major matrix-solve costs.
  • Investigate using species-database entries directly as propellant ingredients (e.g. methane, oxygen).

GUI

  • Full report export (TXT / CSV / JSON) including sweep metadata and plots.
  • Cancel support for long sweep runs in PerformanceWorker.
  • Persist user session settings (units, database selection, sweep mode, recent inputs).

CLI and Tooling

  • Non-interactive solve CLI for HP/TP/SP runs with machine-readable output (--json / --csv).
  • Benchmark baseline mode in tests/benchmark.py with threshold-based pass/fail for CI.

Features

Thermodynamic databases

  • NASA-7 and NASA-9 (including CEA-derived polynomials)
  • JANAF tables
  • TERRA / Shomate-equivalent (translated from binary)
  • AFCESIC ionic and condensed species (translated and calibrated)

Equilibrium problem types: TP, HP, SP, TV, UV, SV

Solvers

Solver Role Convergence Mean T error vs RocketCEA Speed
GordonMcBrideSolver Recommended 100 % 0.017 % ~14 ms/case
MajorSpeciesSolver Alternative 95.9 % 0.023 % ~235 ms/case
PEPSolver Not yet implemented

Rocket performance: frozen and shifting isentropic nozzle expansion with c*, Isp (vacuum, sea-level, and actual), and area ratio.

Shifting nozzle expansion uses full-mixture entropy as the SP isentrope constraint.

Desktop GUI (prometheus-gui): PySide6 interface for propellant composition, database selection, sweep runs (O/F or Pc), and result visualisation including solver convergence plots, nozzle expansion curves, and per-station performance charts.

Installation

Install from PyPI

pip install prometheus-equilibrium           # solver + propellant database
pip install "prometheus-equilibrium[gui]"    # + PySide6 desktop GUI

Install from source (development)

Requires uv.

git clone https://github.com/1ckendall/Prometheus
cd Prometheus
uv sync          # installs all dependencies including dev tools and GUI

Quick Start

from prometheus_equilibrium.equilibrium import (
    SpeciesDatabase,
    EquilibriumProblem,
    ProblemType,
    GordonMcBrideSolver,
)

db = SpeciesDatabase()
db.load()   # NASA-7, NASA-9, TERRA loaded by default

h2 = db.find("H2", phase="G")
o2 = db.find("O2", phase="G")
products = db.get_species({"H", "O"}, max_atoms=6)

T_react = 298.15
H0 = h2.enthalpy(T_react) * 2.0 + o2.enthalpy(T_react) * 1.0

problem = EquilibriumProblem(
    reactants={h2: 2.0, o2: 1.0},
    products=products,
    problem_type=ProblemType.HP,
    constraint1=H0,
    constraint2=30e5,   # 30 bar
    t_init=3500.0,
)

solution = GordonMcBrideSolver().solve(problem)
print(solution.summary())

Launch the desktop GUI:

uv run prometheus-gui

For a longer walkthrough, open demonstration.ipynb.

Propellant Database

Prometheus ships a TOML propellant database covering hundreds of ingredients (AP, HTPB, aluminium, MMH, UDMH, N₂O₄, kerosene, and many more) converted from PROPEP. PropellantDatabase.mix() returns a PropellantMixture with the element set, reactant moles, and total H₀ pre-computed. Pass the mixture directly to PerformanceSolver.solve_from_mixture() to get paired frozen and shifting results in one call:

from prometheus_equilibrium.equilibrium import SpeciesDatabase, PerformanceSolver
from prometheus_equilibrium.propellants import PropellantDatabase

db = SpeciesDatabase()
db.load()

prop_db = PropellantDatabase()
prop_db.load()

# AP/Al/HTPB composite solid propellant (68/18/14 by mass)
mixture = prop_db.mix([
    ("AMMONIUM_PERCHLORATE",     0.68),
    ("ALUMINUM_PURE_CRYSTALINE", 0.18),
    ("HTPB_R_45HT",              0.14),
])

result = PerformanceSolver().solve_from_mixture(
    mixture, db,
    p_chamber=70e5,    # 70 bar
    area_ratio=10.0,
)

print(f"T_chamber = {result.shifting.chamber.temperature:.0f} K")
print(f"c*        = {result.shifting.cstar:.1f} m/s")
print(f"Isp (vac, shifting) = {result.shifting.isp_vac:.1f} m/s")
print(f"Isp (vac, frozen)   = {result.frozen.isp_vac:.1f} m/s")

For liquid bipropellants:

mixture = prop_db.mix([("HYDRAZINE", 1.0), ("NITROGEN_TETROXIDE_LIQ", 1.33)])

Use prop_db.ingredient_ids and prop_db.formulation_ids to browse available ingredients. Named formulations stored in the TOML can be loaded with prop_db.expand("formulation_id").

Documentation

Online: https://prometheus-equilibrium.readthedocs.io/en/latest/

Build locally:

uv run --group docs sphinx-build -b html docs docs/_build/html

The docs include:

  • API reference — every public class and function with docstrings
  • Thermodynamic database guide — polynomial formats and reference-state calibration across NASA-9, TERRA, and AFCESIC
  • Solver comparison — algorithm analysis and implementation notes for MajorSpeciesSolver, GordonMcBrideSolver, and PEP

Development

uv sync                              # install everything (dev tools, GUI deps, test deps)
uv run pytest                        # run the test suite
uv run pytest -m "not integration"   # fast suite (no RocketCEA required)
uv run python tests/benchmark.py     # benchmark 170 cases vs RocketCEA
uv run prometheus-build-all-thermo   # re-generate all compiled thermo databases
uv run prometheus-build-legacy all   # re-generate TERRA + AFCESIC from binaries

Package Layout

prometheus_equilibrium/
  core/constants.py              element masses, R, P° = 1×10⁵ Pa
  equilibrium/
    species.py                   Chemical, Species hierarchy, SpeciesDatabase
    mixture.py                   Mixture (mutable moles array + all properties)
    element_matrix.py            ElementMatrix, basis selection
    problem.py                   EquilibriumProblem, ProblemType
    solution.py                  EquilibriumSolution + derived properties
    solver.py                    MajorSpeciesSolver, GordonMcBrideSolver, PEPSolver
    performance.py               Frozen / shifting nozzle expansion
  propellants/loader.py          PropellantDatabase, TOML-based definitions
  thermo_data/                   Compiled JSON/CSV databases + raw source files
  tools/                         CLI build scripts (prometheus-build-*)
  gui/                           PySide6 desktop interface

Validation

Prometheus is cross-referenced against multiple existing solver implementations:

tests/benchmark.py runs 170 cases (H₂/O₂, CH₄/O₂, N₂H₄/N₂O₄, NH₃/O₂ across 11 O/F ratios × 5 pressures) and reports temperature, molar mass, γ, Cₚ, and speed-of-sound error against RocketCEA.

Contributing

  • Open an issue first to discuss the change.
  • Add or update tests for any behaviour change.
  • Keep docstrings in Google style (Args:, Returns:, etc.).
  • Pre-commit hooks (black + isort) run automatically on every commit after the one-time setup:
uv sync
uv run pre-commit install

License

GPL-3.0-or-later. See LICENSE.txt.

Acknowledgements

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prometheus_equilibrium-0.1.4.tar.gz (16.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

prometheus_equilibrium-0.1.4-py3-none-any.whl (4.1 MB view details)

Uploaded Python 3

File details

Details for the file prometheus_equilibrium-0.1.4.tar.gz.

File metadata

  • Download URL: prometheus_equilibrium-0.1.4.tar.gz
  • Upload date:
  • Size: 16.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for prometheus_equilibrium-0.1.4.tar.gz
Algorithm Hash digest
SHA256 c144c49ada4702dbd31fbd62c8f3f2eeb42818070940f16a6ec088508dedd219
MD5 cf75a206d879ad39eb68ba8d52ace9f2
BLAKE2b-256 0a47875a23b14f25c54d8b0a271e3ab4d0f5c3f2ffeb19319a9deace9d5cae7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for prometheus_equilibrium-0.1.4.tar.gz:

Publisher: python-publish.yml on 1ckendall/Prometheus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file prometheus_equilibrium-0.1.4-py3-none-any.whl.

File metadata

File hashes

Hashes for prometheus_equilibrium-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6e019cc04dace8e7fb26c05447637b64c55b2a19c0d46147e7eadfb0937b6c70
MD5 8b89588b05b586a913d47a245bc01837
BLAKE2b-256 6ec847667a6f716e048b9e7919a64191d10458f24bc748745861200c8f531f22

See more details on using hashes here.

Provenance

The following attestation bundles were made for prometheus_equilibrium-0.1.4-py3-none-any.whl:

Publisher: python-publish.yml on 1ckendall/Prometheus

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page