From charlesreid1

(Created page with "=0D Reaction= A Fipy script that will solve an ODE of the form: <math> \frac{d C_j }{dt} = \sum_{i=1}^{N_{rxns}} r_{ij} </math> where the reaction source terms are computed by...")
 
 
(9 intermediate revisions by the same user not shown)
Line 1: Line 1:
=0D Reaction=
=Cantera Evaluation of Properties=


A Fipy script that will solve an ODE of the form:
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=
<pre>
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']
</pre>
}}
 
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:
 
'''Wrong:'''
 
<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?)
 
</source>
 
'''Correct:'''
 
<pre>
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]])
</pre>
 
=Fipy-Only Pieces=
 
A simple transient problem with Fipy:
* [[Fipy/Simple Transient Problem]]
* [[Fipy/Multiple Variable Transient Problem]]
 
=0D Reaction Equation=
 
A Fipy script that will solve a very simple 0D reaction equation:


<math>
<math>
Line 7: Line 252:
</math>
</math>


where the reaction source terms are computed by Cantera.
with reaction source terms computed by Cantera.


[[Fipy and Cantera/0D Reaction]]
[[Fipy and Cantera/0D Reaction]]


=1D Diffusion=
==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.
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.


[[Fipy and Cantera/1D Diffusion]]
[[Fipy and Cantera/1D Diffusion]]
==1D Diffusion Model: Boundary Value Problem==
[[Fipy and Cantera/PFR Boundary Value Problem]]

Latest revision as of 07:40, 17 April 2017

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:

$ \frac{d C_j }{dt} = \sum_{i=1}^{N_{rxns}} r_{ij} $

with reaction source terms computed by Cantera.

Fipy and Cantera/0D Reaction

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.

Fipy and Cantera/1D Diffusion

1D Diffusion Model: Boundary Value Problem

Fipy and Cantera/PFR Boundary Value Problem