Skip to main content
Docs

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

    Tools · Fluids & Thermodynamics

    Microkinetic Catalysis Analyzer

    Steady-state turnover frequencies, coverages, degree of rate control, and volcano scans for a catalytic surface mechanism.

    Updated November 10, 2026

    On this page

    Prices, workflows, and method papersOpen in the app

    Microkinetic Catalysis Analyzer runs a heterogeneous catalytic mechanism in a mean-field microkinetic model with Cantera. It reports what catalysis groups usually want from such a model:

    • turnover frequencies and surface coverages across temperature, pressure, and feed;
    • apparent activation energies;
    • which elementary steps control the rate;
    • where the Sabatier maximum lies for a binding-energy descriptor you declare.

    Cantera runs reactor networks and flames; this tool adds the catalysis analysis on top of a surface mechanism. It runs on CPU.

    How it works

    1. Steady state. At each grid point the gas is held at the given temperature, pressure, and composition: a differential reactor with no conversion. The surface coverages are solved to steady state from the mechanism's initial coverages. Turnover frequency (TOF) is the net production rate of a gas species per surface site, in 1/s; a negative value means the species is consumed. A point that does not converge is reported as such, never filled in.

    2. Apparent activation energy. With two or more temperatures, Eapp = −R · d ln TOF / d(1/T) is fitted for each pressure, feed, and TOF species.

    3. Degree of rate control. For each elementary step, Campbell's ζ = ∂ ln r / ∂ ln k with the step's equilibrium constant held fixed. It is computed by scaling the step's rate constants by 1 ± 1 %. Many surface mechanisms write adsorption and desorption as two irreversible reactions; by default the pair is perturbed together as one step. Over a complete mechanism the ζ values sum to 1, and the job warns when they do not.

    4. Descriptor scan (optional). You declare a descriptor shift D in kJ/mol:

      • each listed species' enthalpy moves by coefficient × D;
      • each listed reaction's barrier moves by its BEP slope × the change in reaction enthalpy, clipped at zero.

      The job reports TOF against D at each grid point and locates the volcano maximum. A maximum at the end of the range is flagged.

    5. Uncertainty (optional). A seeded Latin-hypercube sweep perturbs every step's pre-exponential factor (log-uniform, default ±1 decade) and activation energy (uniform, default ±10 kJ/mol). The job reports 5th, 50th, and 95th percentile TOFs. It is a sensitivity band, not a calibrated posterior.

    Inputs

    • The mechanism: a built-in platinum mechanism (mechanism_id), or your own Cantera YAML uploaded or taken from an artifact. The built-ins are pt_ch4_combustion (CH4 oxidation, Deutschmann et al. 1996) and pt_ch4_pox (CH4 partial oxidation, Quiceno et al. 2006). Your YAML needs an ideal-surface phase over a gas phase, with thermodynamic data for every species. It can have up to 200 species and 500 surface reactions.
    • The grid: temperatures (200–3000 K), pressures, and labelled gas compositions as mole fractions, up to 200 combinations in all.
    • TOF species: the gas species to report rates for, such as CO2 or H2O.
    • Reaction references: BEP relations and perturbation subsets name reactions by 0-based position in the surface phase's reaction list. The tool page lists them for the built-ins.

    Outputs

    FileContents
    steady_state.csvTOF per species and coverage per surface species at every grid point
    apparent_ea.csvFitted apparent activation energy, R², and temperature range
    rate_control.csvDegree of rate control of every step at every grid point, ranked
    descriptor_scan.csvTOF against the descriptor at every grid point (when requested)
    uncertainty.csv5th / 50th / 95th percentile TOFs and the converged fraction (when requested)
    summary.jsonMechanism size, rate-control sums, volcano maxima, and warnings
    *.pngArrhenius, coverage, rate-control, and volcano plots

    In a workflow, each converged grid point is one record with a turnover_frequency metric, so a filter step can keep the most active conditions.

    Not covered

    • Kinetic Monte Carlo or explicit lateral interactions beyond those in the mechanism.
    • Conversion, transport, and reactor models: the gas phase is fixed.
    • Finding descriptors: the scan analyzes the relation you declare.
    • Generating or fitting rate parameters: use Kinetic Parameter Fitter or Transition-State-Theory Rate Calculator.
    • Electrocatalysis with potential-dependent barriers.

    Estimate single-step rates with Transition-State-Theory Rate Calculator, build species thermochemistry with NASA / Cantera Species Builder, and run full reactor networks with 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.

    Microkinetic Catalysis Analyzer microkinetic-analyze

    Job type
    microkinetic-analyze
    Hardware
    cpu (default)
    Typical runtime
    2 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: "pt_ch4_combustion", "pt_ch4_pox"

    surface_phasestring

    Limits: min length 1, max length 128

    gas_phasestring

    Limits: min length 1, max length 128

    conditionsrequiredobject
    conditions.temperatures_k[]requirednumber[]

    Limits: min items 1, max items 50

    conditions.pressures_pa[]number[]

    Default: [101325]Limits: min items 1, max items 10

    conditions.compositions[]requiredcomposition[]

    Limits: min items 1, max items 10

    conditions.compositions.labelstring

    Limits: min length 1, max length 64

    conditions.compositions.mole_fractionsrequiredmap<string, number>
    tof_species[]requiredstring[]

    Limits: min items 1, max items 10

    rate_controlobject
    rate_control.enabledboolean

    Default: true

    rate_control.target_speciesstring

    Limits: min length 1, max length 128

    rate_control.relative_stepnumber

    Default: 0.01Limits: ≥ 0.0001, ≤ 0.1

    rate_control.pair_irreversibleboolean

    Default: true

    descriptor_scanobject
    descriptor_scan.labelstring

    Limits: min length 1, max length 64

    descriptor_scan.start_kj_molrequirednumber

    Limits: ≥ -300, ≤ 300

    descriptor_scan.stop_kj_molrequirednumber

    Limits: ≥ -300, ≤ 300

    descriptor_scan.n_pointsrequiredinteger

    Limits: ≥ 2, ≤ 41

    descriptor_scan.species_shifts[]requiredobject[]

    Limits: min items 1, max items 50

    descriptor_scan.species_shifts.speciesrequiredstring

    Limits: min length 1, max length 128

    descriptor_scan.species_shifts.coefficientnumber

    Default: 1Limits: ≥ -10, ≤ 10

    descriptor_scan.bep[]object[]

    Limits: max items 200

    descriptor_scan.bep.reactionrequiredinteger

    Limits: ≥ 0, ≤ 499

    descriptor_scan.bep.sloperequirednumber

    Limits: ≥ 0, ≤ 1

    descriptor_scan.target_speciesstring

    Limits: min length 1, max length 128

    uncertaintyobject
    uncertainty.samplesinteger

    Default: 32Limits: ≥ 8, ≤ 200

    uncertainty.pre_exponential_decadesnumber

    Default: 1Limits: ≥ 0, ≤ 3

    uncertainty.activation_energy_kj_molnumber

    Default: 10Limits: ≥ 0, ≤ 50

    uncertainty.seedinteger

    Default: 0Limits: ≥ 0, ≤ 2147483647

    uncertainty.reactions[]integer[]

    Limits: min items 1, max items 500

    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": "pt_ch4_combustion",
        "conditions": {
            "temperatures_k": [700, 800, 900, 1000],
            "pressures_pa": [101325],
            "compositions": [
                {
                    "label": "lean_ch4_air",
                    "mole_fractions": {"CH4": 0.095, "O2": 0.21, "AR": 0.695},
                },
            ],
        },
        "tof_species": ["CO2", "H2O"],
        "rate_control": {
            "enabled": True,
            "target_species": "CO2",
            "relative_step": 0.01,
            "pair_irreversible": True,
        },
        "descriptor_scan": {
            "label": "O binding shift",
            "start_kj_mol": -40,
            "stop_kj_mol": 120,
            "n_points": 17,
            "species_shifts": [{"species": "O(S)", "coefficient": 1}],
            "bep": [{"reaction": 5, "slope": 1}],
            "target_species": "CO2",
        },
        "uncertainty": {
            "samples": 16,
            "pre_exponential_decades": 1,
            "activation_energy_kj_mol": 10,
            "seed": 0,
        },
    }
    
    estimate = client.jobs.estimate(job_type="microkinetic-analyze", payload=payload, resource="cpu")
    print(f"Reserves ${estimate.cost:.2f}")
    
    job = client.jobs.submit(
        job_name="my-microkinetic-analyze-run",
        job_type="microkinetic-analyze",
        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

    Workflow outputs

    • TableCSV
    • ArchiveZIP
    • TableCSV
    • TableCSV
    • TableCSV
    • TableCSV