Fipy and Cantera: Difference between revisions
From charlesreid1
| Line 2: | Line 2: | ||
Some notes, from an algorithmic perspective, on hooking up Cantera with a finite-volume solver for computing solutions. | 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: | |||
{{Scroll box | |||
|content= | |||
<source lang="python"> | |||
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'] | |||
</source> | |||
}} | |||
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: | |||
* [[Cantera/Diffusion]] | |||
* [[Cantera/Diffusion Coefficients]] | |||
Called through the methods: | |||
* <code>g.mixDiffCoeffs()</code> | |||
* <code>g.multiDiffCoeffs()</code> | |||
Note that if we use multicomponent diffusion coefficients, we have to specify that when we create the gas: | |||
<source lang="python"> | |||
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?) | |||
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]]) | |||
</source> | |||
=Fipy-Only Pieces= | =Fipy-Only Pieces= | ||
Revision as of 18:06, 13 January 2014
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:
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?)
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:
$ \frac{d C_j }{dt} = \sum_{i=1}^{N_{rxns}} r_{ij} $
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.