Fipy and Cantera
From charlesreid1
Contents
Cantera Evaluation of Properties
Some notes, from an algorithmic perspective, on hooking up Cantera with a finite-volume solver for computing solutions.
Using the Python interface to Cantera, if I create a gas phase object, I can see all the methods available for that gas phase:
In [1]: from Cantera import * In [2]: g = GRI30() In [3]: dir(g) Out[3]: ['_Transport__tr_id', '__del__', '__doc__', '__init__', '__module__', '__repr__', '_end', '_equilmap', '_models', '_name', '_np', '_owner', '_phase_id', '_phnum', '_sp', 'activationEnergies', 'addTransportModel', 'advanceCoverages', 'atomicWeights', 'binaryDiffCoeffs', 'chemPotentials', 'ckin', 'clear', 'cp_R', 'cp_mass', 'cp_mole', 'creationRates', 'cv_mass', 'cv_mole', 'delta_G', 'delta_G0', 'delta_H', 'delta_H0', 'delta_S', 'delta_S0', 'density', 'desc', 'destructionRates', 'diffusionCoeffs', 'electricPotential', 'elementIndex', 'elementName', 'elementNames', 'elementPotentials', 'enthalpies_RT', 'enthalpy_mass', 'enthalpy_mole', 'entropies_R', 'entropy_mass', 'entropy_mole', 'equilibrate', 'equilibriumConstants', 'fwdRateConstants', 'fwdRatesOfProgress', 'gibbs_RT', 'gibbs_mass', 'gibbs_mole', 'idtag', 'intEnergy_mass', 'intEnergy_mole', 'isReversible', 'kin_index', 'kineticsSpeciesIndex', 'kineticsStart', 'kineticsType', 'kinetics_hndl', 'massFluxes', 'massFraction', 'massFractions', 'maxTemp', 'meanMolarMass', 'meanMolecularWeight', 'minTemp', 'mixDiffCoeffs', 'model', 'molarDensity', 'molarFluxes', 'molarMasses', 'moleFraction', 'moleFractions', 'molecularWeights', 'multiDiffCoeffs', 'multiplier', 'nAtoms', 'nElements', 'nPhases', 'nReactions', 'nSpecies', 'name', 'netProductionRates', 'netRatesOfProgress', 'phase', 'phase_id', 'pressure', 'productStoichCoeff', 'productStoichCoeffs', 'reactantStoichCoeff', 'reactantStoichCoeffs', 'reactionEqn', 'reactionPhaseIndex', 'reactionString', 'reactionType', 'refPressure', 'restoreState', 'revRateConstants', 'revRatesOfProgress', 'saveState', 'selectElements', 'selectSpecies', 'set', 'setDensity', 'setElectricPotential', 'setMassFractions', 'setMolarDensity', 'setMoleFractions', 'setMultiplier', 'setName', 'setParameters', 'setPressure', 'setState_HP', 'setState_PX', 'setState_PY', 'setState_SP', 'setState_SV', 'setState_TNX', 'setState_TP', 'setState_TPX', 'setState_TPY', 'setState_TR', 'setState_TRX', 'setState_TRY', 'setState_UV', 'setTemperature', 'sourceTerms', 'speciesIndex', 'speciesName', 'speciesNames', 'switchTransportModel', 'temperature', 'thermalConductivity', 'thermalDiffCoeffs', 'thermo_hndl', 'thermophase', 'transport_hndl', 'transport_id', 'trnsp', 'verbose', 'viscosity', 'volume_mass'] |
Wow. That's a lot of methods. And that's exactly why we want to interface with Cantera from an equation solver.
The Cantera Outline page contains a comprehensive list of pages on Cantera and its formulations. Those pages cover how to do things with these gas objects.
Diffusion
Covered here:
Called through the methods:
g.mixDiffCoeffs()
g.multiDiffCoeffs()
Note that if we use multicomponent diffusion coefficients, we have to specify that when we create the gas:
Wrong:
In [4]: g = GRI30()
In [5]: g.multiDiffCoeffs()
---------------------------------------------------------------------------
error Traceback (most recent call last)
<ipython-input-5-c8f3cc1dc781> in <module>()
----> 1 g.multiDiffCoeffs()
/Users/charlesreid/codes/cantalysis/build/lib/python2.7/site-packages/Cantera/Transport.pyc in multiDiffCoeffs(self)
156 coefficients. Not implemented in all transport managers."""
157 return _cantera.tran_multiDiffCoeffs(self.__tr_id,
--> 158 self.trnsp)
159
160 def setParameters(self, type, k, params):
error:
************************************************
Cantera Error!
************************************************
Procedure: Transport Base Class
Error:
**** Method getMultiDiffCoeffs not implemented in model 0 ****
(Did you forget to specify a transport model?)
Correct:
In [6]: g = GRI30('Multi') In [7]: g.multiDiffCoeffs() Out[7]: array([[ 0.00000000e+00, 2.16211927e-04, 1.08401378e-04, ..., 4.68401619e-05, 5.73411067e-05, 5.73117527e-05], [ 2.16211927e-04, 0.00000000e+00, 2.16802755e-04, ..., 9.36803238e-05, 1.14682213e-04, 1.14623505e-04], [ 1.08401378e-04, 2.72421028e-05, 0.00000000e+00, ..., 5.90173041e-06, 7.22482032e-06, 7.22112180e-06], ..., [ 4.68401619e-05, 9.88416546e-06, 4.95558763e-06, ..., 0.00000000e+00, 2.62135856e-06, 2.62001664e-06], [ 5.73411067e-05, 1.01255679e-05, 5.07661871e-06, ..., 2.19360351e-06, 0.00000000e+00, 2.68400570e-06], [ 5.73117527e-05, 9.89389411e-06, 4.96046525e-06, ..., 2.14341368e-06, 2.62393867e-06, 0.00000000e+00]])
Fipy-Only Pieces
A simple transient problem with Fipy:
0D Reaction Equation
A Fipy script that will solve a very simple 0D reaction equation:
with reaction source terms computed by Cantera.
0D Reaction Model: Batch Reactor
Filpy script that solves the 0D reaction equation, as well as other governing equations, for a 0D batch reactor model.
Fipy and Cantera/Batch Reactor
1D Convection-Reaction Equation
Using Fipy+Cantera to solve the one-dimensional convection reaction equation:
Fipy and Cantera/1D Convection Reaction
1D Convection-Reaction Model: Axial Profile
Once you can solve the one-dimensional convection reaction equation, you can reproduce an axial profile model for a PFR.
Fipy and Cantera/PFR Axial Profile Model
1D Diffusion Equation
A 1D diffusion problem solved by Fipy, with diffusion coefficients computed by Cantera. Illustrates how to solve a variable-diffusivity problem and sweep over the solution.