{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# II - Equilibrium calculations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Equilibrium explanations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Equilibrium calculations** are usually performed to obtain the adiabatic flame temperature, the equilibrium composition, and the thermodynamic state of a specific mixture under given conditions. These are virtually performed in every simulation.
\n",
"For example, Cantera will call its equilibrium solver to initialize the gas state before trying to obtain a solution to the equations for a free flame. As such, it is interesting to understand how Cantera proceeds."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"There are 2 different types of solver currently implemented for equilibrium calculation in Cantera that\n",
"deserves our attention :\n",
"- **The element potential 'ChemEquil' solver**
\n",
"The class ChemEquil implements a chemical equilibrium solver for single-phase solutions. It is a\n",
"\"non-stoichiometric\" solver in the terminology of Smith and Missen, meaning that every intermediate\n",
"state is a valid chemical equilibrium state, but does not necessarily satisfy the element constraints.\n",
"
\n",
"Non-stoichiometric methods are faster when they converge, but stoichiometric ones tend to be more\n",
"robust.\n",
"- **The 'VCS' chemical equilibrium solver**
\n",
"The other type of solver is designed to be used to set a mixture containing one or more phases to\n",
"a state of chemical equilibrium. It uses a \"stoichiometric\" algorithm, in which each intermediate\n",
"state satisfies the element constraints but is not a state of chemical equilibrium. \n",
"
\n",
"More specifically, it\n",
"implements the VCS algorithm, described in Smith and Missen, \"Chemical Reaction Equilibrium\". It\n",
"finds a set of component species and a complete set of formation reactions for the non-components in\n",
"terms of the components."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"As expected, the **ChemEquil solver is the fastest** of the Cantera equilibrium solvers for many single-\n",
"phase equilibrium problems (particularly if there are only a few elements but very many species), **but\n",
"can be less stable**.
\n",
"Problem situations include low temperatures where only a few species have non-zero\n",
"mole fractions, precisely stoichiometric compositions (we will see an example shortly). In general, if\n",
"speed is important, this solver should always be tried first before falling back to another one in case of\n",
"failure."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The function equilibrate"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The default setting in Cantera, when launching an equilibrium calculation without specifying\n",
"the solver, is to try the 'vcs' before falling back to another vcs solver labelled 'gibbs' :\n",
"\n",
"gas.equilibrate('TP')\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The equilibrate function can be applied on a single phase or on a mixture. Here, we recall its definition:\n",
"\n",
"equilibrate(self, XY, solver, double rtol, int maxsteps, int maxiter, int loglevel)\n",
"
\n",
"
\n",
"Parameters:\n",
"\n",
"XY - A two-letter string, which must be one of the set: ['TP','TV','HP','SP','SV','UV'].\n",
"solver - Specifies the equilibrium solver to use. May be one of the following :\n",
" element_potential = A fast solver using the element potential method.\n",
" gibbs = A slower but more robust Gibbs minimization solver.\n",
" vcs = The VCS non-ideal equilibrium solver.\n",
" auto = The element potential solver will be tried first, then if it fails the gibbs solver will be\n",
" tried.\n",
"rtol - The relative error tolerance.\n",
"maxsteps - Maximum number of steps in composition to take to find a converged solution.\n",
"maxiter - This specifies the number of outer iterations on T or P when some property pair other than TP is\n",
" specified (only for 'gibbs').\n",
"loglevel - Determines the amount of output displayed during the solution process. 0 indicates no output, while larger numbers produce successively more verbose information.\n",
"
\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Useful python imports"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import cantera as ct\n",
"import numpy as np\n",
"import csv\n",
"from matplotlib import *\n",
"import matplotlib.pyplot as plt\n",
"import sys"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. Simple homogeneous equilibrium of a gas"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"