Skip to main content
Docs

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

    Tools · Fluids & Thermodynamics

    Flammability Limits Analyzer

    Estimate gas-mixture flammability limits, the limiting oxygen concentration, and fuel–oxygen–inert envelopes, with optional mechanism-based explosion limits.

    Updated November 10, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    Flammability Limits Analyzer answers the gas-phase safety questions behind inerting and purge design: between which fuel concentrations does a blend burn in air, how little oxygen keeps it from burning once nitrogen or carbon dioxide is added, and what the whole flammable region looks like. An optional mode maps where a mixture explodes across temperature and pressure with a kinetic mechanism. It is the gas-phase counterpart of Reaction Calorimetry & Thermal-Safety Model, which covers liquid reactions. It runs on CPU.

    Results are screening estimates. They do not replace measured limits (ASTM E681) or compliance with NFPA 68, NFPA 69, or local codes.

    How it works

    1. Pure-fuel limits. Lower and upper flammability limits in air come from a built-in table of 30 gases and vapors, copied from U.S. Bureau of Mines Bulletin 627 (Zabetakis, 1965; public domain). Values measured above 25 °C keep the temperature the bulletin gives.
    2. Temperature and pressure. Zabetakis's modified Burgess–Wheeler law moves each limit to the requested temperature: the lower limit falls and the upper limit rises in proportion to the temperature change divided by the heat of combustion (computed from NASA thermochemistry). Above 1 atm the upper limit follows the bulletin's natural-gas pressure correlation; the lower limit is left unchanged. The results flag where these rules are extrapolated.
    3. Blends. Le Chatelier's rule combines the fuel limits into the blend's limits.
    4. Cross-check. The calculated adiabatic flame temperature (CAFT) method of Mashuga and Crowl finds where the flame temperature from a Cantera equilibrium calculation reaches a threshold. The threshold is set so that each fuel reproduces its tabulated lower limit, so the two methods agree closely on the lower limit and the comparison mainly tests the upper limit and the temperature rule.
    5. Envelope and LOC. For fuel plus air plus added nitrogen or carbon dioxide, the CAFT method finds the least oxygen that still burns at each fuel fraction. That boundary is the flammability envelope, and its lowest point is the limiting oxygen concentration.
    6. Explosion peninsula (optional). A grid of temperatures and pressures runs 0-D constant-volume or constant-pressure reactors with a built-in or uploaded mechanism. A point explodes when the mixture heats by half its adiabatic rise (50–400 K) before the end time. With the H₂/O₂ mechanism this reproduces the classic second explosion limit.

    Inputs

    • Fuels: one blend of built-in species with mole fractions that sum to 1 (fractions of the fuel blend, not of the fuel–air mixture), or a CSV table of several blends with columns mixture_id, species, mole_fraction. A table gets limits and LOC for every blend, without an envelope.
    • Conditions: initial temperature and pressure, and the inert (nitrogen or carbon dioxide).
    • Envelope: on or off, its resolution, and optionally a fixed CAFT threshold instead of the per-fuel calibration.
    • Peninsula: the mechanism (built-in H₂/O₂ or GRI-Mech 3.0, or your own Cantera YAML or Chemkin file), the fuel and oxidizer in that mechanism's species, the equivalence ratio, and the temperature and pressure ranges (pressure is spaced logarithmically).

    In a workflow, a table from another step can feed mixtures, and a mechanism from RMG Mechanism Generator or Mechanism Reduction can drive the peninsula.

    Outputs

    FileContents
    limits.csvOne row per blend: limits by both methods and their gap, the CAFT threshold, the LOC and the fuel fraction where it occurs, and flags
    envelope.csvThe envelope boundary: least oxygen and most added inert at each fuel fraction, and the air line
    envelope.pngThe fuel–oxygen–inert triangle with the air line, the flammable region, and the LOC
    peninsula.csvEach grid point: temperature, pressure, whether it explodes, and the ignition delay
    peninsula.pngThe explosion map on a logarithmic pressure axis
    summary.jsonThe request, the table rows used with their source page, the methods, and versions

    Reading the results

    • For methane, the calculated LOC is about 2 points of oxygen below the measured value in Bulletin 627 (figure 28). That errs on the safe side for inerting, but it is a model bias, not a tolerance.
    • Hydrogen and fuels with decomposition flames (acetylene, ethylene oxide, hydrazine) are flagged: their tabulated limits are not thermal limits, and the temperature rule and CAFT method fit them poorly. The job stops with an error rather than report a limit when the temperature rule no longer applies.
    • A 0-D reactor has no walls, so the lowest-pressure (first) explosion limit, which comes from radicals destroyed at the vessel wall, is not modelled.

    Not covered

    Autoignition temperature, minimum ignition energy, detonation limits, dust explosions, envelopes richer in oxygen than air, steam as the inert, and fuels outside the built-in table.

    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.

    Flammability Limits Analyzer flammability-limits

    Job type
    flammability-limits
    Hardware
    cpu (default)
    Typical runtime
    1 min on CPU

    Payload

    Provide exactly one of: fuels, mixtures.

    Payload fields
    FieldTypeDescription
    fuels[]object[]

    Limits: min items 1, max items 10

    fuels.speciesrequiredstring

    One of: "1,3-butadiene", "1-butene", "1-propanol", "acetaldehyde", "acetylene", "ammonia", "benzene", "carbon-monoxide", "cyclohexane", "cyclopropane", "dimethyl-ether", "ethane", "ethanol", "ethylbenzene", "ethylene", "ethylene-oxide", "hydrazine", "hydrogen", "isobutane", "isobutylene", "methane", "methanol", "n-butane", "n-heptane", "n-pentane", "neopentane", "propane", "propylene", "propylene-oxide", "toluene"

    fuels.mole_fractionrequirednumber

    Limits: > 0, ≤ 1

    mixturesfile_object
    mixtures.namestring

    Limits: min length 1

    mixtures.filenamestring

    Limits: min length 1

    mixtures.content_b64string

    Limits: min length 1

    mixtures.contentany
    mixtures.bytesany
    temperature_knumber

    Default: 298.15Limits: ≥ 200, ≤ 873.15

    pressure_kpanumber

    Default: 101.325Limits: ≥ 10, ≤ 68900

    inertstring

    Default: "N2"One of: "CO2", "N2"

    envelopeobject
    envelope.enabledboolean
    envelope.grid_pointsinteger

    Default: 41Limits: ≥ 11, ≤ 101

    envelope.caft_threshold_knumber

    Limits: ≥ 1000, ≤ 2000

    peninsulaobject
    peninsula.enabledboolean

    Default: false

    peninsula.mechanismfile_object
    peninsula.mechanism.namestring

    Limits: min length 1

    peninsula.mechanism.filenamestring

    Limits: min length 1

    peninsula.mechanism.content_b64string

    Limits: min length 1

    peninsula.mechanism.contentany
    peninsula.mechanism.bytesany
    peninsula.mechanism_idstring

    One of: "gri30", "h2o2"

    peninsula.phase_namestring

    Limits: min length 1

    peninsula.fuelcomposition
    peninsula.oxidizercomposition
    peninsula.equivalence_rationumber

    Default: 1Limits: > 0, ≤ 20

    peninsula.temperature_kobject
    peninsula.temperature_k.minrequirednumber

    Limits: ≥ 300, ≤ 2000

    peninsula.temperature_k.maxrequirednumber

    Limits: ≥ 300, ≤ 2000

    peninsula.temperature_k.pointsrequiredinteger

    Limits: ≥ 2, ≤ 41

    peninsula.pressure_kpaobject
    peninsula.pressure_kpa.minrequirednumber

    Limits: ≥ 0.001, ≤ 10000

    peninsula.pressure_kpa.maxrequirednumber

    Limits: ≥ 0.001, ≤ 10000

    peninsula.pressure_kpa.pointsrequiredinteger

    Limits: ≥ 2, ≤ 41

    peninsula.reactorstring

    Default: "constant_volume"One of: "constant_pressure", "constant_volume"

    peninsula.end_time_snumber

    Default: 1Limits: > 0, ≤ 10

    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 = {
        "fuels": [
            {"species": "methane", "mole_fraction": 0.8},
            {"species": "ethane", "mole_fraction": 0.15},
            {"species": "propane", "mole_fraction": 0.05},
        ],
        "temperature_k": 298.15,
        "pressure_kpa": 101.325,
        "inert": "N2",
        "envelope": {"enabled": True, "grid_points": 21},
        "peninsula": {
            "enabled": True,
            "mechanism_id": "h2o2",
            "fuel": {"H2": 1},
            "oxidizer": {"O2": 1},
            "equivalence_ratio": 1,
            "temperature_k": {"min": 700, "max": 850, "points": 4},
            "pressure_kpa": {"min": 0.1, "max": 100, "points": 4},
            "reactor": "constant_volume",
            "end_time_s": 1,
        },
    }
    
    estimate = client.jobs.estimate(job_type="flammability-limits", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-flammability-limits-run",
        job_type="flammability-limits",
        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
    • Table · optionalCSV

    Workflow outputs

    • ArchiveZIP
    • TableCSV
    • TableCSV
    • TableCSV