Contents
- Introduction
- Mixture
- Elements
- Thermodynamic Databases
- Reaction Mechanisms
- Collision Integral Database (work in progress)
- Gas-Surface Interaction
The data files distributed with Mutation++ are located in one of the subdirectories under the data directory as follows:
- data
- mechanisms chemical reaction mechanisms
- mixtures mixture definitions
- thermo elemental and species thermodynamic databases
- transfer internal energy transfer model databases
- transport @subpage collisions "collision integral database"
- gsi gas-surface interaction mechanism
Mutation++ is aware of its data_directory
. It defaults to the MPP_DATA_DIRECTORY
environment variable, which should have been setup during the installation of Mutation++ and usually points to the aforementioned data directory.
In addition, Mutation++ is aware of the working_directory
, where an executable that utilizes Mutation++ is being run. Mixture files may also be in the working directory.
When a data file name
.ext
is requested, Mutation++ searches for it looking up locations in the following order:
working_directory
/name
.ext
working_directory
/dir
/name
.ext
data_directory
/name
.ext
data_directory
/dir
/name
.ext
where dir
is any subdirectory. In practice, it allows a user to supersede a default data file with their own, by simply locating it in the working directory.
Many of these files are written in a simplified version of the Extensible Markup Language (XML). XML provides a human readable, yet complex and extensible format for data to be stored with only a few, limited rules. An example XML fragment is shown below.
<!-- Comment string -->
<root_tag attribute="value">
<child1_tag>
text
</child1_tag>
<child2_tag attribute="another value" />
</root_tag>
An XML document begins with a root element. Every element (or node) must begin
with a tag that identifies what type of element it is. The root element depicted in
the example is of type root_tag
. Every element also ends with an end-tag
which signifies the end of the element. Each element may have as many attribute / value
pairs as is desired following the element's tag. Each pair must consist of an attribute
name followed by an equal sign and the value of the attribute in quotations.
Between the tag and end-tag of an element, an element may also contain one or more child elements or text (but not both). From the figure, the root element contains two child elements named child1_tag
and child2_tag
. Note that the first child element is an example of an element which contains text instead of more child elements. The second child element is an example of a short-hand format for elements which only contain attributes. For such elements, a full end-tag is not necessary. Instead, simply putting />
after the attribute list is sufficient to end the element. Finally, comments can be inserted anywhere outside of element tags. Comment strings begin with <!--
and end with -->
and can be spread over multiple lines.
Mixture files are located in the data/mixtures
directory. They are the primary
input mode in Mutation++ because they provide the list of species to be loaded as
well as any options that can be used to control the behavior of Mutation++.
<!-- Example mixture file -->
<mixture thermo_db="RRHO">
<!-- Species list -->
<species>
N2 N2+ N N+ e-
</species>
</mixture>
The following options are available as attributes in the mixture
element. If an attribute is not given, then the bold value is taken as the default.
Attribute | Possible Values | Description |
---|---|---|
mechanism |
none, name | name of reaction mechanism |
thermal_conductivity |
CG , LDLT, Wilke |
choice of heavy particle translational thermal conductivity algorithm |
thermo_db |
RRHO, NASA-7 , NASA-9 |
choice of thermodynamic database |
state_model |
ChemNonEq1T, ChemNonEqTTv , Equil , EquilTP |
choice of state model |
viscosity |
CG , Gupta-Yos , LDLT, Wilke |
choice of viscosity algorithm |
A species list descriptor tells Mutation++ which species to load from the chosen thermodynamic database. The simplest version of a descriptor is a list of species names separated by white space as in the example mixture above.
A species list can also contain a more generic descriptor which allows the user to choose species based on a given set of rules. For now, the rule simply allows to choose all species in a particular category which contain certain elements from a list. The format for this descriptor is
{ category with element_list }
where category
can be one of the following strings:
gases
selects from all gases in the databaseliquids
selects from all liquids in the databasesolids
selects from all solids in the databasecondensed
combinesliquids
andsolids
- all selects from all species in the database
The element_list
should be a comma-separated list of element names.
A rule can also be combined with a list of species names. For example, if you
want a mixture with all gas species containing the elements C,H,O and graphite, the
species node would look like the following:
<species>
{gases with C,H,O,e-} C(gr)
<species>
Note that the electron is also included in the above example. This allows ions in the mixture because they are treated as species with the fake "electron element" (see the Elements section for more details).
Species Names
Species names given in any data file, must obey the following rules:
- the characters
"
,{
,}
,=
,<
,>
, and spaces are not allowed - the first character cannot be a numeric digit
- placing
(#)
(where#
represents a whole number) at the end of a name indicates the#
th electronic energy level of that species.- example:
N2(3)
is the 4th electronic level of N2 because the index begins at 0 - note that this only works if the thermodynamic database being used includes electronic energy levels for that species
- example:
A list of species may not be represented internally in Mutation++ in the same order they are specified in the species list descriptor. Mutation++ places the species in an order which makes indexing the species the most convenient. In general, the following steps are taken to order the species:
- if present, the electron is placed at the beginning of the list
- gas species are placed in front of condensed phase species
- if electronic states are specified for any species, they are expanded in place
- finally, species take the order given in the list descriptor
A good way to see how the species are actually ordered in Mutation++ is to check the mixture with the checkmix program.
Named elemental compositions can be included in the mixture file which can then be retrieved inside Mutation++. Many of the tools included with Mutation++ can also use this information to simplify input on the command line. An example of a list of element compositions for the 11-species Air mixture are shown below.
<element_compositions default="air1">
<composition name="air1"> e-:0.0, N:0.79, O: 0.21 </composition>
<composition name="air2"> e-:0.0, N:0.80, O: 0.20 </composition>
</element_compositions>
Note that if the default
attribute is used as above, the composition with the
name in the default
value will be use as the default composition when computing
equilibrium calculations. If no default is specified, then the first composition is used by default.
Element names and molecular weights are stored in the elements.xml
file in the
data/thermo
directory. Each element is given as an XML node in the file. An
example of the Nitrogen XML node is given as
<!-- Nitrogen -->
<element name="N">
<mw units="g/mol">14.0067</mw>
</element>
Note that the electron is treated like an element in Mutation++ and should not be
changed in the elements.xml
file. In general, most of the known elements are
already given in elements.xml
and it is unlikely that it should need to be
modified.
Constants | Format | Columns |
---|---|---|
Line 1 | - | - |
Species name | A18 |
1-18 |
Date code | A6 |
19-24 |
Atomic symbols and formula | 4(A2,I3) |
25-44 |
Phase of species (S, L, G for solid, liquid, gas) | A1 |
45 |
Low temperature | F10.0 |
46-55 |
High temperature | F10.0 |
56-65 |
Common temperature (blank for default of 1000 K) | F8.0 |
66-73 |
Atomic symbols and formula (blank if not needed) | A2,I3 |
74-78 |
The integer '1' | I1 |
80 |
Line 2 | - | - |
Coefficients a_1-a_5 for upper temperature range | 5(F15.8) |
1-75 |
The integer '2' | I1 |
80 |
Line 3 | - | - |
Coefficients b_1 and b_2 for upper temperature range | 2(F15.8) |
1-30 |
Coefficients a_1-a_3 for lower temperature range | 3(F15.8) |
31-75 |
The integer '3' | I1 |
80 |
Line 4 | - | - |
Coefficients a_4-a_5 for lower temperature range | 2(F15.8) |
1-30 |
Coefficients b_1 and b_2 for lower temperature range | 2(F15.8) |
31-60 |
The integer '4' | I1 |
80 |
N L 6/88N 1 0 0 0G 200.000 6000.000 1000. 1
0.24159429E+01 0.17489065E-03-0.11902369E-06 0.30226244E-10-0.20360983E-14 2
0.56133775E+05 0.46496095E+01 0.25000000E+01 0.00000000E+00 0.00000000E+00 3
0.00000000E+00 0.00000000E+00 0.56104638E+05 0.41939088E+01 0.56850013E+05 4
Constants | Format | Columns |
---|---|---|
Line 1 | - | - |
Species name | A24 |
1-24 |
Comments (data source) | A56 |
25-80 |
Line 2 | - | - |
Number of T intervals | I2 |
2 |
Optional identification code | A6 |
4-9 |
Chemical formulas, symbols, and numbers | 5(A2,F6.2) |
11-50 |
Zero for gas, nonzero for condensed phases | I1 |
52 |
Molecular weight | F13.5 |
53-65 |
Heat of formation at 298.15 K, J/mol | F13.5 |
66-80 |
Line 3 | - | - |
Temperature range | 2F10.3 |
2-21 |
Number of coefficients for |
I1 |
23 |
T exponents in polynomial for |
8F5.1 |
24-63 |
|
F15.3 |
66-80 |
Line 4 | - | - |
First five coefficients for |
5F16.8 |
1-80 |
Line 5 | - | - |
Last three coefficients for |
3F16.8 |
1-48 |
Integration constants b_1 and b_2 | 2F16.8 |
49-80 |
Repeat 3, 4, and 5 for each interval... | - | - |
N2 Ref-Elm. Gurvich,1978 pt1 p280 pt2 p207.
3 tpis78 N 2.00 0.00 0.00 0.00 0.00 0 28.0134000 0.000
200.000 1000.0007 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 0.0 8670.104
2.210371497D+04-3.818461820D+02 6.082738360D+00-8.530914410D-03 1.384646189D-05
-9.625793620D-09 2.519705809D-12 7.108460860D+02-1.076003744D+01
1000.000 6000.0007 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 0.0 8670.104
5.877124060D+05-2.239249073D+03 6.066949220D+00-6.139685500D-04 1.491806679D-07
-1.923105485D-11 1.061954386D-15 1.283210415D+04-1.586640027D+01
6000.000 20000.0007 -2.0 -1.0 0.0 1.0 2.0 3.0 4.0 0.0 8670.104
8.310139160D+08-6.420733540D+05 2.020264635D+02-3.065092046D-02 2.486903333D-06
-9.705954110D-11 1.437538881D-15 4.938707040D+06-1.672099740D+03
<!-- Nitrogen diatomic -->
<species name="N2">
<stoichiometry>
N: 2
</stoichiometry>
<thermodynamics type="RRHO">
<linear>
yes
</linear>
<rotational_temperature units="K">
2.886
</rotational_temperature>
<steric_factor>
2
</steric_factor>
<vibrational_temperatures units="K">
3408.464
</vibrational_temperatures>
<electronic_levels units="1/cm">
<level degeneracy="1" energy="0.0" />
<level degeneracy="3" energy="50203.5" />
<level degeneracy="6" energy="59619.2" />
<level degeneracy="6" energy="59808.0" />
<level degeneracy="3" energy="66272.5" />
<level degeneracy="1" energy="68152.7" />
<level degeneracy="2" energy="69283.0" />
<level degeneracy="2" energy="72097.6" />
<level degeneracy="5" energy="77600.0" />
<level degeneracy="1" energy="85200.0" />
<level degeneracy="6" energy="86800.0" />
<level degeneracy="6" energy="89136.7" />
<level degeneracy="10" energy="93000.0" />
<level degeneracy="6" energy="97603.0" />
<level degeneracy="6" energy="104600.0" />
</electronic_levels>
<formation_enthalpy T="298 K" P="1 atm" units="J/mol">
0.0
</formation_enthalpy>
</thermodynamics>
</species>
A mechanism name referenced in a mixture file will correspond to a file with an .xml extension in the mechanisms directory. A mechanism file describes a reaction mechanism which is a set of elementary reactions.
Mechanism files begin with a root element called mechanism
. A name
attribute may be
given but it is ignored. The name of the mechanism is determined by the filename (without
the .xml
extension).
The root mechanism
element may have any number of child elements which correspond to
reaction elements or unit specifiers.
Below is an example reaction
element
<reaction formula="N2+M=2N+M">
<arrhenius A="7.0E+21" n="-1.6" T="113200." />
<M>N2:3,N:4</M>
</reaction>
reaction
elements must contain a formula
attribute which specifies the reaction
formula for the given reaction. The formula
string must obey the following rules:
- species names are separated by the
+
symbol - an
M
in the reactant and product lists indicate a thirdbody reaction (note that this character is reserved and cannot be a species name) - stoichiometric coefficients must directly precede a species name (if the coefficient is
a
1
, then it can be left out) - reactants and products must be separated by one of the following
=
indicates a reversible reaction=>
indicates an irreversible reaction
- a maximum of 3 reactants and products are allowed
If the reaction is a thirdbody reaction, thirdbody efficiency factors can be specified in
a M
child node of the reaction
element. The M
text should be a list of of
colon-separated pairs of species names and efficiency factor, each separated by commas
such as in the example above. Any efficiency factors which are not specified default to
a value of 1. Free electrons do not participate in thirdbody reactions.
Rate Laws
A reaction
element must contain a child node which describes which rate law to use
when evaluating the forward rate coefficient. The rate law node is specified by the tag
and its corresponding attributes correspond to the parameters for that given rate law. The
following rate rate laws are currently supported.
-
arrhenius
$k(T) = A\, T^n\, \exp \left( \frac{-E_a}{R_u T} \right)$
Att. | Value |
---|---|
A |
pre-exponential factor |
n |
temperature exponent |
Ea |
activation energy |
T |
characteristic temperature |
note: only one of Ea
or T
may be used, not both
A unit specifier element is used to specify the units of the parameters in each rate law
if needed. A unit specifier element is denoted by a tag which has _units
appended to
the rate law tag (ie: arrhenius_units
). Unit specifiers can be placed anywhere in a
reaction mechanism and will apply to all rate laws of that type for reactions listed after
the unit specifier. The attributes of the unit specifier element correspond to the
parameters of the rate law. Some parameters need units specified for several physical
quantities (such as mass, length, time, etc.). These will be separated by commas.
arrhenius_units
Att. | Value | Description |
---|---|---|
A |
quantity, length, time, temperature | units of pre-exponential factor |
E |
energy, quantity, temperature | units of activation energy and characteristic temperature |
As an example of how to create a mechanism file, consider the following example reaction mechanism for a 5-species Nitrogen mixture of N2, N2+, N, N+ and e- with each reaction controlled by an Arrhenius rate law.
# | Formula | A [mol,cm,s,K] | n | Ea [K] |
---|---|---|---|---|
1 | N2 + N2 <-> 2N + N2 | 1.0e21 | -1.6 | 113200 |
2 | N2 + N <-> 2N + N | 3.0e21 | -1.6 | 113200 |
3 | N2 + N^+ <-> 2N + N+ | 1.0e21 | -1.6 | 113200 |
4 | N2 + e- <-> 2N + e- | 7.0e22 | -1.6 | 113200 |
5 | N + e- <-> N+ + e- + e- | 2.5e30 | -3.82 | 168200 |
6 | N + N <-> N2+ + e- | 4.4e7 | 1.5 | 67500 |
Reactions 1-4 in the above example have the same rate constants except for the
pre-exponential factor differ only by the thirdbody species, making them good candidates
to combine into a generic thirdbody reaction with efficiency factors. However, free
electrons cannot be thirdbodies in Mutation++, so reaction 4 must be treated separately.
Note also that N2+ is not a possible thirdbody in reactions 1-4, thus its efficiency
factor should be zero. The remaining reactions, 5-6, should be specified normally. The
resulting mechanism file example.xml
is given below.
<!-- Example mechanism for 5-species N2 mix -->
<mechanism name="example">
<arrhenius_units A="mol,cm,s,K" E="kcal,mol,K" />
<!-- # 1-3 -->
<reaction formula="N2+M=2N+M">
<arrhenius A="1.0E+21" n="-1.6" T="113200." />
<M> N:3, N2+:0 </M>
</reaction>
<!-- # 4 -->
<reaction formula="N2+e-=2N+e-">
<arrhenius A="7.0E+22" n="-1.6" T="113200." />
</reaction>
<!-- # 5 -->
<reaction formula="N+e-=N++e-+e-">
<arrhenius A="2.5E+30" n="-3.82" T="168200." />
</reaction>
<!-- # 6 -->
<reaction formula="N+N=N2++e-">
<arrhenius A="4.4E+07" n="+1.50" T="67500." />
</reaction>
</mechanism>
This is a work in in progress.
The collision integral database is provided in the data/transport/collisions.xml
file.
This page documents how collision integral data is stored and configured. In particular,
- how to define collision pairs,
- how to use different collision integral models,
- how to tune the default behavior,
- how to specify global options,
- and finally, how to provide species-specific data needed for some collision integral models.
All collision integral databases must be contained within a collisions
XML element as
follows.
<collisions>
<!-- All data corresponding to collision pairs and integrals go here -->
</collisions>
The most basic node type which can be given as a child of collisions
is a pair
node, which specifies an individual collision pair.
<pair s1="first species name" s2="second species name">
<!-- Specify models for each collision integral kind here -->
</pair>
The pair
node has two attributes, s1
and s2
, which are the names of the two
interacting species in the pair. Child nodes can then be given which provide the
data necessary to compute any of the collision integrals for that pair. The format
of the collision integral nodes is described next.
Specific collision integral data are provided as XML nodes with the node tag as the name of the collision integral kind. For example, to specify the $`\overline{Q}^{(1,1)}``$integral for the N-O interaction pair, use
<pair s1="N" s2="O">
<Q11 type="model" />
</pair>
where the type
attribute is the collision integral model to use. The attributes and
possible child nodes or text needed in the collision integral XML node depends on the
type of model being used.
The following table summarizes the various collision integral types which are
available. Additional information, including their respective XML format, can
be found in the following subsections.
type | Description |
---|---|
Bruno-Eq(11) |
Implements the curve-fit found in Eq. (11) of Bruno et al. (2010) |
Bruno-Eq(17) |
Implements the curve-fit found in Eq. (17) of Bruno et al. (2010) |
Bruno-Eq(19) |
Implements the curve-fit found in Eq. (19) of Bruno et al. (2010) |
constant |
Constant value |
Debye-Huckel |
Based on Debye-Huckel potential (Coulomb potential, screened by Debye length) |
exp-poly |
Exponential polynomial |
from A* |
Uses A* relationship to compute missing integral |
from B* |
Uses B* relationship to compute missing integral |
from C* |
Uses C* relationship to compute missing integral |
Langevin |
Based on the Langevin potential |
Murphy |
Implements Eq. (5) of Murphy (1995) for combining elastic and inelastic interactions |
Pirani |
Implements the Pirani potential, using the approximate curve-fits of Laricchiuta et al. (2007) |
ratio |
Ratio of another integral |
table |
Tabulated data |
warning |
Prints a warning if used |
Regardless of the type
, all collision integral nodes can specify the following
attributes.
Attribute | Description |
---|---|
accuracy |
The estimated accuracy of the integral in percent off true value |
multpi |
(yes or no ) Should the integral be multiplied by |
ref |
A reference for the data |
units |
The units of the integral provided by the data |
Note that while theoretically any name can be used as a tag for specifying collision
integrals, the following names are reserved for use within the various transport
algorithms: Q11
, Q12
, Q13
, Q14
, Q15
, Q22
, Q23
, Q24
, Ast
, Bst
, and
Cst
.
The following code snippet taken from the collisions.xml
file provided with the library
shows the specification of the collision integrals needed for the N2-N2 interaction.
<pair s1="N2" s2="N2">
<Q11 type="table" units="K,Å-Å" multpi="yes" ref="Wright2005" accuracy="10">
300 600 1000 2000 4000 6000 8000 10000,
12.23 10.60 9.79 8.60 7.49 6.87 6.43 6.06 </Q11>
<Q22 type="table" units="K,Å-Å" multpi="yes" ref="Wright2005" accuracy="10">
300 600 1000 2000 4000 6000 8000 10000,
13.72 11.80 10.94 9.82 8.70 8.08 7.58 7.32 </Q22>
</pair>
Note that the values of B* and C* which are also need for the neutral-neutral interaction are not shown because they are specified through default behaviour.
Implements the curve-fit found in Eq. (11) of Bruno et al. (2010),
where
<Q11 type="Bruno-Eq(11)">
15.09506044 -1.25710008 9.57839369 -3.80371463
0.98646613 9.25705877 -0.93611707
</Q11>
Implements the curve-fit found in Eq. (17) of Bruno et al. (2010) for modeling charge exchange interactions,
where
<Q11 type="Bruno-Eq(17)"> 6.3544e+01 -5.0093e+00 9.8797e-02 </Q11>
Implements the curve-fit found in Eq. (19) of Bruno et al. (2010) for modeling electron-neutral interactions,
where
<Q11 type="Bruno-Eq(19)">
1.035291134e+1 -1.583011620e+0 1.245844036e+1 -2.328519000e-1
5.366285730e-2 -5.343729290e+0 9.355617520e+0 -2.154634270e+0
</Q11>
Uses a constant value for the collision integral.
<Q11 type="constant" value="1.0e-20"/>
Models interactions between charged particles using the screened Coulomb potential shielded by the Debye length, known as the Debye-Huckle potential. The tables of precomputed collision integrals provided by Mason, Munn, and Smith (1967) and Devoto (1973) are used to implement the integrals. The following code snippet shows how to use this model.
<Q11 type="Debye-Huckel"/>
Note the actual value of the integral will depend on the kind of collision integral
(or ratio) such as Q11
or Ast
and whether or not the interaction is repulsive
or attractive.
Implements an exponential polynomial curve-fit expression of the form
where
<Q11 type="exp-poly">
-4.942712e-03 1.113337e-01 -9.844008e-01 6.435295e+00
</Q11>
Note that the coefficients are given in reverse order and any number of coefficients can be used.
Uses relationship from A*
type for the missing integral, as in
<Q11 type="from A*"/>
and provide concrete types for the other two.
Uses relationship from B*
type for the missing integral, as in
<Q11 type="from B*"/>
and provide concrete types for the other three.
Uses relationship from C*
type for the missing integral, as in
<Q11 type="from C*"/>
and provide concrete types for the other two.
The Langevin (polarization) potential has been used extensively for modeling ion-neutral interactions and represents a special case of the inverse power potential. A closed form analytical solution of the collision integral using this potential is given as
where
<Q11 type="Langevin">
Note that the values of Q11
) and
Implements Eq. (5) of Murphy (1995) for combining elastic and inelastic interactions, where
where
<Q11 type="Murphy">
<Q1 type="Bruno-Eq(11)">
46.68783791 -0.33303803 4.25686770 -2.03851201
14.98170958 8.59618369 -1.65616736 </Q1>
<Q2 type="Bruno-Eq(17)">
6.3544e+01 -5.0093e+00 9.8797e-02 </Q2>
</Q11>
Note that the types of Q1
and Q2
can be any valid collision integral type.
The phenomenological Pirani potential has been introduced in Pirani et al. (2004), taking the form
where
where
<!-- Option 1: provide necessary parameters -->
<Q11 type="Pirani" beta="7.2644" eps0="0.00798" re="3.621" />
<!-- Option 2: estimate parameters
<Q11 type="Pirani" />
Laricchiuta et al. (2007) provide the necessary correlation formulas for determining the missing parameters if option 2 is chosen. The correlations rely on needing the dipole polarizabilities of the interacting species and, for neutral-neutral interactions, the effective electrons contributing to the polarization of the neutral species.
Curve-fits of the collision integrals computed using the Pirani potential have been provided in Laricchiuta et al. (2007). These are used to evaluate collision integrals using this potential, automatically taking into account the type of interaction and integral.
Use a ratio of another defined collision integral.
<Q22 type="ratio" ratio="1.1" integral="Q11" />
The XML syntax takes an integral name and the ratio to multiply that integral by. In this
case Q22
will be computed as 1.1 times Q11
.
Interpolates tabulated collision integral data. The table is provided in XML as two space delimited lists, separated by a comma.
<Q11 type="table" units="K,Å-Å" interpolator="l=Linear" clip="yes">
1000 2000 4000 5000 6000 8000 10000 15000 20000,
0.12 0.19 0.43 0.55 0.66 0.89 1.12 1.68 2.23
</Q11>
The first list indicates the temperature points and the second the collision integral
values, with the units specified by the units attribute. The interpolator
attribute specifies which interpolator is used to interpolate on the table. By
default, Linear
is used if no interpolator is specified. Chebyshev
and
MonotoneCubic
may also be used. The clip
attribute specifies whether or not to
clip the collision integral at the bounds of the table. By default this is yes
.
Uses a constant value for the integral and prints a warning message. This can be used when no data is available for a given species pair and kind of integral, without crashing.
<Q11 type="warning" value="1.0e-20"/>
Specifying collision integral data for every collision pair in your mixture may
sound like a daunting task. Chances are that most of the integrals you
need are already provided in the database. For the ones that aren't available
already, the database provides a facility to specify default behavior by
specifying the defaults
node.
<!-- Default collision integral data -->
<defaults>
<!-- Neutral-Neutral interactions -->
<neutral-neutral>
<!-- Collision integral definitions -->
</neutral-neutral>
<!-- Ion-Neutral interactions -->
<ion-neutral>
<!-- Collision integral definitions -->
</ion-neutral>
<!-- Electron-Neutral interactions -->
<electron-neutral>
<!-- Collision integral definitions -->
</electron-neutral>
<!-- Charged interactions -->
<charged>
<!-- Collision integral definitions -->
</charged>
</defaults>
The defaults
node allows the user to configure how to provide default
collision integrals for missing data, based on the four general types of
interactions: neutral-neutral, ion-neutral, electron-neutral, and charged.
Whenever the user requests to load a specific integral, the library will first
search the database for the explicit collision pair/integral kind requested. If
the pair or integral type is not found explicitly, the library will then resort
to the default integral provided in defaults
, according to the type of
interaction specified by the pair. This approach has several benefits:
- The default behavior is self-documenting and easily tunable without writing new code or recompiling the library
- Complex expressions can be created to find the most accurate collision model when data is missing
- No extra work is required to add new species pairs if the default behavior is good enough.
This last point is particularly valid in the case of charged interactions, for which the screened Coulomb potential is nearly always a valid approximation. Therefore, all charged interaction pairs can be supported easily by setting
<defaults>
<!-- Charged interactions -->
<charged>
<Q11 type="Debye-Huckel"/>
<Q12 type="Debye-Huckel"/>
<Q13 type="Debye-Huckel"/>
<Q13 type="Debye-Huckel"/>
<Q14 type="Debye-Huckel"/>
<Q15 type="Debye-Huckel"/>
<Q22 type="Debye-Huckel"/>
<Q23 type="Debye-Huckel"/>
<Q24 type="Debye-Huckel"/>
<Ast type="Debye-Huckel"/>
<Bst type="Debye-Huckel"/>
<Cst type="Debye-Huckel"/>
</charged>
<!-- Other interactions -->
</defaults>
Other cases can be envisaged as well. For example, using the Langevin model as default for all ion-neutral interactions means that only the dipole polarizability of the neutral species needs to be specified to add a new ion-neutral pair.
The global-options
node specifies options that act on the whole collision
integral database. For the moment, there are only two options that can be set.
<global-options>
<tabulate Tmin="100" Tmax="50000" dT="100" />
<integral type="table" interpolator="Linear" clip="true"/>
</global-options>
The tabulate
option instructs the database manager to tabulate all collision
integrals after loading them. The temperature grid used in the tabulation is
specified through the Tmin
, Tmax
, and dT
attributes which are the minimum
and maximum temperatures, and the constant temperature spacing, respectively.
The second option shown, integral
, is used to specify global options for a
specific collision integral type. In the example, the default interoplator
and clip
attributes for all table collision
integrals are set to Linear
and true
respectively. Note that for the moment,
only attributes of table can be specified in this
way.
Some of the collision integral models detailed above require additional information
about individual species, such as their dipole polarizabilities. These parameters are
stored in generic XML nodes as children of the root collisions
element, with the
following general structure.
<species-property units="some units">
<species name="some name" value="some value" ref="some reference" units="other units" />
<species name="some name" value="some value" ref="some reference" />
<species name="some name" value="some value" ref="some reference" />
</species-property>
Here, species-property
denotes the name of the species property stored in the node.
Default units can be given as shown in the units
attribute of the species-property
node. The property node then contains child nodes for each individual species for which
data is provided. Those nodes provide the species name
, the value
of the property
for that species, an optional ref
attribute for attributing a reference for the data,
and the possibility to override the default units
.
A note for developers: Species properties stored in this
way can be easily found in any child class of Mutation::Transport::CollisionIntegral
by calling the Mutation::Transport::CollisionIntegral::loadSpeciesParameter()
function.
Species dipole polarizabilities are used as inputs to some collision integral models, including Langevin and Pirani. An example listing of dipole polarizabilities is given below.
<!-- Dipole Polarizabilities -->
<dipole-polarizabilities units="Å-Å-Å">
<species name="N" value="1.10" ref="Wright2007"/>
<species name="N2" value="1.74" ref="Wright2007"/>
<species name="NO" value="1.70" ref="Wright2007"/>
<species name="O" value="0.80" ref="Wright2007"/>
<species name="O2" value="1.58" ref="Wright2007"/>
</dipole-polarizabilities>
The number of effective electrons in the polarization of a given species is used
in the Pirani collision integral model. These
values are stored in the species database effective-electrons
, following the
example below.
<effective-electrons>
<species name="C" value="4.0" />
<species name="C2" value="6.00" />
<species name="C2H" value="8.11" />
<species name="C2H2" value="10.00" />
<species name="C2H4" value="12.00" />
</effective-electrons>
The value of the effective electrons for new species can be estimated using the approach of Cambi (1991).
The gas-surface interaction module of Mutation++ is responsible for treating chemically reacting surfaces in thermochemical non-equilibrium. With the aim to obtain the appropriate surface boundary conditions for a chemically reacting gas, the conservation equations on the interface have to be written. In general, this idea can be applied for several different categories of interfaces with different phases and materials on each side. Since this Mutation++ module emphases on gas-surface interaction it is limited to having gas on one side (underscore g) and a catalytic or ablative solid or liquid on the other (underscore b). The surface is not simulated, but approximately modeled. In most of the cases it can be considered impermeable, or simplistically porous for pyrolysis gases. The interface can promote chemical reactions or radiate following the Planck's law of radiation at the surface temperature. The set of balance equations obtained are solved with respect to the conserved quantities of the gas, i.e. density, momentum and energy, which are imposed as boundary values for the full Navier-Stokes equations, or the porous material.
The general procedure to obtain the surface balances is the following. Assuming steady state on the surface, the time derivative term is equal to zero. By taking the limit that one dimension of the volume goes to zero, the three dimensional fluxes reduce to the normal fluxes at the interface while the volume source terms, such as chemical reactions, go to zero; only the surface sources remain. Generally, the set of balance equations can be written as:
where
Below the input file when a single catalytic reaction is presented.
Only the recombination of atomic into molecular oxygen is considered
modeled with the
<gsi gsi_mechanism = "phenomenological_mass">
<surface_properties type = "none" >
</surface_properties>
<surface_chemistry>
<!-- 1 -->
<reaction type= "catalysis" formula="O + O => O2">
<gamma_const> O:1. </gamma_const>
</reaction>
</surface_chemistry>
</gsi>
The
In order to determine the chemical production term for this kind of catalytic reactions a
probability for recombination
where
with
The only parameter that still needs to be defined is the impinging flux on the surface.
When the distribution function of species at the wall is well approximated by a Maxwellian
and there is no temperature slip, the impinging flux,
according to the kinetic theory of gases.
Initially, the gamma model was developed to describe homonuclear reactions, such as the one presented in above. Soon, though, it was observed that heteronuclear reactions were also probable to occur at the wall, which can take the form of
with the chemical rate for the produced molecule AB equal to:
One atom of A recombines with one atom of B on the surface to produce a molecule AB. In other words the number of atoms of A that recombine into AB should be equal to the number of B atoms that recombine into AB. This restriction should be explicitly imposed in order to conserve mass:
As a result, in a reaction of this type two gamma recombination coefficients should be defined not
necessarily equal for the two processes, the one activated when the catalytic reaction is limited by the
flux of A atoms and the opposite. In practice the two recombination number fluxes,
These gamma coefficients cannot take arbitrary values, they should be limited between 0 and 1,
just like in the homonuclear case. When extra catalytic reactions are added,
such as
An example input file of catalytic reactions in air including the formation of NO can be seen below.
<gsi gsi_mechanism = "phenomenological_mass">
<surface_properties type = "none" >
</surface_properties>
<surface_chemistry>
<!-- 1 -->
<reaction type= "catalysis" formula="N + N => N2">
<gamma_const> N:.001 </gamma_const>
</reaction>
<!-- 2 -->
<reaction type= "catalysis" formula="O + O => O2">
<gamma_const> O:.001 </gamma_const>
</reaction>
<!-- 3 -->
<reaction type= "catalysis" formula="N + O => NO">
<gamma_const> N:.002 O:.003 </gamma_const>
</reaction>
</surface_chemistry>
</gsi>
It is still unclear which is the proper boundary conditions for the ions and electrons on the surface. One of the most common model is to assume full ion recombination on the surface can be expressed as catalytic reaction with probability 1. The following example shows how to impose full ion recombination in Mutation.
<gsi gsi_mechanism = "phenomenological_mass">
<surface_properties type = "none" >
</surface_properties>
<surface_chemistry>
<!-- 1 -->
<reaction type= "catalysis" formula="N + N => N2">
<gamma_const> N:.001 </gamma_const>
</reaction>
<!-- 2 -->
<reaction type= "catalysis" formula="O + O => O2">
<gamma_const> O:.001 </gamma_const>
</reaction>
<!-- 3 -->
<reaction type= "catalysis" formula="N + O => NO">
<gamma_const> N:.002 O:.003 </gamma_const>
</reaction>
<!-- 4 -->
<reaction type= "catalysis" formula="N+ + e- => N">
<gamma_const> N+:1. e-:1. </gamma_const>
</reaction>
<!-- 5 -->
<reaction type= "catalysis" formula="O+ + e- => O">
<gamma_const> O+:1. e-:1. </gamma_const>
</reaction>
<!-- 6 -->
<reaction type= "catalysis" formula="NO+ + e- => NO">
<gamma_const> NO+:1. e-:1. </gamma_const>
</reaction>
<!-- 7 -->
<reaction type= "catalysis" formula="N2+ + e- => N2">
<gamma_const> N2+:1. e-:1. </gamma_const>
</reaction>
<!-- 8 -->
<reaction type= "catalysis" formula="O2+ + e- => O2">
<gamma_const> O2+:1. e-:1. </gamma_const>
</reaction>
</surface_chemistry>
</gsi>
An example of ablation model can be seen below.
<gsi gsi_mechanism = "phenomenological_mass">
<surface_properties type = "ablation" >
<surface label="b" species="C" />
</surface_properties>
<surface_chemistry>
<!-- 1 -->
<reaction type= "ablation" formula="C-b + O => CO">
<gamma_T pre_exp="0.63" T="1160.0" />
</reaction>
<!-- 2 -->
<reaction type= "ablation" formula="C-b + N => CN">
<gamma_const> N:0.003 </gamma_const>
</reaction>
<!-- 3 -->
<reaction type= "ablation" formula="3C-b => C3">
<sublimation vap_coef="0.1" pre_exp="5.19E15" T="90845." />
</reaction>
<!-- 4 -->
<reaction type= "catalysis" formula="N+N=>N2">
<gamma_const> N:0.001 </gamma_const>
</reaction>
</surface_chemistry>
</gsi>
The first ablation reaction presented above is the oxidation of the solid carbon by atomic oxygen. The reaction reads as:
and is exothermic, releasing 3.74 eV per molecule produced. Its reaction
rate coefficient is given by defining a recombination probability
Carbon oxidation with molecular oxygen is also possible
(
The second shown in the example is carbon nitridation,
an exothermic reaction with 0.35 eV of energy released per reacting atom.
The reaction rate is given using a constant recombination probability
At high temperatures carbon removal from the surface is dominated by phase change processes like sublimation. The production of C3 is considered here. It should be noted that this type of reactions are invertible, with formula:
The chemical production rate of this reaction is equal to:
The equilibrium partial density of the C3 species is obtained from the saturated vapor pressure of carbon, which is equal to
with
Heterogeneous catalysis is an important gas-surface interaction phenomenon occurring during re-entry of vehicles equipped with re-usable thermal protection system. It describes the recombination of the dissociated atoms in the flow using the thermal protection system as a catalyst. It is called heterogeneous, because the recombining species and the catalyst are in a different phase, here gas and solid. The catalyst, without being consumed, increases the rate of chemical reactions by offering an alternative, energetically favored path. It is important to note that catalysis does not change the chemical equilibrium of reactions, since it favors equally both the forward and the backward reaction rates. This is a constrain that should be respected by the catalytic model chosen.
In hypersonic the recombination reactions that occur on the surface are in general exothermic. The energy released to the wall is a substantial percentage of the total heat flux experienced by space vehicles. Not necessarily all of the recombination energy is directly deposited to the surface. A part of it is used to excite the internal energy of the produced molecules. Another reason why calculating the actual heat released on the surface is a complicated task, is that the gas phase chemistry and diffusion play an important role in determining the overall catalytic rates. If all of the phenomena above are modeled with accuracy, the re-entry heat load can be predicted and the size of the thermal protection system can be determined. The mass balance on a catalytic surface reads:
where one mass balance equation should be solved for each distinct species in the flow. The equation above states, that the catalytic activity of every species is equal to the diffusion flux of these species to the surface. This leads as to two cases. In the first one, the rate with which the chemical species are produced or destroyed at the wall is higher than the rate they diffuse to the surface while in the second one the opposite happens. The first case is called diffusion limited, since diffusion is the mechanism controlling the chemical process, while the opposite is called reaction limited. When a species i is inert at the surface, then its chemical rate is exactly equal to zero, which at steady state imposes that its net diffusion flux is also zero. Even though, in principle, these equations could be omitted, since they impose that the mole fractions of the species in question do not change with respect to the ones in the gas phase, the full system was chosen to be solved.
Ablation is the chemical gas-surface interaction phenomenon which occurs on non-reusable thermal protection systems of re-entry vehicle. The term ablation describes the category of chemical reactions during which the dissociated atoms in the flow field recombine directly with the thermal protection system, which by burning protects the vehicle. Contrary to catalysis, this burning destroys the material itself making it unable for reuse. Not only chemical reactions can cause the degradation of ablative thermal protection systems. Mechanical removal processes, such as spallation, can also occur. The particle injected in the flow field due to these phenomena are not necessarily in a gaseous form and their modeling requires approaches beyond the scope of this work. The type of chemical reactions studied here are assumed to produce only gaseous species and occur only the surface of the material. In cases where the material is porous, ablation processes also in the bulk, such as in the case of pyrolysis.
Taking these ideas in mind, the surface mass balance accounting only for surface reactions becomes:
with
In order to determine the surface temperature a surface energy balance should be solved along with the mass balances. It takes the form:
where
The radiative heat flux can be also included and will be discussed along with the surface radiation.
Term
An example input file for solving both mass and energy balance can be seen below.
<gsi gsi_mechanism = "phenomenological_mass_energy">
<surface_properties type = "ablation" >
<surface label="b" species="C"
enthalpy_surface="0." />
</surface_properties>
<solid_properties
virgin_to_surf_density_ratio = "1."
enthalpy_virgin = "0."
/>
<surface_features
solid_conduction = "steady_state"
surface_in_thermal_equil = "true"
gas_radiation = "false"
/>
<surface_chemistry>
<!-- 1 -->
<reaction type= "ablation" formula="C-b + O => CO">
<gamma_T pre_exp="0.63" T="1160.0" />
</reaction>
<!-- 2 -->
<reaction type= "ablation" formula="C-b + N => CN">
<gamma_const> N:0.003 </gamma_const>
</reaction>
<!-- 3 -->
<reaction type= "ablation" formula="3C-b => C3">
<sublimation vap_coef="0.1" pre_exp="5.19E15" T="90845." />
</reaction>
<!-- 4 -->
<reaction type= "catalysis" formula="N + N => N2">
<gamma_const> N:0.001 </gamma_const>
</reaction>
</surface_chemistry>
<surface_radiation emissivity="0.86" T_env="0."/>
</gsi>
The only source term taken into account for the surface energy balance in the
example above is radiation. It is considered by adding a new element with tag
<surface_radiation/>
. The surface is assumed to be in thermodynamic equilibrium
at a temperature T emitting energy following the Stefan-Boltzmann law,
with
In order to obtain the value for the conductive heat flux on the solid,
either a material code should be used or one should at least solve the
energy equation in the solid. Even though these approaches can be very accurate,
in cases where the material has low thermal conductivity or the recession rates
are high, approximate methods can be used, without compromising the accuracy of
the simulations. Such an approximation was adopted here for the modeling of the
conductive heat flux inside the material, the steady-state ablation approach for a
semi-infinite surface. By writing the steady-state energy equation for the solid phase
and integrating over the semi-infinite material, where on one side is the solid
properties at exactly the interface (subscript
By replacing the formula above in the surface energy balance and after simplifications one gets:
which is equally valid for both porous and non-porous materials. In order to use the steady state ablation
approximation, the attribute of surface_feature element solid_conduction should be set to steady state.
Instead of inputting the
virgin material density, the ratio between the virgin and surface density minus one is often used,
refered to as
When a material solver is available the conductive heat flux should be an input to the
library for increased accuracy. This can be achieved by setting the solid_conduction
surface feature to input
and the setSolidCondHeatFlux
function can be invoked.
The option enthalpy_surface should be set in this case, otherwise it is automatically set
to zero.
Note that only one surface balance equation is solved regardless of the thermodynamic
state model. When multi-temperature models are considered for the thermodynamics additional
temperatures should be imposed on the surface. It is often a reasonable assumption to
impose thermal equilibrium at the wall. This is achieved by setting the surface_feature
option surface_in_thermal_equil true
. If it is false
, then any additional temperature
beyond translations will be left unchanged, an assumption which can be used to impose an
adiabatic boundary condition for the internal energy modes.
In order for Mutation++ to take into account the Gas Surface Interaction features the gsi_mechanism attribute should be assigned to the gsi mechanism file.
<!-- Example mixture file for gsi -->
<mixture gsi_mechanims="name_of_the_gsi_file">
<!-- Species list -->
<species>
...
</species>
</mixture>
Below an example code of how to use the gas surface interaction features of Mutation++ is presented.
const int set_state_with_rhoi_T = 1;
MixtureOptions opts("mixture_name");
Mixture mix(opts);
const int iter = 5;
mix.setIterationsSurfaceBalance(iter);
// Setting the state and setting up the library
mix.setState(rhoi_surf.data(), Tsurf.data(), set_state_with_rhoi_T);
mix.setSurfaceState(rhoiw.data(), Tsurf.data(), set_state_with_rhoi_T);
mix.setDiffusionModel(xi_edge.data(), dx);
mix.setGasFourierHeatFluxModel(Tedge.data(), dx); // Only works with energy balance
// The .data() function returns the pointer at the first element of the data container.
// Additional Options
double gas_rad = 0.;
setGasRadHeatFlux(*gas_rad); // Only called if feature gas_radiation is true
double solid_cond = 0.;
setSolidCondHeatFlux(*solid_cond); // Only called if feature solid_cond is set to input
// Solving the surface Mass Balance and requesting the solution
mix.solveSurfaceBalance();
mix.getSurfaceState(rhoiw.data(), Tsurf.data(), set_state_with_rhoi_T);
// Getting mass blowing rate.
double mblow;
mix.getMassBlowingRate(mblow);
// Getting surface reaction rates.
mix.getSurfaceReactionRates(wdot.data());
// Getting number of reactions and surface reaction rates per reaction.
int m_nr = mix.nSurfaceReactions();
mix.getSurfaceReactionRatesPerReaction(wdot_reac.data());
Note that this example is not supposed to compile or run, but is there to indicate the most important features of the library.