From charlesreid1

Some scattered notes on Cantera gas objects.


One of the most important rules about phases is the Gibbs phase rule ( This rule states that the number of degrees of freedom that must be specified for a gas to have a fixed thermodynamic state is given by the formula:

F = C - P + 2


  • F is the number of degrees of freedom,
  • C is the number of components
  • P is the number of phases

Note, however, that the Gibbs phase rule only applies to one particular gas state. If we're looking at two locations at either end of a geometry with non-uniform thermodynamic states, or if we're looking at differential volumes of gas and solid catalyst, the Gibbs phase rule only applies to each individual location separately, independently.

There is more information over at the Chemical Equilibrium page, which has some lecture notes.

Specifying Thermochemical State

The Basics

For a multicomponent mixture of gas containing N components, the thermochemical state of the gas can be specified by specifying N+1 thermodynamic variables.

The gas state can be specified using the set method, which takes a couple of keywords for specifying which variable you wish to set. The following parameters are mass-specific, meaning they are specified per unit mass:

  • Pressure P
  • Temperature T
  • Specific volume V
  • Mass density Rho
  • Mass fractions Y
  • Mole fractions X
  • Enthalpy H
  • Entropy S
  • Internal energy U

(Note that if composition is not specified, it remains unchanged.)

These keywords can be used with the phase set method,

from Cantera import *

g = GRI30()

g.set(X="H2:1.0, CO2:3.0", T=298.15, P=OneAtm)
g.set(P=OneAtm, Rho=0.10)

Specifying Composition

Composition can be specified either as a string, or as an array. If a specified composition sums to greater than 1, the values for each species are normalized.

Specifying composition as a string is the "human method": it ensures the user can specify which species have which quantities, in an arbitrary order.

Specifying composition as an array is the "machine method": it ensures that scripts can pass composition information quickly and easily to gases, without having to translate back and forth between strings or lose information through string formatting.

Let's make a simple gas from an H2O2 oxidation mechanism:

In [11]: g = importPhase('h2o2.cti')

In [12]: g.set(T=298.15,P=OneAtm)

In [13]: g.nSpecies()
Out[13]: 9

In [14]: g.speciesNames()
Out[14]: ['H2', 'H', 'O', 'O2', 'OH', 'H2O', 'HO2', 'H2O2', 'AR']

String Specification

We can specify composition with a string. Using mole fractions first:

In [15]: g.set(X="H2:2.0, O2:1.0")

Using mass fractions:

In [16]: g.set(Y="H2:1.0, O2:8.0")

Vector Specification

Similarly, we can specify composition with a vector. First, we set up the problem by grabbing some information:

In [26]: iO2 = g.speciesIndex('O2')

In [27]: iH2 = g.speciesIndex('H2')

In [28]: nsp = g.nSpecies()

Now we can set our mole fractions:

In [29]: molefracs = zeros(nsp,); molefracs[iO2] = 1; molefracs[iH2] = 2

In [30]: g.set(X=molefracs)

Alternatively, we can set the mass fractions:

In [29]: massfracs = zeros(nsp,); massfracs[iO2] = 1.0; massfracs[iH2] = 8.0

In [30]: g.set(X=massfracs)


Python Interface

The Python interface implements the set() method as a standalone function, in the following file:


The set() method is a wrapper function to methods that individually set thermodynamic property, like setTemperature() or setDensity(), or methods that set pairs of properties, like setState_UV() or setState_HP().

These methods, in turn, are defined in the Phase classes, which themselves utilize the C API to specify these thermodynamic properties.