Skip to main content
Docs

Search guides and API endpoints, for example “Idempotency-Key” or “submit job”.

    Tools · Fluids & Thermodynamics

    Rocket Nozzle Performance

    Equilibrium combustion products, characteristic velocity and specific impulse from frozen, shifting-equilibrium and finite-rate nozzle expansion.

    Updated November 10, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    How much thrust per unit of propellant does a combination deliver? Rocket Nozzle Performance answers the classic NASA CEA question with Cantera: it finds the equilibrium products in the combustion chamber, computes the characteristic velocity c*, and expands the gas through a quasi-1-D nozzle to give specific impulse, thrust coefficient and exit conditions over a map of area or pressure ratios. On published CEA cases (H2/O2, CH4/O2 and LH2/LOX at 1000 psia) c* and Isp agree with CEA to better than 0.1 %. It runs on CPU.

    How it works

    1. Chamber. Fuel and oxidizer streams mix by mass at your O/F ratio (or an equivalence ratio). By default the chamber is adiabatic: the products are equilibrated at the propellants' enthalpy and the chamber pressure. You can fix the chamber temperature instead. The chamber is treated as an infinite-area combustor, so its state is the stagnation state of the expansion.
    2. Expansion. Along the nozzle the entropy and total enthalpy stay at their chamber values. Frozen expansion keeps the chamber composition; shifting equilibrium re-equilibrates at every pressure. Real nozzles fall between the two, so both are reported, each with its own sound speed and effective γ: the spread between them is the honest uncertainty of a one-number Isp.
    3. Throat and exit. The throat is where the flow speed equals the sound speed; c* is the chamber pressure divided by the throat mass flux. Each exit point, given as an area ratio A/A* or a pressure ratio p_c/p_e, yields vacuum Isp, ambient Isp at your back pressure, thrust coefficients and exit Mach.
    4. Finite rate (optional). With a mechanism that has reactions, the supersonic section can also be integrated with finite-rate chemistry along the nozzle contour. It starts from the equilibrium state just past the throat, so the result lands between the frozen and equilibrium values.
    5. Checks. Every row carries its element-balance error, the area ratio is solved to a 10⁻⁶ residual, and equilibrium Isp is checked against frozen. Where graphite would be thermodynamically stable (fuel-rich carbon propellants), the job flags it; it does not form solid carbon.

    Inputs

    • Thermochemistry: built-in h2o2 or gri30 (mechanism_id), or your own Cantera YAML or single CHEMKIN file, uploaded or from an artifact. Extra species thermo, for example custom propellant species from NASA / Cantera Species Builder, can be added as species_thermo.
    • Propellants: fuel and oxidizer compositions (mole amounts, such as CH4:1), each with a temperature and, for cryogenic liquids, an assigned enthalpy (about −4470 kJ/kg for liquid hydrogen and −405.6 kJ/kg for liquid oxygen at their boiling points). Then an O/F mass ratio or an equivalence ratio.
    • Chamber and exit: chamber pressure, adiabatic or fixed temperature, the back pressure (0 for vacuum), and the exit area and pressure ratios to map.
    • Nozzle contour: a conical nozzle (half-angles, contraction ratio, exit area ratio, number of stations) or your own table of axial position and A/A*. The contour sets the profile stations and the finite-rate path.
    • Efficiencies: an optional c* efficiency and divergence factor. Delivered values apply them; ideal values are always reported alongside.

    Outputs

    FileContents
    performance.csvPer mode and exit point: area and pressure ratio, exit T / p / Mach / velocity, γ (isentropic and frozen), c*, thrust coefficients, vacuum / ambient / exit Isp, delivered values, and a flow-separation flag
    profiles.csvPer mode and contour station: x, A/A*, pressure, temperature, density, velocity, Mach, γ, element-balance error, graphite activity and mole fractions
    isp_map.png, profiles.pngVacuum Isp against area ratio; temperature and Mach along the nozzle
    summary.jsonChamber and throat states, contour, efficiencies, invariant checks, warnings and model limits

    Not covered

    • Boundary layers, two-phase flow, heat transfer and plume modeling: ambient Isp is a back-pressure correction that assumes attached flow.
    • Finite-area combustion chambers and condensed products.
    • 2-D nozzle flow, bell-contour design and air-breathing cycles.

    Build species thermo with NASA / Cantera Species Builder, generate or reduce mechanisms with RMG Mechanism Generator and Mechanism Reduction, and run single equilibrium or flame calculations in Cantera.

    Run it from the API

    Submit with Submit a job and the job_type below. Price it first with Estimate job reservation cost: submitting reserves that amount from your wallet, and the charge settles at the actual runtime.

    Rocket Nozzle Performance nozzle-performance

    Job type
    nozzle-performance
    Hardware
    cpu (default)
    Typical runtime
    1 min on CPU

    Payload

    Provide exactly one of: mechanism, mechanism_id.

    Payload fields
    FieldTypeDescription
    mechanismfile_object
    mechanism.namestring

    Limits: min length 1

    mechanism.filenamestring

    Limits: min length 1

    mechanism.content_b64string

    Limits: min length 1

    mechanism.contentany
    mechanism.bytesany
    mechanism_idstring

    One of: "gri30", "h2o2"

    phase_namestring

    Limits: min length 1

    species_thermofile_object
    species_thermo.namestring

    Limits: min length 1

    species_thermo.filenamestring

    Limits: min length 1

    species_thermo.content_b64string

    Limits: min length 1

    species_thermo.contentany
    species_thermo.bytesany
    propellantsrequiredany
    propellants.fuelrequiredobject
    propellants.fuel.compositionrequiredcomposition
    propellants.fuel.temperature_krequirednumber

    Limits: > 0, ≤ 6000

    propellants.fuel.enthalpy_j_per_kgnumber

    Limits: ≥ -1000000000, ≤ 1000000000

    propellants.oxidizerrequiredobject
    propellants.oxidizer.compositionrequiredcomposition
    propellants.oxidizer.temperature_krequirednumber

    Limits: > 0, ≤ 6000

    propellants.oxidizer.enthalpy_j_per_kgnumber

    Limits: ≥ -1000000000, ≤ 1000000000

    propellants.of_rationumber

    Limits: > 0, ≤ 1000

    propellants.equivalence_rationumber

    Limits: > 0, ≤ 100

    chamberrequiredobject
    chamber.pressure_parequirednumber

    Limits: > 0, ≤ 100000000

    chamber.modestring

    Default: "hp"One of: "hp", "tp"

    chamber.temperature_knumber

    Limits: > 0, ≤ 6000

    expansionobject
    expansion.modes[]string[]

    Default: ["frozen","equilibrium"]One of: "frozen", "equilibrium"Limits: min items 1, max items 2

    expansion.finite_rateboolean

    Default: false

    exitrequiredobject
    exit.area_ratios[]number[]

    Limits: max items 200

    exit.pressure_ratios[]number[]

    Limits: max items 200

    ambient_pressure_panumber

    Default: 101325Limits: ≥ 0, ≤ 10000000

    contourconical_contour | table_contour
    efficienciesobject
    efficiencies.c_starnumber

    Default: 1Limits: ≥ 0.5, ≤ 1

    efficiencies.divergencenumber

    Limits: ≥ 0.5, ≤ 1

    File fields take {"name": "x.pdb", "content_b64": "…"} or a stored artifact, {"$artifact": {"id": "art-…", "port": "…"}}. Files are up to 25 MiB each.

    Example

    from cognichem_client import CogniChem
    
    client = CogniChem.from_env()  # reads COGNICHEM_API_KEY
    payload = {
        "mechanism_id": "h2o2",
        "propellants": {
            "fuel": {"composition": {"H2": 1}, "temperature_k": 298.15},
            "oxidizer": {"composition": {"O2": 1}, "temperature_k": 298.15},
            "of_ratio": 6,
        },
        "chamber": {"mode": "hp", "pressure_pa": 6894757.293168},
        "expansion": {"modes": ["frozen", "equilibrium"], "finite_rate": False},
        "exit": {"area_ratios": [10, 40], "pressure_ratios": [68.046]},
        "ambient_pressure_pa": 101325,
        "contour": {
            "type": "conical",
            "convergent_half_angle_deg": 30,
            "divergent_half_angle_deg": 15,
            "contraction_ratio": 4,
            "exit_area_ratio": 40,
            "throat_radius_m": 0.05,
            "n_stations": 20,
        },
        "efficiencies": {"c_star": 0.98},
    }
    
    estimate = client.jobs.estimate(job_type="nozzle-performance", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-nozzle-performance-run",
        job_type="nozzle-performance",
        payload=payload,
        resource="cpu",
    )
    status = client.jobs.wait(job.process_id)
    if status.status == "completed":
        client.jobs.result(job.process_id, save_path=".")

    Sample data from the job catalog; long values are shortened here. Each job_name must be unique among your jobs.

    Workflow inputs

    • Kinetic mechanism · optionalYAML, CHEMKIN
    • Kinetic mechanism · optionalYAML

    Workflow outputs

    • ArchiveZIP
    • TableCSV
    • TableCSV