Compare commits
52 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
92d17b5feb | ||
|
|
d7b1216f56 | ||
|
|
d35f6ab6f2 | ||
|
|
3043a5d872 | ||
|
|
e805d4d9ad | ||
|
|
8d1f374fc7 | ||
|
|
2b2b0947ec | ||
|
|
4c23fc2d1d | ||
|
|
8b5271e6ea | ||
|
|
f51bb43f96 | ||
|
|
e2fc2ce6f2 | ||
|
|
3334a5ffb5 | ||
|
|
163e4e638a | ||
|
|
2402505ffb | ||
|
|
ccb07ef853 | ||
|
|
cc8ada13f4 | ||
|
|
7489c2f1f7 | ||
|
|
000cdb3934 | ||
|
|
99b3e7ea1b | ||
|
|
7308491654 | ||
|
|
051b9d1f51 | ||
|
|
035c6d4ca1 | ||
|
|
4d643d05dc | ||
|
|
e6dce9d80e | ||
|
|
240079cb64 | ||
|
|
9149089e08 | ||
|
|
2d2ad00777 | ||
|
|
205d073399 | ||
|
|
3662ccdacf | ||
|
|
a116ef675e | ||
|
|
ffb703ecfd | ||
|
|
a79ee8e07a | ||
|
|
7d2e3813eb | ||
|
|
6d4540435e | ||
|
|
c0772d236a | ||
|
|
4b7e058b43 | ||
|
|
2044446bc3 | ||
|
|
6e77e3417f | ||
|
|
c69889b4bc | ||
|
|
832cf99927 | ||
|
|
479a9da0bd | ||
|
|
07257443e3 | ||
|
|
774ec21d97 | ||
|
|
98c2aa82e7 | ||
|
|
5597d1e374 | ||
|
|
4dc4a14467 | ||
|
|
5a23dab3b8 | ||
|
|
bd927d438a | ||
|
|
d0c62ada84 | ||
|
|
2aec189ddc | ||
|
|
c5bc4d3412 | ||
|
|
02a5409732 |
89 changed files with 808 additions and 302 deletions
7
.travis.yml
Normal file
7
.travis.yml
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
language: cpp
|
||||||
|
before_script:
|
||||||
|
- sudo apt-get update -qq
|
||||||
|
- sudo apt-get install -y python-dev python-numpy-dev cython gfortran libsundials-serial-dev liblapack-dev libblas-dev libboost-thread-dev python3-dev python3-numpy-dev
|
||||||
|
script:
|
||||||
|
- scons build VERBOSE=y blas_lapack_libs=lapack,blas build_thread_safe=y boost_thread_lib=boost_thread optimize=n
|
||||||
|
- scons test
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
CANTERA
|
CANTERA
|
||||||
*******
|
*******
|
||||||
|
|
||||||
Version 2.2.0 (stable)
|
Version 2.2.1 (stable)
|
||||||
|
|
||||||
License Information
|
License Information
|
||||||
===================
|
===================
|
||||||
|
|
@ -45,9 +45,3 @@ Web Resources
|
||||||
http://groups.google.com/group/cantera-users
|
http://groups.google.com/group/cantera-users
|
||||||
|
|
||||||
This site has a message board for discussions amongst Cantera users.
|
This site has a message board for discussions amongst Cantera users.
|
||||||
|
|
||||||
5. *The Cantera Developers Group*
|
|
||||||
|
|
||||||
http://groups.google.com/group/cantera-dev
|
|
||||||
|
|
||||||
Limited access site where developers can discuss development ideas.
|
|
||||||
|
|
|
||||||
|
|
@ -590,7 +590,7 @@ config_options = [
|
||||||
with a prefix like '/opt/cantera'. 'debian' installs to the stage
|
with a prefix like '/opt/cantera'. 'debian' installs to the stage
|
||||||
directory in a layout used for generating Debian packages.""",
|
directory in a layout used for generating Debian packages.""",
|
||||||
defaults.fsLayout, ('standard','compact','debian')),
|
defaults.fsLayout, ('standard','compact','debian')),
|
||||||
('cantera_version', '', '2.2.0')
|
('cantera_version', '', '2.2.1')
|
||||||
]
|
]
|
||||||
|
|
||||||
opts.AddVariables(*config_options)
|
opts.AddVariables(*config_options)
|
||||||
|
|
@ -929,7 +929,7 @@ if env['VERBOSE']:
|
||||||
env['python_cmd_esc'] = quoted(env['python_cmd'])
|
env['python_cmd_esc'] = quoted(env['python_cmd'])
|
||||||
|
|
||||||
# Python 2 Package Settings
|
# Python 2 Package Settings
|
||||||
cython_min_version = LooseVersion('0.17')
|
cython_min_version = LooseVersion('0.19')
|
||||||
env['install_python2_action'] = ''
|
env['install_python2_action'] = ''
|
||||||
if env['python_package'] == 'new':
|
if env['python_package'] == 'new':
|
||||||
env['python_package'] = 'full' # Allow 'new' as a synonym for 'full'
|
env['python_package'] = 'full' # Allow 'new' as a synonym for 'full'
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ PROJECT_NAME = Cantera
|
||||||
# This could be handy for archiving the generated documentation or
|
# This could be handy for archiving the generated documentation or
|
||||||
# if some version control system is used.
|
# if some version control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 2.2
|
PROJECT_NUMBER = 2.2.1
|
||||||
|
|
||||||
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
|
||||||
# base path where the generated documentation will be put.
|
# base path where the generated documentation will be put.
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ Linux
|
||||||
* Checking out the source code from version control requires Git (install
|
* Checking out the source code from version control requires Git (install
|
||||||
``git``).
|
``git``).
|
||||||
|
|
||||||
* The minimum compatible Cython version is 0.17. If your distribution does not
|
* The minimum compatible Cython version is 0.19. If your distribution does not
|
||||||
contain a suitable version, you may be able to install a more recent version
|
contain a suitable version, you may be able to install a more recent version
|
||||||
using `easy_install` or `pip`.
|
using `easy_install` or `pip`.
|
||||||
|
|
||||||
|
|
@ -94,7 +94,7 @@ OS X
|
||||||
|
|
||||||
and agree to the Xcode license agreement
|
and agree to the Xcode license agreement
|
||||||
|
|
||||||
* If you don't have numpy version >= 1.3, you can install a recent version with::
|
* If you don't have numpy version >= 1.4, you can install a recent version with::
|
||||||
|
|
||||||
sudo easy_install -U numpy
|
sudo easy_install -U numpy
|
||||||
|
|
||||||
|
|
@ -126,7 +126,7 @@ Stable Release
|
||||||
|
|
||||||
git clone https://github.com/Cantera/cantera.git
|
git clone https://github.com/Cantera/cantera.git
|
||||||
cd cantera
|
cd cantera
|
||||||
git checkout 2.1
|
git checkout 2.2
|
||||||
|
|
||||||
Development Version
|
Development Version
|
||||||
-------------------
|
-------------------
|
||||||
|
|
@ -437,13 +437,12 @@ Optional Programs
|
||||||
* Required to build the Cantera Python module, and to run significant portions
|
* Required to build the Cantera Python module, and to run significant portions
|
||||||
of the test suite.
|
of the test suite.
|
||||||
* http://sourceforge.net/projects/numpy/
|
* http://sourceforge.net/projects/numpy/
|
||||||
* Known to work with versions 1.7 and 1.8; Expected to work with version >= 1.3
|
* Known to work with versions 1.7-1.9; Expected to work with version >= 1.4
|
||||||
|
|
||||||
* `Cython <http://cython.org/>`_
|
* `Cython <http://cython.org/>`_
|
||||||
|
|
||||||
* Required to build the Python module
|
* Required version >=0.19 to build the Python module
|
||||||
* Known to work with versions 0.19 and 0.20. Expected to work with
|
* Known to work with versions 0.19 and 0.20.
|
||||||
versions >= 0.17.
|
|
||||||
* Tested with Python 2.7, 3.3, and 3.4. Expected to work with versions 2.6 and
|
* Tested with Python 2.7, 3.3, and 3.4. Expected to work with versions 2.6 and
|
||||||
3.1+ as well.
|
3.1+ as well.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ copyright = u'2012, Cantera Developers'
|
||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '2.2'
|
version = '2.2'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = '2.2.0'
|
release = '2.2.1'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
|
|
|
||||||
|
|
@ -487,3 +487,221 @@ importing any species that contain undeclared elements, instead of flagging them
|
||||||
as errors. You can also specify that reactions containing undeclared species
|
as errors. You can also specify that reactions containing undeclared species
|
||||||
(also usually an error) should be skipped. This allows you to very easily
|
(also usually an error) should be skipped. This allows you to very easily
|
||||||
extract a portion of a large reaction mechanism, as described in :ref:`sec-phase-options`.
|
extract a portion of a large reaction mechanism, as described in :ref:`sec-phase-options`.
|
||||||
|
|
||||||
|
.. _sec-ck-format-conversion:
|
||||||
|
|
||||||
|
Converting CK-format files
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Many existing reaction mechanism files are in "CK format," by which we mean
|
||||||
|
the input file format developed for use with the Chemkin-II software package
|
||||||
|
as specified in the report describing the Chemkin software [SAND89]_.
|
||||||
|
|
||||||
|
Cantera comes with a converter utility program ``ck2cti`` (or ``ck2cti.py``)
|
||||||
|
that converts CK format into Cantera format. This program should be run from
|
||||||
|
the command line first to convert any CK files you plan to use into Cantera
|
||||||
|
format (CTI format).
|
||||||
|
|
||||||
|
Usage::
|
||||||
|
|
||||||
|
ck2cti [--input=<filename>]
|
||||||
|
[--thermo=<filename>]
|
||||||
|
[--transport=<filename>]
|
||||||
|
[--id=<phase-id>]
|
||||||
|
[--output=<filename>]
|
||||||
|
[--permissive]
|
||||||
|
[-d | --debug]
|
||||||
|
|
||||||
|
Each of the terms in square brackets is an option that can be passed on the
|
||||||
|
command line to ``ck2cti``. ``--input`` is the chemistry input file, containing
|
||||||
|
a list of all the element names that are used, a list of all the species names,
|
||||||
|
and a list of all the reactions to be considered between the species. This file
|
||||||
|
can also optionally contain thermodynamic information for the species. If the
|
||||||
|
``--input`` file does not contain the thermodynamic data, a separate file
|
||||||
|
containing this information must be specified to the `--thermo`` option. Finally,
|
||||||
|
the ``--input`` file can also optionally contain transport information for the
|
||||||
|
species. If it does not, and the user wishes to use a part of Cantera that relies
|
||||||
|
on some transport properties, the ``--transport`` option must be used to specify
|
||||||
|
the file containing all the transport data for the species.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
|
||||||
|
ck2cti --input=chem.inp --thermo=therm.dat --transport=tran.dat
|
||||||
|
|
||||||
|
If the output file name is not given, an output file with the same name as the
|
||||||
|
input file, with the extension changed to '.cti'.
|
||||||
|
|
||||||
|
An input file containing only species definitions (which can be referenced from
|
||||||
|
phase definitions in other input files) can be created by specifying only a
|
||||||
|
thermo file.
|
||||||
|
|
||||||
|
Many existing CK format files cause errors in ``ck2cti`` when they are
|
||||||
|
processed. Some of these errors may be avoided by specifying the
|
||||||
|
``--permissive`` option. This option allows certain recoverable parsing errors
|
||||||
|
(e.g. duplicate transport or thermodynamic data) to be ignored. Other errors
|
||||||
|
may be caused by incorrect formatting of lines in one or more of the input files.
|
||||||
|
|
||||||
|
Debugging common errors in CK files
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
When ``ck2cti`` encounters an error, it attempts to print the surrounding
|
||||||
|
information to help you to locate the error. Many of the most common errors
|
||||||
|
are due to an inconsistency of the input files from their standard, as defined
|
||||||
|
in the report for Chemkin referenced above. These errors include:
|
||||||
|
|
||||||
|
* Each section of the input files must be started with a keyword representing that
|
||||||
|
section and ending with the keyword ``END``. Keywords that may begin a section
|
||||||
|
include:
|
||||||
|
|
||||||
|
- ``ELEMENTS`` or ``ELEM``
|
||||||
|
- ``SPECIES`` or ``SPEC``
|
||||||
|
- ``THERMO`` or ``THERMO ALL``
|
||||||
|
- ``REACTIONS`` or ``REAC``
|
||||||
|
- ``TRANSPORT``
|
||||||
|
|
||||||
|
* The thermodynamic data is read in a fixed format. This means that each
|
||||||
|
column of the input has a particular meaning. *Many common errors are
|
||||||
|
generated because information is missing or in the wrong column. Check
|
||||||
|
thoroughly for extraneous or missing spaces.* The format for each
|
||||||
|
thermodynamic entry should be as follows::
|
||||||
|
|
||||||
|
N2 N 2 G200.000 6000.000 1000.00 1
|
||||||
|
2.95258000E+00 1.39690000E-03-4.92632000E-07 7.86010000E-11-4.60755000E-15 2
|
||||||
|
-9.23949000E+02 5.87189000E+00 3.53101000E+00-1.23661000E-04-5.02999000E-07 3
|
||||||
|
2.43531000E-09-1.40881000E-12-1.04698000E+03 2.96747000E+00 4
|
||||||
|
|
||||||
|
The following table is adapted from the Chemkin manual [SAND89]_ to describe the
|
||||||
|
column positioning of each required part of the entry. Empty columns should be
|
||||||
|
filled with spaces.
|
||||||
|
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
|Line No. | Contents | Column |
|
||||||
|
+=========+=====================================+========+
|
||||||
|
| 1 | Species Name | 1--18 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | Date (Optional) | 19--24 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | Atomic Symbols and formula | 25--44 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | Phase of species (S, L, G) | 45 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | Low temperature | 46--55 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | High temperature | 56--65 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | Common temperature | 66--73 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | Additional Atomic Symbols | 74--78 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 1 | The integer ``1`` | 80 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 2 | Coefficients :math:`a_1` | 1--75 |
|
||||||
|
| | to :math:`a_5` for the upper | |
|
||||||
|
| | temperature interval | |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 2 | The integer ``2`` | 80 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 3 | Coefficients :math:`a_6,\ a_7` | 1--75 |
|
||||||
|
| | for the upper temperature interval, | |
|
||||||
|
| | and :math:`a_1,\ a_2,\ a_3` for | |
|
||||||
|
| | the lower temperature interval | |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 3 | The integer ``3`` | 80 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 4 | Coefficients :math:`a_4` through | 1--60 |
|
||||||
|
| | :math:`a_7` for the lower | |
|
||||||
|
| | temperature interval | |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
| 4 | The integer ``4`` | 80 |
|
||||||
|
+---------+-------------------------------------+--------+
|
||||||
|
|
||||||
|
The first 18 columns are reserved for the species name. The name assigned
|
||||||
|
to the species in the thermodynamic data must be the same as the species
|
||||||
|
name defined in the ``SPECIES`` section. If the species name is shorter
|
||||||
|
than 18 characters, the rest of the characters should be filled by spaces.
|
||||||
|
The next six columns (columns 19--24) are typically used to write a date;
|
||||||
|
they are not used further. The next 20 columns (25--44) are used to
|
||||||
|
specify the elemental composition of the species. In column 45, the phase
|
||||||
|
of the species (``S``, ``L``, or ``G`` for solid, liquid, or gas
|
||||||
|
respectively) should be specified. The next 28 columns are reserved for
|
||||||
|
the temperatures that delimit the ranges of the polynomials specified on
|
||||||
|
the next several lines. The first two temperatures have a width of 10
|
||||||
|
columns each (46--55 and 56--65), and represent the lowest temperature and
|
||||||
|
highest temperature for which the polynomials are valid. The last
|
||||||
|
temperature has a width of 8 columns (66--73) and is the "common"
|
||||||
|
temperature, where the switch from low to high occurs. The next 5 columns
|
||||||
|
(74--78) are reserved for atomic symbols and are usually left blank for
|
||||||
|
the default behavior. Column 79 is blank and finally, the row is ended in
|
||||||
|
column 80 with the integer ``1``.
|
||||||
|
|
||||||
|
The next three lines of the thermodynamic entry have a similar format.
|
||||||
|
They contain the coefficients of the polynomial described in
|
||||||
|
:ref:`sec-thermo-models` for the NASA 7-coefficient polynomial formulation.
|
||||||
|
The second row of the thermo entry (the first after the information row)
|
||||||
|
contains the first five coefficients that apply the the temperature range
|
||||||
|
between the midpoint and the upper limit. 15 columns are alloted for each
|
||||||
|
coefficient (for a total of 75 columns), with no spaces between them.
|
||||||
|
Although the entry above shows spaces between positive coefficients, it is
|
||||||
|
to be noted that this is done only for formatting consistency with other
|
||||||
|
lines that contain negative numbers. After the coefficients, four spaces
|
||||||
|
in columns 76--79 are followed by the integer ``2`` in column 80. On the
|
||||||
|
next line, the last two coefficients for the upper temperature range and
|
||||||
|
the first three coefficients for the lower temperature range are
|
||||||
|
specified. Once again, this takes up the first 75 columns, columns 76--79
|
||||||
|
are blank, and the integer ``3`` is in column 80. Finally, on the last
|
||||||
|
line of a particular entry, the last four coefficients of the lower
|
||||||
|
temperature range are specified in columns 1--60, 19 blank spaces are
|
||||||
|
present, and the integer ``4`` is in column 80. The 19 blank spaces in the
|
||||||
|
last line are part of the standard. However, since the original Chemkin
|
||||||
|
interpreter ignored those spaces, researchers began using that space to
|
||||||
|
store additional information that was not necessary for the input file.
|
||||||
|
Although these numbers create an error in ``ck2cti`` if present, they are
|
||||||
|
harmless and can be ignored by using the ``--permissive`` option.
|
||||||
|
|
||||||
|
* It may be the case that scientific formatted numbers are missing the ``E``.
|
||||||
|
In this case, numbers often show up as ``1.1+01``, when they should be
|
||||||
|
``1.1E+01``. You can fix this with a simple Regular Expression find and
|
||||||
|
replace::
|
||||||
|
|
||||||
|
Find: (\d+\.\d+)([+-]\d+)
|
||||||
|
Replace: \1E\2
|
||||||
|
|
||||||
|
* The transport data file also has a specified format, as described in
|
||||||
|
[SAND98]_, although the format is not as strict as for the thermodynamic
|
||||||
|
entries. In particular, the first 15 columns of a line are reserved for
|
||||||
|
the species name. *One common source of errors is a species that is present
|
||||||
|
in the transport data file, but not in the thermodynamic data or in
|
||||||
|
the species list; or a species that is present in the species list but
|
||||||
|
not the transport data file.* The rest of the columns on a given line have
|
||||||
|
no particular format, but must be present in the following order:
|
||||||
|
|
||||||
|
+------------------+------------------------------------------------------+
|
||||||
|
| Parameter Number | Parameter Name |
|
||||||
|
+==================+======================================================+
|
||||||
|
| 1 | An integer with value 0, 1, or 2 indicating |
|
||||||
|
| | monatomic, linear, or non-linear molecular geometry. |
|
||||||
|
+------------------+------------------------------------------------------+
|
||||||
|
| 2 | The Lennerd-Jones potential well depth |
|
||||||
|
| | :math:`\varepsilon/k_B` in Kelvin |
|
||||||
|
+------------------+------------------------------------------------------+
|
||||||
|
| 3 | The Lennerd-Jones collision diameter :math:`\sigma` |
|
||||||
|
| | in Angstrom |
|
||||||
|
+------------------+------------------------------------------------------+
|
||||||
|
| 4 | The dipole moment :math:`\mu` in Debye |
|
||||||
|
+------------------+------------------------------------------------------+
|
||||||
|
| 5 | The polarizability :math:`\alpha` in Angstrom |
|
||||||
|
+------------------+------------------------------------------------------+
|
||||||
|
| 6 | The rotational relaxation collision number |
|
||||||
|
| | :math:`Z_{rot}` at 298 K |
|
||||||
|
+------------------+------------------------------------------------------+
|
||||||
|
|
||||||
|
Another common error is if all 6 of these numbers are not present for every
|
||||||
|
species.
|
||||||
|
|
||||||
|
.. [SAND89] See R. J. Kee, F. M. Rupley, and J. A. Miller, Sandia National
|
||||||
|
Laboratories Report SAND89-8009 (1989).
|
||||||
|
http://www.osti.gov/scitech/biblio/5681118
|
||||||
|
|
||||||
|
.. [SAND98] See R. J. Kee, G. Dixon-Lewis, J. Warnatz, M. E. Coltrin, J. A. Miller,
|
||||||
|
H. K. Moffat, Sandia National Laboratories Report SAND86-8246B (1998).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -141,9 +141,9 @@ polynomial:
|
||||||
\frac{c_p^0(T)}{R} = a_0 + a_1 T + a_2 T^2 + a_3 T^3 + a_4 T^4
|
\frac{c_p^0(T)}{R} = a_0 + a_1 T + a_2 T^2 + a_3 T^3 + a_4 T^4
|
||||||
|
|
||||||
\frac{h^0(T)}{RT} = a_0 + \frac{a1}{2}T + \frac{a_2}{3} T^2 +
|
\frac{h^0(T)}{RT} = a_0 + \frac{a1}{2}T + \frac{a_2}{3} T^2 +
|
||||||
\frac{a_3}{4} T^3 + \frac{a_4}{5} T^4 + a_5
|
\frac{a_3}{4} T^3 + \frac{a_4}{5} T^4 + \frac{a_5}{T}
|
||||||
|
|
||||||
\frac{s^0(T)}{R} = a_o \ln T + a_1 T + \frac{a_2}{2} T^2 + \frac{a_3}{3} T^3 +
|
\frac{s^0(T)}{R} = a_0 \ln T + a_1 T + \frac{a_2}{2} T^2 + \frac{a_3}{3} T^3 +
|
||||||
\frac{a_4}{4} T^4 + a_6
|
\frac{a_4}{4} T^4 + a_6
|
||||||
|
|
||||||
Note that this is the "old" NASA polynomial form, used in the original NASA
|
Note that this is the "old" NASA polynomial form, used in the original NASA
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ These values are the same as those in the Cantera C++ header file ct_defs.h.
|
||||||
|
|
||||||
.. data:: planck
|
.. data:: planck
|
||||||
|
|
||||||
Planck constant (J/s)
|
Planck constant (J-s)
|
||||||
|
|
||||||
.. data:: stefan_boltzmann
|
.. data:: stefan_boltzmann
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -227,19 +227,7 @@ surface reactions must also be passed as arguments to `Interface`.
|
||||||
Converting CK-format files
|
Converting CK-format files
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Many existing reaction mechanism files are in "CK format," by which we mean
|
See :ref:`sec-ck-format-conversion` in the :ref:`sec-input-files` documentation.
|
||||||
the input file format developed for use with the Chemkin-II software package.
|
|
||||||
[See R. J. Kee, F. M. Rupley, and J. A. Miller, Sandia National Laboratories
|
|
||||||
Report SAND89-8009 (1989).]
|
|
||||||
|
|
||||||
Cantera comes with a converter utility program ``ck2cti`` (or ``ck2cti.py``)
|
|
||||||
that converts CK format into Cantera format. This program should be run from
|
|
||||||
the command line first to convert any CK files you plan to use into Cantera
|
|
||||||
format. Here's an example of how to use it. The command::
|
|
||||||
|
|
||||||
$python ck2cti.py --input=mech.inp --thermo=therm.dat --transport=tran.dat
|
|
||||||
|
|
||||||
will produce the file ``mech.cti`` in the current directory.
|
|
||||||
|
|
||||||
|
|
||||||
Getting Help
|
Getting Help
|
||||||
|
|
|
||||||
|
|
@ -97,7 +97,7 @@ General
|
||||||
|
|
||||||
David G. Goodwin, Harry K. Moffat, and Raymond L. Speth. *Cantera: An object-
|
David G. Goodwin, Harry K. Moffat, and Raymond L. Speth. *Cantera: An object-
|
||||||
oriented software toolkit for chemical kinetics, thermodynamics, and
|
oriented software toolkit for chemical kinetics, thermodynamics, and
|
||||||
transport processes*. http://www.cantera.org, 2015. Version 2.2.0.
|
transport processes*. http://www.cantera.org, 2016. Version 2.2.1.
|
||||||
|
|
||||||
The following BibTeX entry may also be used::
|
The following BibTeX entry may also be used::
|
||||||
|
|
||||||
|
|
@ -105,8 +105,8 @@ General
|
||||||
author = "David G. Goodwin and Harry K. Moffat and Raymond L. Speth",
|
author = "David G. Goodwin and Harry K. Moffat and Raymond L. Speth",
|
||||||
title = "Cantera: An Object-oriented Software Toolkit for Chemical
|
title = "Cantera: An Object-oriented Software Toolkit for Chemical
|
||||||
Kinetics, Thermodynamics, and Transport Processes",
|
Kinetics, Thermodynamics, and Transport Processes",
|
||||||
year = 2015,
|
year = 2016,
|
||||||
note = "Version 2.2.0",
|
note = "Version 2.2.1",
|
||||||
howpublished = "\url{http://www.cantera.org}"
|
howpublished = "\url{http://www.cantera.org}"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -124,8 +124,8 @@ Support and Bug Reporting
|
||||||
- Check the `Issue Tracker
|
- Check the `Issue Tracker
|
||||||
<https://github.com/Cantera/cantera/issues>`_ to see if the issue
|
<https://github.com/Cantera/cantera/issues>`_ to see if the issue
|
||||||
has already been reported.
|
has already been reported.
|
||||||
- Try to generate a complete, minimal example that demonstrates the
|
- Try to generate a `minimal, complete, and verifiable example
|
||||||
observed bug.
|
<http://stackoverflow.com/help/mcve>`_ that demonstrates the observed bug.
|
||||||
- Create a new issue on the tracker. Include as much information as
|
- Create a new issue on the tracker. Include as much information as
|
||||||
possible about your system configuration (operating system, compiler
|
possible about your system configuration (operating system, compiler
|
||||||
versions, Python versions, installation method, etc.)
|
versions, Python versions, installation method, etc.)
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ Windows
|
||||||
=======
|
=======
|
||||||
|
|
||||||
Windows installers are provided for stable versions of Cantera. These
|
Windows installers are provided for stable versions of Cantera. These
|
||||||
installation instructions are for Cantera 2.2.0.
|
installation instructions are for Cantera 2.2.1.
|
||||||
|
|
||||||
1. **Choose your Python version and architecture**
|
1. **Choose your Python version and architecture**
|
||||||
|
|
||||||
|
|
@ -68,14 +68,14 @@ installation instructions are for Cantera 2.2.0.
|
||||||
|
|
||||||
c:\python34\python.exe "%USERPROFILE%\Downloads\get-pip.py"
|
c:\python34\python.exe "%USERPROFILE%\Downloads\get-pip.py"
|
||||||
|
|
||||||
4. **Install Numpy**
|
4. **Install Numpy and optional Python packages**
|
||||||
|
|
||||||
- Go to the `Unofficial Windows Binaries for Python Extension Packages page
|
- Go to the `Unofficial Windows Binaries for Python Extension Packages page
|
||||||
<http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy>`_.
|
<http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy>`_.
|
||||||
|
|
||||||
- Download the most recent release (distributed as a "wheel" archive) of the
|
- Download the most recent release (distributed as a "wheel" archive) of the
|
||||||
1.x series for Python *X.Y* that matches your Python architecture. The
|
1.x series for Python *X.Y* that matches your Python architecture. The
|
||||||
binaries for Cantera 2.2.0 require Numpy 1.8.0 or newer, e.g. In the
|
binaries for Cantera 2.2.1 require Numpy 1.8.0 or newer, e.g. In the
|
||||||
filename, the digits after "cp" indicate the Python version, e.g.
|
filename, the digits after "cp" indicate the Python version, e.g.
|
||||||
``numpy‑1.8.2+mkl‑cp34‑none‑win_amd64.whl`` is the installer for 64-bit
|
``numpy‑1.8.2+mkl‑cp34‑none‑win_amd64.whl`` is the installer for 64-bit
|
||||||
Python 3.4.
|
Python 3.4.
|
||||||
|
|
@ -85,6 +85,12 @@ installation instructions are for Cantera 2.2.0.
|
||||||
|
|
||||||
c:\python34\scripts\pip.exe install "%USERPROFILE%\Downloads\numpy‑1.8.2+mkl‑cp34‑none‑win_amd64.whl"
|
c:\python34\scripts\pip.exe install "%USERPROFILE%\Downloads\numpy‑1.8.2+mkl‑cp34‑none‑win_amd64.whl"
|
||||||
|
|
||||||
|
- If you plan on using Cantera from Python, you may also want to install
|
||||||
|
IPython (an advanced interactive Python interpreter) and Matplotlib (a
|
||||||
|
plotting library), which are also available from the above link (note that
|
||||||
|
you may also need to download additional dependencies for each of these
|
||||||
|
packages). Matplotlib is required to run some of the Python examples.
|
||||||
|
|
||||||
5. **Remove old versions of Cantera**
|
5. **Remove old versions of Cantera**
|
||||||
|
|
||||||
- Use The Windows "Add/Remove Programs" interface
|
- Use The Windows "Add/Remove Programs" interface
|
||||||
|
|
@ -98,10 +104,10 @@ installation instructions are for Cantera 2.2.0.
|
||||||
- Go to the `Cantera Releases <https://github.com/Cantera/cantera/releases>`_
|
- Go to the `Cantera Releases <https://github.com/Cantera/cantera/releases>`_
|
||||||
page.
|
page.
|
||||||
|
|
||||||
- *64-bit*: Download **Cantera-2.2.0-x64.msi** and
|
- *64-bit*: Download **Cantera-2.2.1-x64.msi** and
|
||||||
**Cantera-Python-2.2.0-x64-pyX.Y.msi**.
|
**Cantera-Python-2.2.1-x64-pyX.Y.msi**.
|
||||||
- *32-bit*: Download **Cantera-2.2.0-x86.msi** and
|
- *32-bit*: Download **Cantera-2.2.1-x86.msi** and
|
||||||
**Cantera-Python-2.2.0-x86-pyX.Y.msi**.
|
**Cantera-Python-2.2.1-x86-pyX.Y.msi**.
|
||||||
|
|
||||||
- If you are only using the Python module, you do not need to download and
|
- If you are only using the Python module, you do not need to download and
|
||||||
install the base package.
|
install the base package.
|
||||||
|
|
@ -207,11 +213,22 @@ you can skip any steps which have already been completed.
|
||||||
Note that these packages are required even if you do not plan on using the
|
Note that these packages are required even if you do not plan on using the
|
||||||
Cantera Python 2 module.
|
Cantera Python 2 module.
|
||||||
|
|
||||||
|
- If you plan on using Cantera from Python, you may also want to install
|
||||||
|
IPython (an advanced interactive Python interpreter) and Matplotlib (a
|
||||||
|
plotting library). Matplotlib is required to run some of the Python
|
||||||
|
examples::
|
||||||
|
|
||||||
|
pip install ipython matplotlib
|
||||||
|
|
||||||
- If you want to build the Cantera Python 3 module, run::
|
- If you want to build the Cantera Python 3 module, run::
|
||||||
|
|
||||||
brew install python3
|
brew install python3
|
||||||
pip3 install numpy cython
|
pip3 install numpy cython
|
||||||
|
|
||||||
|
and, optionally::
|
||||||
|
|
||||||
|
pip3 install ipython matplotlib
|
||||||
|
|
||||||
3. **Compile and install Cantera**
|
3. **Compile and install Cantera**
|
||||||
|
|
||||||
* To compile and install Cantera using the default configuration, run::
|
* To compile and install Cantera using the default configuration, run::
|
||||||
|
|
@ -223,14 +240,31 @@ you can skip any steps which have already been completed.
|
||||||
``--HEAD``
|
``--HEAD``
|
||||||
Installs the current development version of Cantera.
|
Installs the current development version of Cantera.
|
||||||
|
|
||||||
|
``--with-python3``
|
||||||
|
Install the Python 3 module.
|
||||||
|
|
||||||
``--with-matlab=/Applications/MATLAB_R2014a.app/``
|
``--with-matlab=/Applications/MATLAB_R2014a.app/``
|
||||||
Installs the Matlab toolbox (with the path modified to match your
|
Installs the Matlab toolbox (with the path modified to match your
|
||||||
installed Matlab version)
|
installed Matlab version)
|
||||||
|
|
||||||
|
``--without-sundials``
|
||||||
|
Do not use an external SUNDIALS version to build Cantera. Users
|
||||||
|
choosing this option will not be able to run sensitivity analysis
|
||||||
|
of Reactor Networks, but it may prevent errors when installing
|
||||||
|
the Matlab toolbox.
|
||||||
|
|
||||||
|
``--without-check``
|
||||||
|
NOT RECOMMENDED! Disable automatic testing of Cantera during the
|
||||||
|
installation process.
|
||||||
|
|
||||||
* These options are specified as additional arguments to the ``brew install``
|
* These options are specified as additional arguments to the ``brew install``
|
||||||
command, e.g.::
|
command, e.g.::
|
||||||
|
|
||||||
brew install cantera --HEAD --with-matlab=/Applications/MATLAB_R2014a.app/
|
brew install cantera --HEAD --with-python3
|
||||||
|
|
||||||
|
* If you are installing the Matlab toolbox, the recommended command is::
|
||||||
|
|
||||||
|
brew install cantera --with-matlab=/Applications/MATLAB_R2014a.app/ --without-sundials
|
||||||
|
|
||||||
* If something goes wrong with the Homebrew install, re-run the command with
|
* If something goes wrong with the Homebrew install, re-run the command with
|
||||||
the ``-v`` flag to get more verbose output that may help identify the
|
the ``-v`` flag to get more verbose output that may help identify the
|
||||||
|
|
@ -303,7 +337,7 @@ Ubuntu
|
||||||
======
|
======
|
||||||
|
|
||||||
Ubuntu packages are provided for recent versions of Ubuntu using a Personal
|
Ubuntu packages are provided for recent versions of Ubuntu using a Personal
|
||||||
Package Archive (PPA). As of Cantera 2.2.0, packages are available for Ubuntu
|
Package Archive (PPA). As of Cantera 2.2.1, packages are available for Ubuntu
|
||||||
Ubuntu 14.04 LTS (Trusty Tahr), Ubuntu 14.10 (Utopic Unicorn), and Ubuntu 15.04
|
Ubuntu 14.04 LTS (Trusty Tahr), Ubuntu 14.10 (Utopic Unicorn), and Ubuntu 15.04
|
||||||
(Vivid Vervet). To see which Ubuntu releases and Cantera versions are currently
|
(Vivid Vervet). To see which Ubuntu releases and Cantera versions are currently
|
||||||
available, visit https://launchpad.net/~speth/+archive/ubuntu/cantera
|
available, visit https://launchpad.net/~speth/+archive/ubuntu/cantera
|
||||||
|
|
@ -328,3 +362,30 @@ To install all of the Cantera packages::
|
||||||
sudo aptitude install cantera-python cantera-python3 cantera-dev
|
sudo aptitude install cantera-python cantera-python3 cantera-dev
|
||||||
|
|
||||||
or install whichever subset you need by adjusting the above command.
|
or install whichever subset you need by adjusting the above command.
|
||||||
|
|
||||||
|
If you plan on using Cantera from Python, you may also want to install IPython
|
||||||
|
(an advanced interactive Python interpreter) and Matplotlib (a plotting
|
||||||
|
library), which are also available from the above link. Matplotlib is required
|
||||||
|
to run some of the Python examples. For Python 2, these packages can be
|
||||||
|
installed with::
|
||||||
|
|
||||||
|
pip2 install ipython matplotlib
|
||||||
|
|
||||||
|
And for Python 3, these packages can be installed with::
|
||||||
|
|
||||||
|
pip3 install ipython matplotlib
|
||||||
|
|
||||||
|
You may need to install ``pip`` first; instructions can be found on the
|
||||||
|
`pip installation instructions.
|
||||||
|
<https://pip.pypa.io/en/latest/installing.html#install-pip>`_
|
||||||
|
You may need to have superuser access to install packages into the system
|
||||||
|
directories. Alternatively, you can add ``--user`` after ``pip install`` but
|
||||||
|
before the package names to install into your local user directory. An
|
||||||
|
alternative method is to use the Ubuntu repositories, but these tend to
|
||||||
|
be very out of date. For Python 2, the command is::
|
||||||
|
|
||||||
|
sudo aptitude install ipython python-matplotlib
|
||||||
|
|
||||||
|
And for Python 3, these packages can be installed with::
|
||||||
|
|
||||||
|
sudo aptitude install ipython3 python3-matplotlib
|
||||||
|
|
|
||||||
|
|
@ -59,17 +59,4 @@ must also be passed as arguments to importInterface.
|
||||||
Converting CK-format files
|
Converting CK-format files
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
Many existing reaction mechanism files are in "CK format," by which we mean the
|
See :ref:`sec-ck-format-conversion` in the :ref:`sec-input-files` documentation.
|
||||||
input file format developed for use with the Chemkin-II software package. [See
|
|
||||||
R. J. Kee, F. M. Rupley, and J. A. Miller, Sandia National Laboratories Report
|
|
||||||
SAND89-8009 (1989).]
|
|
||||||
|
|
||||||
Cantera comes with a converter utility program ``ck2cti`` (or ``ck2cti.exe``)
|
|
||||||
that converts CK format into Cantera format. This program should be run from the
|
|
||||||
command line first to convert any CK files you plan to use into Cantera format.
|
|
||||||
|
|
||||||
Here's an example of how to use it:
|
|
||||||
|
|
||||||
.. code-block:: bash
|
|
||||||
|
|
||||||
ck2cti -i mech.inp -t therm.dat -tr tran.dat -id mymech > mech.cti
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,3 @@
|
||||||
scons: Reading SConscript files ...
|
|
||||||
|
|
||||||
**************************************************
|
**************************************************
|
||||||
* Configuration options for building Cantera *
|
* Configuration options for building Cantera *
|
||||||
**************************************************
|
**************************************************
|
||||||
|
|
@ -9,11 +7,10 @@ build process. They should be given in the form:
|
||||||
|
|
||||||
scons build option1=value1 option2=value2
|
scons build option1=value1 option2=value2
|
||||||
|
|
||||||
Variables set in this way will be stored in the 'cantera.conf' file
|
Variables set in this way will be stored in the 'cantera.conf' file and reused
|
||||||
and reused automatically on subsequent invocations of
|
automatically on subsequent invocations of scons. Alternatively, the
|
||||||
scons. Alternatively, the configuration options can be entered
|
configuration options can be entered directly into 'cantera.conf' before
|
||||||
directly into 'cantera.conf' before running 'scons build'. The format
|
running 'scons build'. The format of this file is:
|
||||||
of this file is:
|
|
||||||
|
|
||||||
option1 = 'value1'
|
option1 = 'value1'
|
||||||
option2 = 'value2'
|
option2 = 'value2'
|
||||||
|
|
@ -21,13 +18,15 @@ of this file is:
|
||||||
**************************************************
|
**************************************************
|
||||||
|
|
||||||
* msvc_version: [ string ]
|
* msvc_version: [ string ]
|
||||||
Version of Visual Studio to use. The default is the same version
|
Version of Visual Studio to use. The default is the newest installed
|
||||||
that was used to compile the installed version of Python.
|
version. Specify '9.0' for Visual Studio 2008; '10.0' for Visual
|
||||||
- default: '9.0'
|
Studio 2010; '11.0' for Visual Studio 2012; or '12.0' for Visual
|
||||||
|
Studio 2013.
|
||||||
|
- default: ''
|
||||||
|
|
||||||
* target_arch: [ string ]
|
* target_arch: [ string ]
|
||||||
Target architecture. The default is the same architecture as the
|
Target architecture. The default is the same architecture as the
|
||||||
installed version of Python
|
installed version of Python.
|
||||||
- default: 'amd64'
|
- default: 'amd64'
|
||||||
|
|
||||||
* toolchain: [ msvc | mingw | intel ]
|
* toolchain: [ msvc | mingw | intel ]
|
||||||
|
|
@ -36,16 +35,15 @@ of this file is:
|
||||||
|
|
||||||
* CXX: [ string ]
|
* CXX: [ string ]
|
||||||
The C++ compiler to use.
|
The C++ compiler to use.
|
||||||
- default: 'g++'
|
- default: '$CC'
|
||||||
|
|
||||||
* CC: [ string ]
|
* CC: [ string ]
|
||||||
The C compiler to use. This is only used to compile CVODE and the
|
The C compiler to use. This is only used to compile CVODE.
|
||||||
Python extension module.
|
- default: 'cl'
|
||||||
- default: 'gcc'
|
|
||||||
|
|
||||||
* prefix: [ /path/to/prefix ]
|
* prefix: [ /path/to/prefix ]
|
||||||
Set this to the directory where Cantera should be installed.
|
Set this to the directory where Cantera should be installed.
|
||||||
- default: '/usr/local'
|
- default: 'C:\\Program Files\\Cantera'
|
||||||
|
|
||||||
* python_package: [ new | full | minimal | none | default ]
|
* python_package: [ new | full | minimal | none | default ]
|
||||||
If you plan to work in Python, or you want to use the graphical
|
If you plan to work in Python, or you want to use the graphical
|
||||||
|
|
@ -53,7 +51,7 @@ of this file is:
|
||||||
Package. If, on the other hand, you will only use Cantera from some
|
Package. If, on the other hand, you will only use Cantera from some
|
||||||
other language (e.g. MATLAB or Fortran 90/95) and only need Python
|
other language (e.g. MATLAB or Fortran 90/95) and only need Python
|
||||||
to process .cti files, then you only need a 'minimal' subset of the
|
to process .cti files, then you only need a 'minimal' subset of the
|
||||||
package (actually, only one file). The default behavior is to build
|
package (actually, only two files). The default behavior is to build
|
||||||
the Python package if the required prerequisites (numpy) are
|
the Python package if the required prerequisites (numpy) are
|
||||||
installed.
|
installed.
|
||||||
- default: 'default'
|
- default: 'default'
|
||||||
|
|
@ -62,7 +60,7 @@ of this file is:
|
||||||
Cantera needs to know where to find the Python interpreter. If
|
Cantera needs to know where to find the Python interpreter. If
|
||||||
PYTHON_CMD is not set, then the configuration process will use the
|
PYTHON_CMD is not set, then the configuration process will use the
|
||||||
same Python interpreter being used by SCons.
|
same Python interpreter being used by SCons.
|
||||||
- default: '/usr/bin/python'
|
- default: 'c:\\Python27\\python.exe'
|
||||||
|
|
||||||
* python_array_home: [ /path/to/python_array_home ]
|
* python_array_home: [ /path/to/python_array_home ]
|
||||||
If numpy was installed using the --home option, set this to the home
|
If numpy was installed using the --home option, set this to the home
|
||||||
|
|
@ -74,13 +72,14 @@ of this file is:
|
||||||
an alternate location. On Unix-like systems, the default is the same
|
an alternate location. On Unix-like systems, the default is the same
|
||||||
as the $prefix option. If this option is set to the empty string
|
as the $prefix option. If this option is set to the empty string
|
||||||
(the default on Windows), then the Package will be installed to the
|
(the default on Windows), then the Package will be installed to the
|
||||||
system default 'site-packages' directory.
|
system default 'site-packages' directory. To install to the current
|
||||||
- default: '$prefix'
|
user's site-packages directory, use 'python_prefix=USER'.
|
||||||
|
- default: ''
|
||||||
|
|
||||||
* python3_package: [ y | n | default ]
|
* python3_package: [ y | n | default ]
|
||||||
Controls whether or not the Python 3 module will be built. By
|
Controls whether or not the Python 3 module will be built. By
|
||||||
default, the module will be built if the Python 3 interpreter can be
|
default, the module will be built if the Python 3 interpreter can be
|
||||||
found
|
found.
|
||||||
- default: 'default'
|
- default: 'default'
|
||||||
|
|
||||||
* python3_cmd: [ /path/to/python3_cmd ]
|
* python3_cmd: [ /path/to/python3_cmd ]
|
||||||
|
|
@ -90,7 +89,7 @@ of this file is:
|
||||||
|
|
||||||
* python3_array_home: [ /path/to/python3_array_home ]
|
* python3_array_home: [ /path/to/python3_array_home ]
|
||||||
"If numpy was installed to a custom location (e.g. using the --home
|
"If numpy was installed to a custom location (e.g. using the --home
|
||||||
option, set this to the directory for numpy
|
option, set this to the directory for numpy.
|
||||||
- default: ''
|
- default: ''
|
||||||
|
|
||||||
* python3_prefix: [ /path/to/python3_prefix ]
|
* python3_prefix: [ /path/to/python3_prefix ]
|
||||||
|
|
@ -98,8 +97,9 @@ of this file is:
|
||||||
to an alternate location. On Unix-like systems, the default is the
|
to an alternate location. On Unix-like systems, the default is the
|
||||||
same as the $prefix option. If this option is set to the empty
|
same as the $prefix option. If this option is set to the empty
|
||||||
string (the default on Windows), then the Package will be installed
|
string (the default on Windows), then the Package will be installed
|
||||||
to the system default 'site-packages' directory.
|
to the system default 'site-packages' directory. To install to the
|
||||||
- default: '$prefix'
|
current user's site-packages directory, use 'python3_prefix=USER'.
|
||||||
|
- default: ''
|
||||||
|
|
||||||
* matlab_toolbox: [ y | n | default ]
|
* matlab_toolbox: [ y | n | default ]
|
||||||
This variable controls whether the Matlab toolbox will be built. If
|
This variable controls whether the Matlab toolbox will be built. If
|
||||||
|
|
@ -123,13 +123,13 @@ of this file is:
|
||||||
if one is found.
|
if one is found.
|
||||||
- default: 'default'
|
- default: 'default'
|
||||||
|
|
||||||
* F90: [ /path/to/F90 ]
|
* FORTRAN: [ /path/to/FORTRAN ]
|
||||||
The Fortran 90 compiler. If unspecified, the builder will look for a
|
The Fortran (90) compiler. If unspecified, the builder will look for
|
||||||
compatible compiler (gfortran, ifort, g95) in the $PATH.
|
a compatible compiler (gfortran, ifort, g95) in the $PATH.
|
||||||
- default: ''
|
- default: ''
|
||||||
|
|
||||||
* F90FLAGS: [ string ]
|
* FORTRANFLAGS: [ string ]
|
||||||
Compilation options for the Fortran 90 compiler.
|
Compilation options for the Fortran (90) compiler.
|
||||||
- default: '-O3'
|
- default: '-O3'
|
||||||
|
|
||||||
* debug_verbose: [ yes | no ]
|
* debug_verbose: [ yes | no ]
|
||||||
|
|
@ -143,33 +143,17 @@ of this file is:
|
||||||
- default: 'no'
|
- default: 'no'
|
||||||
|
|
||||||
* doxygen_docs: [ yes | no ]
|
* doxygen_docs: [ yes | no ]
|
||||||
Build HTML documentation for the C++ interface using Doxygen
|
Build HTML documentation for the C++ interface using Doxygen.
|
||||||
- default: 'no'
|
- default: 'no'
|
||||||
|
|
||||||
* sphinx_docs: [ yes | no ]
|
* sphinx_docs: [ yes | no ]
|
||||||
Build HTML documentation for the Python module using Sphinx
|
Build HTML documentation for the Python module using Sphinx.
|
||||||
- default: 'no'
|
- default: 'no'
|
||||||
|
|
||||||
* with_lattice_solid: [ yes | no ]
|
|
||||||
Include thermodynamic model for lattice solids in the Cantera
|
|
||||||
kernel.
|
|
||||||
- default: 'yes'
|
|
||||||
* sphinx_cmd: [ /path/to/sphinx_cmd ]
|
* sphinx_cmd: [ /path/to/sphinx_cmd ]
|
||||||
Command to use for building the Sphinx documentation
|
Command to use for building the Sphinx documentation.
|
||||||
- default: 'sphinx-build'
|
- default: 'sphinx-build'
|
||||||
|
|
||||||
* with_h298modify_capability: [ yes | no ]
|
|
||||||
Enable changing the 298K heats of formation directly via the C++
|
|
||||||
layer.
|
|
||||||
- default: 'no'
|
|
||||||
|
|
||||||
* with_html_log_files: [ yes | no ]
|
|
||||||
write HTML log files. Some multiphase equilibrium procedures can
|
|
||||||
write copious diagnostic log messages. Set this to 'n' to disable
|
|
||||||
this capability. (results in slightly faster equilibrium
|
|
||||||
calculations)
|
|
||||||
- default: 'yes'
|
|
||||||
|
|
||||||
* use_sundials: [ default | y | n ]
|
* use_sundials: [ default | y | n ]
|
||||||
Cantera uses the CVODE or CVODES ODE integrator to time-integrate
|
Cantera uses the CVODE or CVODES ODE integrator to time-integrate
|
||||||
reactor network ODE's and for various other purposes. An older
|
reactor network ODE's and for various other purposes. An older
|
||||||
|
|
@ -182,8 +166,9 @@ of this file is:
|
||||||
will be used if you have it, and if not the older CVODE will be
|
will be used if you have it, and if not the older CVODE will be
|
||||||
used. Or set USE_SUNDIALS to 'y' or 'n' to force using it or not.
|
used. Or set USE_SUNDIALS to 'y' or 'n' to force using it or not.
|
||||||
Note that sensitivity analysis with Cantera requires use of
|
Note that sensitivity analysis with Cantera requires use of
|
||||||
sundials. See: http://www.llnl.gov/CASC/sundials
|
sundials. See: http://www.llnl.gov/CASC/sundials.
|
||||||
- default: 'default'
|
- default: 'default'
|
||||||
|
- actual: 'y'
|
||||||
|
|
||||||
* sundials_include: [ /path/to/sundials_include ]
|
* sundials_include: [ /path/to/sundials_include ]
|
||||||
The directory where the Sundials header files are installed. This
|
The directory where the Sundials header files are installed. This
|
||||||
|
|
@ -198,6 +183,16 @@ of this file is:
|
||||||
/usr/lib.
|
/usr/lib.
|
||||||
- default: ''
|
- default: ''
|
||||||
|
|
||||||
|
* sundials_license: [ /path/to/sundials_license ]
|
||||||
|
Path to the sundials LICENSE file. Needed so that it can be included
|
||||||
|
when bundling Sundials.
|
||||||
|
- default: ''
|
||||||
|
|
||||||
|
* install_sundials: [ yes | no ]
|
||||||
|
Determines whether Sundials library and header files are installed
|
||||||
|
alongside Cantera. Intended for use when installing on Windows.
|
||||||
|
- default: 'yes'
|
||||||
|
|
||||||
* blas_lapack_libs: [ string ]
|
* blas_lapack_libs: [ string ]
|
||||||
Cantera comes with Fortran (or C) versions of those parts of BLAS
|
Cantera comes with Fortran (or C) versions of those parts of BLAS
|
||||||
and LAPACK it requires. But performance may be better if you use a
|
and LAPACK it requires. But performance may be better if you use a
|
||||||
|
|
@ -226,37 +221,37 @@ of this file is:
|
||||||
* env_vars: [ string ]
|
* env_vars: [ string ]
|
||||||
Environment variables to propagate through to SCons. Either the
|
Environment variables to propagate through to SCons. Either the
|
||||||
string "all" or a comma separated list of variable names, e.g.
|
string "all" or a comma separated list of variable names, e.g.
|
||||||
'LD_LIBRARY_PATH,HOME'
|
'LD_LIBRARY_PATH,HOME'.
|
||||||
- default: ''
|
- default: 'LD_LIBRARY_PATH,PYTHONPATH'
|
||||||
|
|
||||||
* cxx_flags: [ string ]
|
* cxx_flags: [ string ]
|
||||||
Compiler flags passed to the C++ compiler only.
|
Compiler flags passed to the C++ compiler only.
|
||||||
- default: '-ftemplate-depth-128'
|
- default: '/EHsc'
|
||||||
|
|
||||||
* cc_flags: [ string ]
|
* cc_flags: [ string ]
|
||||||
Compiler flags passed to both the C and C++ compilers, regardless of
|
Compiler flags passed to both the C and C++ compilers, regardless of
|
||||||
optimization level
|
optimization level
|
||||||
- default: '-Wall -Wno-deprecated-declarations'
|
- default: '/MD /nologo /D_SCL_SECURE_NO_WARNINGS /D_CRT_SECURE_NO_WARNINGS'
|
||||||
|
|
||||||
* thread_flags: [ string ]
|
* thread_flags: [ string ]
|
||||||
Compiler and linker flags for POSIX multithreading support
|
Compiler and linker flags for POSIX multithreading support.
|
||||||
- default: '-pthread'
|
- default: ''
|
||||||
|
|
||||||
* optimize: [ yes | no ]
|
* optimize: [ yes | no ]
|
||||||
Enable extra compiler optimizations specified by the
|
Enable extra compiler optimizations specified by the
|
||||||
"optimize_flags" variable, instead of the flags specified by the
|
"optimize_flags" variable, instead of the flags specified by the
|
||||||
"debug_flags" variable
|
"debug_flags" variable.
|
||||||
- default: 'yes'
|
- default: 'yes'
|
||||||
|
|
||||||
* optimize_flags: [ string ]
|
* optimize_flags: [ string ]
|
||||||
Additional compiler flags passed to the C/C++ compiler when
|
Additional compiler flags passed to the C/C++ compiler when
|
||||||
optimize=yes.
|
optimize=yes.
|
||||||
- default: '-O3 -DNDEBUG -finline-functions -Wno-inline'
|
- default: '/O2'
|
||||||
|
|
||||||
* no_optimize_flags: [ string ]
|
* no_optimize_flags: [ string ]
|
||||||
Additional compiler flags passed to the C/C++ compiler when
|
Additional compiler flags passed to the C/C++ compiler when
|
||||||
optimize=no.
|
optimize=no.
|
||||||
- default: '-O0 -fno-inline'
|
- default: '/Od /Ob0'
|
||||||
|
|
||||||
* debug: [ yes | no ]
|
* debug: [ yes | no ]
|
||||||
Enable compiler debugging symbols.
|
Enable compiler debugging symbols.
|
||||||
|
|
@ -265,7 +260,8 @@ of this file is:
|
||||||
* debug_flags: [ string ]
|
* debug_flags: [ string ]
|
||||||
Additional compiler flags passed to the C/C++ compiler when
|
Additional compiler flags passed to the C/C++ compiler when
|
||||||
debug=yes.
|
debug=yes.
|
||||||
- default: '-g'
|
- default: '/Zi /Fd${TARGET}.pdb'
|
||||||
|
- actual: '/Zi /Fd.pdb'
|
||||||
|
|
||||||
* no_debug_flags: [ string ]
|
* no_debug_flags: [ string ]
|
||||||
Additional compiler flags passed to the C/C++ compiler when
|
Additional compiler flags passed to the C/C++ compiler when
|
||||||
|
|
@ -273,11 +269,27 @@ of this file is:
|
||||||
- default: ''
|
- default: ''
|
||||||
|
|
||||||
* debug_linker_flags: [ string ]
|
* debug_linker_flags: [ string ]
|
||||||
Additional options passed to the linker when debug=yes
|
Additional options passed to the linker when debug=yes.
|
||||||
- default: ''
|
- default: '/DEBUG'
|
||||||
|
|
||||||
* no_debug_linker_flags: [ string ]
|
* no_debug_linker_flags: [ string ]
|
||||||
Additional options passed to the linker when debug=yes
|
Additional options passed to the linker when debug=no.
|
||||||
|
- default: ''
|
||||||
|
|
||||||
|
* warning_flags: [ string ]
|
||||||
|
Additional compiler flags passed to the C/C++ compiler to enable
|
||||||
|
extra warnings. Used only when compiling source code that part of
|
||||||
|
Cantera (e.g. excluding code in the 'ext' directory).
|
||||||
|
- default: '/W3'
|
||||||
|
|
||||||
|
* extra_inc_dirs: [ string ]
|
||||||
|
Additional directories to search for header files (colon-separated
|
||||||
|
list).
|
||||||
|
- default: ''
|
||||||
|
|
||||||
|
* extra_lib_dirs: [ string ]
|
||||||
|
Additional directories to search for libraries (colon-separated
|
||||||
|
list).
|
||||||
- default: ''
|
- default: ''
|
||||||
|
|
||||||
* build_thread_safe: [ yes | no ]
|
* build_thread_safe: [ yes | no ]
|
||||||
|
|
@ -289,16 +301,23 @@ of this file is:
|
||||||
- default: 'no'
|
- default: 'no'
|
||||||
|
|
||||||
* boost_inc_dir: [ /path/to/boost_inc_dir ]
|
* boost_inc_dir: [ /path/to/boost_inc_dir ]
|
||||||
Location of the Boost header files
|
Location of the Boost header files.
|
||||||
- default: '/usr/include'
|
- default: ''
|
||||||
|
|
||||||
* boost_lib_dir: [ /path/to/boost_lib_dir ]
|
* boost_lib_dir: [ /path/to/boost_lib_dir ]
|
||||||
Directory containing the Boost.Thread library
|
Directory containing the Boost.Thread library.
|
||||||
- default: '/usr/lib'
|
- default: ''
|
||||||
|
|
||||||
* boost_thread_lib: [ string ]
|
* boost_thread_lib: [ string ]
|
||||||
The name of the Boost.Thread library.
|
A comma-separated list containing the names of the libraries needed
|
||||||
- default: 'boost_thread'
|
to link to Boost.Thread.
|
||||||
|
- default: ''
|
||||||
|
|
||||||
|
* boost_windows_libs: [ string ]
|
||||||
|
Comma-separated list containing the names of the Boost libraries
|
||||||
|
required to link Cantera programs on Windows. These libraries will
|
||||||
|
be copied to the Cantera installation directory.
|
||||||
|
- default: 'thread,system,date_time,chrono'
|
||||||
|
|
||||||
* build_with_f2c: [ yes | no ]
|
* build_with_f2c: [ yes | no ]
|
||||||
For external procedures written in Fortran 77, both the original F77
|
For external procedures written in Fortran 77, both the original F77
|
||||||
|
|
@ -309,7 +328,7 @@ of this file is:
|
||||||
|
|
||||||
* F77: [ string ]
|
* F77: [ string ]
|
||||||
Compiler used to build the external Fortran 77 procedures from the
|
Compiler used to build the external Fortran 77 procedures from the
|
||||||
Fortran source code
|
Fortran source code.
|
||||||
- default: 'gfortran'
|
- default: 'gfortran'
|
||||||
|
|
||||||
* F77FLAGS: [ string ]
|
* F77FLAGS: [ string ]
|
||||||
|
|
@ -325,6 +344,29 @@ of this file is:
|
||||||
of installing into the local filesystem.
|
of installing into the local filesystem.
|
||||||
- default: ''
|
- default: ''
|
||||||
|
|
||||||
* cantera_version: [ string ]
|
* VERBOSE: [ yes | no ]
|
||||||
- default: '2.0.0b1'
|
Create verbose output about what scons is doing.
|
||||||
|
- default: 'no'
|
||||||
|
|
||||||
|
* renamed_shared_libraries: [ yes | no ]
|
||||||
|
If this option is turned on, the shared libraries that are created
|
||||||
|
will be renamed to have a "_shared" extension added to their base
|
||||||
|
name. If not, the base names will be the same as the static
|
||||||
|
libraries. In some cases this simplifies subsequent linking
|
||||||
|
environments with static libraries and avoids a bug with using
|
||||||
|
valgrind with the -static linking flag.
|
||||||
|
- default: 'yes'
|
||||||
|
|
||||||
|
* layout: [ standard | compact | debian ]
|
||||||
|
The layout of the directory structure. 'standard' installs files to
|
||||||
|
several subdirectories under 'prefix', e.g. $prefix/bin,
|
||||||
|
$prefix/include/cantera, $prefix/lib. This layout is best used in
|
||||||
|
conjunction with 'prefix'='/usr/local'. 'compact' puts all installed
|
||||||
|
files in the subdirectory define by 'prefix'. This layout is best
|
||||||
|
for with a prefix like '/opt/cantera'. 'debian' installs to the
|
||||||
|
stage directory in a layout used for generating Debian packages.
|
||||||
|
- default: 'compact'
|
||||||
|
|
||||||
|
* cantera_version: [ string ]
|
||||||
|
- default: '2.2.1'
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
namespace Cantera
|
namespace Cantera
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//! Convenience class which inherits from both EdgePhase and EdgeKinetics
|
||||||
class Edge :
|
class Edge :
|
||||||
public EdgePhase, public EdgeKinetics
|
public EdgePhase, public EdgeKinetics
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
namespace Cantera
|
namespace Cantera
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//! Convenience class which inherits from both IdealGasPhase and GasKinetics
|
||||||
class IdealGasMix :
|
class IdealGasMix :
|
||||||
public IdealGasPhase,
|
public IdealGasPhase,
|
||||||
public GasKinetics
|
public GasKinetics
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
namespace Cantera
|
namespace Cantera
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//! Wrapper for ConstDensityThermo with constructor from file
|
||||||
class IncompressibleSolid : public ConstDensityThermo
|
class IncompressibleSolid : public ConstDensityThermo
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
namespace Cantera
|
namespace Cantera
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//! Wrapper for MetalPhase with constructor from file
|
||||||
class Metal : public MetalPhase
|
class Metal : public MetalPhase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@
|
||||||
namespace Cantera
|
namespace Cantera
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//! Wrapper for PureFluidPhase with constructor from file
|
||||||
class PureFluid : public PureFluidPhase
|
class PureFluid : public PureFluidPhase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -771,7 +771,7 @@ public:
|
||||||
}
|
}
|
||||||
bool frac = false;
|
bool frac = false;
|
||||||
for (size_t n = 0; n < stoich.size(); n++) {
|
for (size_t n = 0; n < stoich.size(); n++) {
|
||||||
if (fmod(stoich[n], 1.0) || fmod(order[n], 1.0)) {
|
if (fmod(stoich[n], 1.0) || stoich[n] != order[n]) {
|
||||||
frac = true;
|
frac = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -548,12 +548,16 @@ public:
|
||||||
//! Elemental mole fraction of element m
|
//! Elemental mole fraction of element m
|
||||||
/*!
|
/*!
|
||||||
* The elemental mole fraction \f$Z_{\mathrm{mole},m}\f$ of element \f$m\f$
|
* The elemental mole fraction \f$Z_{\mathrm{mole},m}\f$ of element \f$m\f$
|
||||||
* is defined as
|
* is the number of atoms of element *m* divided by the total number of
|
||||||
|
* atoms. It is defined as:
|
||||||
|
*
|
||||||
* \f[
|
* \f[
|
||||||
* Z_{\mathrm{mole},m} = \sum_k \frac{a_{m,k}}{\sum_j a_{j,k}} X_k
|
* Z_{\mathrm{mole},m} = \frac{\sum_k a_{m,k} X_k}
|
||||||
|
* {\sum_k \sum_j a_{j,k} X_k}
|
||||||
* \f]
|
* \f]
|
||||||
* with \f$a_{m,k}\f$ being the number of atoms of element \f$m\f$ in
|
* with \f$a_{m,k}\f$ being the number of atoms of element \f$m\f$ in
|
||||||
* species \f$k\f$and \f$X_k\f$ the mole fraction of species \f$k\f$.
|
* species \f$k\f$, \f$\sum_j\f$ being a sum over all elements, and
|
||||||
|
* \f$X_k\f$ being the mole fraction of species \f$k\f$.
|
||||||
*
|
*
|
||||||
* @param[in] m Index of the element within the phase. If m is outside the
|
* @param[in] m Index of the element within the phase. If m is outside the
|
||||||
* valid range, an exception will be thrown.
|
* valid range, an exception will be thrown.
|
||||||
|
|
@ -617,10 +621,12 @@ public:
|
||||||
//! Note the density of a phase is an independent variable.
|
//! Note the density of a phase is an independent variable.
|
||||||
//! @param[in] density_ density (kg/m^3).
|
//! @param[in] density_ density (kg/m^3).
|
||||||
virtual void setDensity(const doublereal density_) {
|
virtual void setDensity(const doublereal density_) {
|
||||||
if (density_ <= 0.0) {
|
if (density_ > 0.0) {
|
||||||
throw CanteraError("Phase::setDensity()", "density must be positive");
|
m_dens = density_;
|
||||||
|
} else {
|
||||||
|
throw CanteraError("Phase::setDensity()",
|
||||||
|
"density must be positive");
|
||||||
}
|
}
|
||||||
m_dens = density_;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Set the internally stored molar density (kmol/m^3) of the phase.
|
//! Set the internally stored molar density (kmol/m^3) of the phase.
|
||||||
|
|
@ -630,11 +636,12 @@ public:
|
||||||
//! Set the internally stored temperature of the phase (K).
|
//! Set the internally stored temperature of the phase (K).
|
||||||
//! @param temp Temperature in Kelvin
|
//! @param temp Temperature in Kelvin
|
||||||
virtual void setTemperature(const doublereal temp) {
|
virtual void setTemperature(const doublereal temp) {
|
||||||
if (temp <= 0) {
|
if (temp > 0) {
|
||||||
|
m_temp = temp;
|
||||||
|
} else {
|
||||||
throw CanteraError("Phase::setTemperature",
|
throw CanteraError("Phase::setTemperature",
|
||||||
"temperature must be positive");
|
"temperature must be positive");
|
||||||
}
|
}
|
||||||
m_temp = temp;
|
|
||||||
}
|
}
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -133,10 +133,18 @@ public:
|
||||||
|
|
||||||
//! return a reference to the contents.
|
//! return a reference to the contents.
|
||||||
thermo_t& contents() {
|
thermo_t& contents() {
|
||||||
|
if (!m_thermo) {
|
||||||
|
throw CanteraError("ReactorBase::contents",
|
||||||
|
"Reactor contents not defined.");
|
||||||
|
}
|
||||||
return *m_thermo;
|
return *m_thermo;
|
||||||
}
|
}
|
||||||
|
|
||||||
const thermo_t& contents() const {
|
const thermo_t& contents() const {
|
||||||
|
if (!m_thermo) {
|
||||||
|
throw CanteraError("ReactorBase::contents",
|
||||||
|
"Reactor contents not defined.");
|
||||||
|
}
|
||||||
return *m_thermo;
|
return *m_thermo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -167,6 +167,10 @@ public:
|
||||||
if (!m_init) {
|
if (!m_init) {
|
||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
|
if (p >= m_sensIndex.size()) {
|
||||||
|
throw IndexError("ReactorNet::sensitivity",
|
||||||
|
"m_sensIndex", p, m_sensIndex.size()-1);
|
||||||
|
}
|
||||||
return m_integ->sensitivity(k, m_sensIndex[p])/m_integ->solution(k);
|
return m_integ->sensitivity(k, m_sensIndex[p])/m_integ->solution(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool ready() {
|
virtual bool ready() {
|
||||||
return FlowDevice::ready() && m_master != 0;
|
return FlowDevice::ready() && m_master != 0 && m_coeffs.size() == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setMaster(FlowDevice* master) {
|
void setMaster(FlowDevice* master) {
|
||||||
|
|
@ -62,6 +62,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void updateMassFlowRate(doublereal time) {
|
virtual void updateMassFlowRate(doublereal time) {
|
||||||
|
if (!ready()) {
|
||||||
|
throw CanteraError("PressureController::updateMassFlowRate",
|
||||||
|
"Device is not ready; some parameters have not been set.");
|
||||||
|
}
|
||||||
doublereal master_mdot = m_master->massFlowRate(time);
|
doublereal master_mdot = m_master->massFlowRate(time);
|
||||||
m_mdot = master_mdot + m_coeffs[0]*(in().pressure() -
|
m_mdot = master_mdot + m_coeffs[0]*(in().pressure() -
|
||||||
out().pressure());
|
out().pressure());
|
||||||
|
|
@ -72,7 +76,8 @@ protected:
|
||||||
FlowDevice* m_master;
|
FlowDevice* m_master;
|
||||||
};
|
};
|
||||||
|
|
||||||
//! Supply a mass flow rate that is a function of the pressure drop across the valve.
|
//! Supply a mass flow rate that is a function of the pressure drop across the
|
||||||
|
//! valve.
|
||||||
/*!
|
/*!
|
||||||
* The default behavior is a linearly proportional to the pressure difference.
|
* The default behavior is a linearly proportional to the pressure difference.
|
||||||
* Note that real valves do not have this behavior, so this class does not
|
* Note that real valves do not have this behavior, so this class does not
|
||||||
|
|
@ -86,11 +91,15 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool ready() {
|
virtual bool ready() {
|
||||||
return FlowDevice::ready() && m_coeffs.size() >= 1;
|
return FlowDevice::ready() && (m_coeffs.size() == 1 || m_func);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Compute the currrent mass flow rate, based on the pressure difference.
|
/// Compute the currrent mass flow rate, based on the pressure difference.
|
||||||
virtual void updateMassFlowRate(doublereal time) {
|
virtual void updateMassFlowRate(doublereal time) {
|
||||||
|
if (!ready()) {
|
||||||
|
throw CanteraError("Valve::updateMassFlowRate",
|
||||||
|
"Device is not ready; some parameters have not been set.");
|
||||||
|
}
|
||||||
double delta_P = in().pressure() - out().pressure();
|
double delta_P = in().pressure() - out().pressure();
|
||||||
if (m_func) {
|
if (m_func) {
|
||||||
m_mdot = m_func->eval(delta_P);
|
m_mdot = m_func->eval(delta_P);
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ def configure_python(env, python_command):
|
||||||
"print(numpy.get_include())"))
|
"print(numpy.get_include())"))
|
||||||
info = getCommandOutput(python_command, '-c', script)
|
info = getCommandOutput(python_command, '-c', script)
|
||||||
module_ext, inc, pylib, prefix, py_version, numpy_include = info.splitlines()[-6:]
|
module_ext, inc, pylib, prefix, py_version, numpy_include = info.splitlines()[-6:]
|
||||||
env.Append(CPPPATH=[inc, numpy_include, Dir('#include')])
|
env.Prepend(CPPPATH=[Dir('#include'), inc, numpy_include])
|
||||||
env.Prepend(LIBS=env['cantera_libs'])
|
env.Prepend(LIBS=env['cantera_libs'])
|
||||||
if env['OS'] == 'Darwin':
|
if env['OS'] == 'Darwin':
|
||||||
env.Append(LINKFLAGS='-undefined dynamic_lookup')
|
env.Append(LINKFLAGS='-undefined dynamic_lookup')
|
||||||
|
|
@ -137,7 +137,7 @@ if localenv['python3_package'] == 'y':
|
||||||
obj = py3env.SharedObject('#build/temp-py/_cantera3', 'cantera/_cantera.cpp')
|
obj = py3env.SharedObject('#build/temp-py/_cantera3', 'cantera/_cantera.cpp')
|
||||||
ext = py3env.LoadableModule('#build/python3/cantera/_cantera%s' % module_ext,
|
ext = py3env.LoadableModule('#build/python3/cantera/_cantera%s' % module_ext,
|
||||||
obj, LIBPREFIX='', SHLIBSUFFIX=module_ext,
|
obj, LIBPREFIX='', SHLIBSUFFIX=module_ext,
|
||||||
LIBSUFFIXES=[module_ext])
|
SHLIBPREFIX='', LIBSUFFIXES=[module_ext])
|
||||||
py3env['py_extension'] = ext[0].name
|
py3env['py_extension'] = ext[0].name
|
||||||
|
|
||||||
py3env.SubstFile('setup3.py', 'setup.py.in')
|
py3env.SubstFile('setup3.py', 'setup.py.in')
|
||||||
|
|
@ -161,7 +161,7 @@ if localenv['python_package'] == 'full':
|
||||||
obj = py2env.SharedObject('#build/temp-py/_cantera2', 'cantera/_cantera.cpp')
|
obj = py2env.SharedObject('#build/temp-py/_cantera2', 'cantera/_cantera.cpp')
|
||||||
ext = py2env.LoadableModule('#build/python2/cantera/_cantera%s' % module_ext,
|
ext = py2env.LoadableModule('#build/python2/cantera/_cantera%s' % module_ext,
|
||||||
obj, LIBPREFIX='', SHLIBSUFFIX=module_ext,
|
obj, LIBPREFIX='', SHLIBSUFFIX=module_ext,
|
||||||
LIBSUFFIXES=[module_ext])
|
SHLIBPREFIX='', LIBSUFFIXES=[module_ext])
|
||||||
py2env['py_extension'] = ext[0].name
|
py2env['py_extension'] = ext[0].name
|
||||||
py2env.SubstFile('setup2.py', 'setup.py.in')
|
py2env.SubstFile('setup2.py', 'setup.py.in')
|
||||||
build_cmd = ('cd interfaces/cython &&'
|
build_cmd = ('cd interfaces/cython &&'
|
||||||
|
|
|
||||||
|
|
@ -512,8 +512,8 @@ cdef extern from "cantera/zeroD/Wall.h":
|
||||||
cdef extern from "cantera/zeroD/flowControllers.h":
|
cdef extern from "cantera/zeroD/flowControllers.h":
|
||||||
cdef cppclass CxxFlowDevice "Cantera::FlowDevice":
|
cdef cppclass CxxFlowDevice "Cantera::FlowDevice":
|
||||||
CxxFlowDevice()
|
CxxFlowDevice()
|
||||||
double massFlowRate(double)
|
double massFlowRate(double) except +
|
||||||
cbool install(CxxReactorBase&, CxxReactorBase&)
|
cbool install(CxxReactorBase&, CxxReactorBase&) except +
|
||||||
void setFunction(CxxFunc1*)
|
void setFunction(CxxFunc1*)
|
||||||
void setParameters(int, double*)
|
void setParameters(int, double*)
|
||||||
|
|
||||||
|
|
@ -977,7 +977,7 @@ cdef class ReactionPathDiagram:
|
||||||
cdef CxxStringStream* _log
|
cdef CxxStringStream* _log
|
||||||
|
|
||||||
# free functions
|
# free functions
|
||||||
cdef string stringify(x)
|
cdef string stringify(x) except *
|
||||||
cdef pystr(string x)
|
cdef pystr(string x)
|
||||||
cdef np.ndarray get_species_array(Kinetics kin, kineticsMethod1d method)
|
cdef np.ndarray get_species_array(Kinetics kin, kineticsMethod1d method)
|
||||||
cdef np.ndarray get_reaction_array(Kinetics kin, kineticsMethod1d method)
|
cdef np.ndarray get_reaction_array(Kinetics kin, kineticsMethod1d method)
|
||||||
|
|
|
||||||
|
|
@ -70,16 +70,17 @@ if sys.version_info[0] == 2:
|
||||||
def strip_nonascii(s):
|
def strip_nonascii(s):
|
||||||
return s.decode('ascii', 'ignore')
|
return s.decode('ascii', 'ignore')
|
||||||
|
|
||||||
def open(filename, *args):
|
def open(filename, mode, *args):
|
||||||
return _open(filename, *args)
|
return _open(filename, mode, *args)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
string_types = (str,)
|
string_types = (str,)
|
||||||
def strip_nonascii(s):
|
def strip_nonascii(s):
|
||||||
return s.encode('ascii', 'ignore').decode()
|
return s.encode('ascii', 'ignore').decode()
|
||||||
|
|
||||||
def open(filename, *args):
|
def open(filename, mode, *args):
|
||||||
return _open(filename, *args, errors='ignore')
|
mode = mode.replace('U', '')
|
||||||
|
return _open(filename, mode, *args, errors='ignore')
|
||||||
|
|
||||||
|
|
||||||
def compatible_quantities(quantity_basis, units):
|
def compatible_quantities(quantity_basis, units):
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ print('Species: {0}'.format(', '.join(S.name for S in species)))
|
||||||
all_reactions = ct.Reaction.listFromFile('gri30.xml')
|
all_reactions = ct.Reaction.listFromFile('gri30.xml')
|
||||||
reactions = []
|
reactions = []
|
||||||
|
|
||||||
print '\nReactions:'
|
print('\nReactions:')
|
||||||
for R in all_reactions:
|
for R in all_reactions:
|
||||||
if not all(reactant in species_names for reactant in R.reactants):
|
if not all(reactant in species_names for reactant in R.reactants):
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
|
|
@ -40,7 +40,7 @@ def get_viscosity(args):
|
||||||
mech, T, P, X = args
|
mech, T, P, X = args
|
||||||
gas = gases[mech]
|
gas = gases[mech]
|
||||||
gas.TPX = T, P, X
|
gas.TPX = T, P, X
|
||||||
return gas.enthalpy_mass
|
return gas.viscosity
|
||||||
|
|
||||||
def parallel(mech, predicate, nProcs, nTemps):
|
def parallel(mech, predicate, nProcs, nTemps):
|
||||||
"""
|
"""
|
||||||
|
|
@ -64,13 +64,13 @@ def serial(mech, predicate, nTemps):
|
||||||
P = ct.one_atm
|
P = ct.one_atm
|
||||||
X = 'CH4:1.0, O2:1.0, N2:3.76'
|
X = 'CH4:1.0, O2:1.0, N2:3.76'
|
||||||
init_process(mech)
|
init_process(mech)
|
||||||
y = map(predicate,
|
y = list(map(predicate,
|
||||||
zip(itertools.repeat(mech),
|
zip(itertools.repeat(mech),
|
||||||
np.linspace(300, 900, nTemps),
|
np.linspace(300, 900, nTemps),
|
||||||
itertools.repeat(P),
|
itertools.repeat(P),
|
||||||
itertools.repeat(X)))
|
itertools.repeat(X))))
|
||||||
return y
|
return y
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
# For functions where the work done in each subprocess is substantial,
|
# For functions where the work done in each subprocess is substantial,
|
||||||
# significant speedup can be obtained using the multiprocessing module.
|
# significant speedup can be obtained using the multiprocessing module.
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from ._cantera import *
|
from ._cantera import *
|
||||||
|
import csv as _csv
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# Python 2.7 or 3.2+
|
# Python 2.7 or 3.2+
|
||||||
|
|
@ -265,7 +266,7 @@ class FlameBase(Sim1D):
|
||||||
V = self.V
|
V = self.V
|
||||||
|
|
||||||
csvfile = open(filename, 'w')
|
csvfile = open(filename, 'w')
|
||||||
writer = csv.writer(csvfile)
|
writer = _csv.writer(csvfile)
|
||||||
writer.writerow(['z (m)', 'u (m/s)', 'V (1/s)',
|
writer.writerow(['z (m)', 'u (m/s)', 'V (1/s)',
|
||||||
'T (K)', 'rho (kg/m3)'] + self.gas.species_names)
|
'T (K)', 'rho (kg/m3)'] + self.gas.species_names)
|
||||||
for n in range(self.flame.n_points):
|
for n in range(self.flame.n_points):
|
||||||
|
|
|
||||||
|
|
@ -426,8 +426,8 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
||||||
def test_irreversibility(self):
|
def test_irreversibility(self):
|
||||||
# Reactions are irreversible
|
# Reactions are irreversible
|
||||||
Rr = self.gas.reverse_rate_constants
|
Rr = self.gas.reverse_rate_constants
|
||||||
self.assertEqual(Rr[0], 0.0)
|
for i in range(3):
|
||||||
self.assertEqual(Rr[1], 0.0)
|
self.assertEqual(Rr[i], 0.0)
|
||||||
|
|
||||||
def test_rateConstants(self):
|
def test_rateConstants(self):
|
||||||
# species order: [H, AR, R1A, R1B, P1]
|
# species order: [H, AR, R1A, R1B, P1]
|
||||||
|
|
@ -436,6 +436,7 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
||||||
kf = self.gas.forward_rate_constants
|
kf = self.gas.forward_rate_constants
|
||||||
self.assertNear(Rf[0], kf[0] * C[2]**1.5 * C[3]**0.5)
|
self.assertNear(Rf[0], kf[0] * C[2]**1.5 * C[3]**0.5)
|
||||||
self.assertNear(Rf[1], kf[1] * C[0]**1.0 * C[4]**0.2)
|
self.assertNear(Rf[1], kf[1] * C[0]**1.0 * C[4]**0.2)
|
||||||
|
self.assertNear(Rf[2], kf[2] * C[2]**3.0)
|
||||||
|
|
||||||
def test_ratio1(self):
|
def test_ratio1(self):
|
||||||
rop1 = self.gas.forward_rates_of_progress
|
rop1 = self.gas.forward_rates_of_progress
|
||||||
|
|
@ -445,6 +446,7 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
||||||
ratio = rop2/rop1
|
ratio = rop2/rop1
|
||||||
self.assertNear(ratio[0], 2**1.5) # order of R1A is 1.5
|
self.assertNear(ratio[0], 2**1.5) # order of R1A is 1.5
|
||||||
self.assertNear(ratio[1], 2**1.0) # order of H is 1.0
|
self.assertNear(ratio[1], 2**1.0) # order of H is 1.0
|
||||||
|
self.assertNear(ratio[2], 2**3) # order of R1A is 3
|
||||||
|
|
||||||
def test_ratio2(self):
|
def test_ratio2(self):
|
||||||
rop1 = self.gas.forward_rates_of_progress
|
rop1 = self.gas.forward_rates_of_progress
|
||||||
|
|
@ -454,6 +456,7 @@ class ExplicitForwardOrderTest(utilities.CanteraTest):
|
||||||
ratio = rop2/rop1
|
ratio = rop2/rop1
|
||||||
self.assertNear(ratio[0], 2**0.5) # order of R1B is 0.5
|
self.assertNear(ratio[0], 2**0.5) # order of R1B is 0.5
|
||||||
self.assertNear(ratio[1], 2**0.2) # order of P1 is 1.0
|
self.assertNear(ratio[1], 2**0.2) # order of P1 is 1.0
|
||||||
|
self.assertNear(ratio[2], 2**0.0) # order of R1B is 0
|
||||||
|
|
||||||
|
|
||||||
class TestSofcKinetics(utilities.CanteraTest):
|
class TestSofcKinetics(utilities.CanteraTest):
|
||||||
|
|
|
||||||
|
|
@ -241,7 +241,7 @@ class TestFreeFlame(utilities.CanteraTest):
|
||||||
|
|
||||||
self.create_sim(p, Tin, reactants)
|
self.create_sim(p, Tin, reactants)
|
||||||
self.solve_fixed_T()
|
self.solve_fixed_T()
|
||||||
filename = 'onedim-fixed-T.xml'
|
filename = 'onedim-fixed-T{0}.xml'.format(utilities.python_version)
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
os.remove(filename)
|
os.remove(filename)
|
||||||
|
|
||||||
|
|
@ -302,7 +302,7 @@ class TestFreeFlame(utilities.CanteraTest):
|
||||||
p = 2 * ct.one_atm
|
p = 2 * ct.one_atm
|
||||||
Tin = 400
|
Tin = 400
|
||||||
|
|
||||||
filename = 'onedim-add-species.xml'
|
filename = 'onedim-add-species{0}.xml'.format(utilities.python_version)
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
os.remove(filename)
|
os.remove(filename)
|
||||||
|
|
||||||
|
|
@ -330,7 +330,7 @@ class TestFreeFlame(utilities.CanteraTest):
|
||||||
p = 2 * ct.one_atm
|
p = 2 * ct.one_atm
|
||||||
Tin = 400
|
Tin = 400
|
||||||
|
|
||||||
filename = 'onedim-add-species.xml'
|
filename = 'onedim-add-species{0}.xml'.format(utilities.python_version)
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
os.remove(filename)
|
os.remove(filename)
|
||||||
|
|
||||||
|
|
@ -353,6 +353,19 @@ class TestFreeFlame(utilities.CanteraTest):
|
||||||
k1 = gas1.species_index(species)
|
k1 = gas1.species_index(species)
|
||||||
self.assertArrayNear(Y1[k1], Y2[k2])
|
self.assertArrayNear(Y1[k1], Y2[k2])
|
||||||
|
|
||||||
|
def test_write_csv(self):
|
||||||
|
filename = 'onedim-write_csv{0}.csv'.format(utilities.python_version)
|
||||||
|
if os.path.exists(filename):
|
||||||
|
os.remove(filename)
|
||||||
|
|
||||||
|
self.create_sim(2e5, 350, 'H2:1.0, O2:2.0', mech='h2o2.xml')
|
||||||
|
self.sim.write_csv(filename)
|
||||||
|
data = np.genfromtxt(filename, delimiter=',', skip_header=1)
|
||||||
|
self.assertArrayNear(data[:,0], self.sim.grid)
|
||||||
|
self.assertArrayNear(data[:,3], self.sim.T)
|
||||||
|
k = self.gas.species_index('H2')
|
||||||
|
self.assertArrayNear(data[:,5+k], self.sim.X[k,:])
|
||||||
|
|
||||||
def test_refine_criteria_boundscheck(self):
|
def test_refine_criteria_boundscheck(self):
|
||||||
self.create_sim(ct.one_atm, 300.0, 'H2:1.1, O2:1, AR:5')
|
self.create_sim(ct.one_atm, 300.0, 'H2:1.1, O2:1, AR:5')
|
||||||
good = [3.0, 0.1, 0.2, 0.05]
|
good = [3.0, 0.1, 0.2, 0.05]
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,14 @@ class TestPureFluid(utilities.CanteraTest):
|
||||||
self.check_fd_properties(self.water.max_temp*(1-1e-5), 101325,
|
self.check_fd_properties(self.water.max_temp*(1-1e-5), 101325,
|
||||||
self.water.max_temp*(1-1e-4), 101325, 1e-2)
|
self.water.max_temp*(1-1e-4), 101325, 1e-2)
|
||||||
|
|
||||||
|
def test_TPX(self):
|
||||||
|
self.water.TX = 400, 0.8
|
||||||
|
T,P,X = self.water.TPX
|
||||||
|
self.assertNear(T, 400)
|
||||||
|
self.assertNear(X, 0.8)
|
||||||
|
with self.assertRaises(AttributeError):
|
||||||
|
self.water.TPX = 500, 101325, 0.3
|
||||||
|
|
||||||
|
|
||||||
# To minimize errors when transcribing tabulated data, the input units here are:
|
# To minimize errors when transcribing tabulated data, the input units here are:
|
||||||
# T: K, P: MPa, rho: kg/m3, v: m3/kg, (u,h): kJ/kg, s: kJ/kg-K
|
# T: K, P: MPa, rho: kg/m3, v: m3/kg, (u,h): kJ/kg, s: kJ/kg-K
|
||||||
|
|
|
||||||
|
|
@ -433,6 +433,19 @@ class TestReactor(utilities.CanteraTest):
|
||||||
self.assertNear(speciesMass(kAr), mAr)
|
self.assertNear(speciesMass(kAr), mAr)
|
||||||
self.assertNear(speciesMass(kO2), mO2)
|
self.assertNear(speciesMass(kO2), mO2)
|
||||||
|
|
||||||
|
def test_valve_errors(self):
|
||||||
|
self.make_reactors()
|
||||||
|
res = ct.Reservoir()
|
||||||
|
|
||||||
|
with self.assertRaises(RuntimeError):
|
||||||
|
# Must assign contents of both reactors before creating Valve
|
||||||
|
v = ct.Valve(self.r1, res)
|
||||||
|
|
||||||
|
v = ct.Valve(self.r1, self.r2)
|
||||||
|
with self.assertRaises(RuntimeError):
|
||||||
|
# inlet and outlet cannot be reassigned
|
||||||
|
v._install(self.r2, self.r1)
|
||||||
|
|
||||||
def test_pressure_controller(self):
|
def test_pressure_controller(self):
|
||||||
self.make_reactors(n_reactors=1)
|
self.make_reactors(n_reactors=1)
|
||||||
g = ct.Solution('h2o2.xml')
|
g = ct.Solution('h2o2.xml')
|
||||||
|
|
@ -456,6 +469,25 @@ class TestReactor(utilities.CanteraTest):
|
||||||
dP = self.r1.thermo.P - outlet_reservoir.thermo.P
|
dP = self.r1.thermo.P - outlet_reservoir.thermo.P
|
||||||
self.assertNear(mdot(t) + 1e-5 * dP, pc.mdot(t))
|
self.assertNear(mdot(t) + 1e-5 * dP, pc.mdot(t))
|
||||||
|
|
||||||
|
def test_pressure_controller_errors(self):
|
||||||
|
self.make_reactors()
|
||||||
|
res = ct.Reservoir(self.gas1)
|
||||||
|
mfc = ct.MassFlowController(res, self.r1, mdot=0.6)
|
||||||
|
|
||||||
|
p = ct.PressureController(self.r1, self.r2, master=mfc, K=0.5)
|
||||||
|
|
||||||
|
with self.assertRaises(RuntimeError):
|
||||||
|
p = ct.PressureController(self.r1, self.r2, K=0.5)
|
||||||
|
p.mdot(0.0)
|
||||||
|
|
||||||
|
with self.assertRaises(RuntimeError):
|
||||||
|
p = ct.PressureController(self.r1, self.r2, master=mfc)
|
||||||
|
p.mdot(0.0)
|
||||||
|
|
||||||
|
with self.assertRaises(RuntimeError):
|
||||||
|
p = ct.PressureController(self.r1, self.r2)
|
||||||
|
p.mdot(0.0)
|
||||||
|
|
||||||
def test_set_initial_time(self):
|
def test_set_initial_time(self):
|
||||||
self.make_reactors(P1=10*ct.one_atm, X1='AR:1.0', X2='O2:1.0')
|
self.make_reactors(P1=10*ct.one_atm, X1='AR:1.0', X2='O2:1.0')
|
||||||
self.net.rtol = 1e-12
|
self.net.rtol = 1e-12
|
||||||
|
|
|
||||||
|
|
@ -65,8 +65,8 @@ class TestThermoPhase(utilities.CanteraTest):
|
||||||
|
|
||||||
mO = self.phase.element_index('O')
|
mO = self.phase.element_index('O')
|
||||||
self.assertEqual(Zo, self.phase.elemental_mole_fraction(mO))
|
self.assertEqual(Zo, self.phase.elemental_mole_fraction(mO))
|
||||||
self.assertNear(Zo, 0.5/3 + 0.5)
|
self.assertNear(Zo, (0.5 + 1) / (0.5*3 + 0.5*2))
|
||||||
self.assertNear(Zh, 0.5*2/3)
|
self.assertNear(Zh, (2*0.5) / (0.5*3 + 0.5*2))
|
||||||
self.assertEqual(Zar, 0.0)
|
self.assertEqual(Zar, 0.0)
|
||||||
|
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
|
|
@ -74,6 +74,22 @@ class TestThermoPhase(utilities.CanteraTest):
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
self.phase.elemental_mole_fraction(5)
|
self.phase.elemental_mole_fraction(5)
|
||||||
|
|
||||||
|
def test_elemental_mass_mole_fraction(self):
|
||||||
|
# expected relationship between elmental mass and mole fractions
|
||||||
|
comps = ['H2O:0.5, O2:0.5', 'H2:0.1, O2:0.4, H2O2:0.3, AR:0.2',
|
||||||
|
'O2:0.1, H2:0.9']
|
||||||
|
for comp in comps:
|
||||||
|
self.phase.X = comp
|
||||||
|
|
||||||
|
denom = sum(self.phase.elemental_mole_fraction(i)
|
||||||
|
* self.phase.atomic_weight(i)
|
||||||
|
for i in range(self.phase.n_elements))
|
||||||
|
|
||||||
|
for i in range(self.phase.n_elements):
|
||||||
|
self.assertNear(self.phase.elemental_mass_fraction(i),
|
||||||
|
self.phase.elemental_mole_fraction(i)
|
||||||
|
* self.phase.atomic_weight(i) / denom)
|
||||||
|
|
||||||
def test_weights(self):
|
def test_weights(self):
|
||||||
atomic_weights = self.phase.atomic_weights
|
atomic_weights = self.phase.atomic_weights
|
||||||
molecular_weights = self.phase.molecular_weights
|
molecular_weights = self.phase.molecular_weights
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,8 @@ import os
|
||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
_ver = sys.version_info[:2]
|
_ver = sys.version_info[:2]
|
||||||
|
python_version = str(_ver[0])
|
||||||
|
|
||||||
if _ver < (2,7) or (3,0) <= _ver < (3,2):
|
if _ver < (2,7) or (3,0) <= _ver < (3,2):
|
||||||
# unittest2 is a backport of the new features added to the unittest
|
# unittest2 is a backport of the new features added to the unittest
|
||||||
# testing framework in Python 2.7 and Python 3.2. See
|
# testing framework in Python 2.7 and Python 3.2. See
|
||||||
|
|
|
||||||
|
|
@ -557,13 +557,15 @@ cdef class ThermoPhase(_SolutionBase):
|
||||||
def elemental_mole_fraction(self, m):
|
def elemental_mole_fraction(self, m):
|
||||||
r"""
|
r"""
|
||||||
Get the elemental mole fraction :math:`Z_{\mathrm{mole},m}` of element
|
Get the elemental mole fraction :math:`Z_{\mathrm{mole},m}` of element
|
||||||
:math:`m` as defined by:
|
:math:`m` (the number of atoms of element m divided by the total number
|
||||||
|
of atoms) as defined by:
|
||||||
|
|
||||||
.. math:: Z_{\mathrm{mole},m} = \sum_k \frac{a_{m,k}}{\sum_j a_{j,k}} X_k
|
.. math:: Z_{\mathrm{mole},m} = \frac{\sum_k a_{m,k} X_k}
|
||||||
|
{\sum_k \sum_j a_{j,k} X_k}
|
||||||
|
|
||||||
with :math:`a_{m,k}` being the number of atoms of element :math:`m` in
|
with :math:`a_{m,k}` being the number of atoms of element :math:`m` in
|
||||||
species :math:`k` and :math:`X_k` the mole fraction of species
|
species :math:`k`, :math:`\sum_j` being a sum over all elements, and
|
||||||
:math:`k`.
|
:math:`X_k` being the mole fraction of species :math:`k`.
|
||||||
|
|
||||||
:param m:
|
:param m:
|
||||||
Base element, may be specified by name or by index.
|
Base element, may be specified by name or by index.
|
||||||
|
|
@ -1200,3 +1202,51 @@ cdef class PureFluid(ThermoPhase):
|
||||||
P = values[0] if values[0] is not None else self.P
|
P = values[0] if values[0] is not None else self.P
|
||||||
X = values[1] if values[1] is not None else self.X
|
X = values[1] if values[1] is not None else self.X
|
||||||
self.thermo.setState_Psat(P, X)
|
self.thermo.setState_Psat(P, X)
|
||||||
|
|
||||||
|
property TDX:
|
||||||
|
"""
|
||||||
|
Get the temperature [K], density [kg/m^3 or kmol/m^3], and vapor
|
||||||
|
fraction.
|
||||||
|
"""
|
||||||
|
def __get__(self):
|
||||||
|
return self.T, self.density, self.X
|
||||||
|
|
||||||
|
property TPX:
|
||||||
|
"""Get the temperature [K], pressure [Pa], and vapor fraction."""
|
||||||
|
def __get__(self):
|
||||||
|
return self.T, self.P, self.X
|
||||||
|
|
||||||
|
property UVX:
|
||||||
|
"""
|
||||||
|
Get the internal energy [J/kg or J/kmol], specific volume
|
||||||
|
[m^3/kg or m^3/kmol], and vapor fraction.
|
||||||
|
"""
|
||||||
|
def __get__(self):
|
||||||
|
return self.u, self.v, self.X
|
||||||
|
|
||||||
|
property DPX:
|
||||||
|
"""Get the density [kg/m^3], pressure [Pa], and vapor fraction."""
|
||||||
|
def __get__(self):
|
||||||
|
return self.density, self.P, self.X
|
||||||
|
|
||||||
|
property HPX:
|
||||||
|
"""
|
||||||
|
Get the enthalpy [J/kg or J/kmol], pressure [Pa] and vapor fraction.
|
||||||
|
"""
|
||||||
|
def __get__(self):
|
||||||
|
return self.h, self.P, self.X
|
||||||
|
|
||||||
|
property SPX:
|
||||||
|
"""
|
||||||
|
Get the entropy [J/kg/K or J/kmol/K], pressure [Pa], and vapor fraction.
|
||||||
|
"""
|
||||||
|
def __get__(self):
|
||||||
|
return self.s, self.P, self.X
|
||||||
|
|
||||||
|
property SVX:
|
||||||
|
"""
|
||||||
|
Get the entropy [J/kg/K or J/kmol/K], specific volume [m^3/kg or
|
||||||
|
m^3/kmol], and vapor fraction.
|
||||||
|
"""
|
||||||
|
def __get__(self):
|
||||||
|
return self.s, self.v, self.X
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ cdef int _pythonMajorVersion = sys.version_info[0]
|
||||||
cdef CxxPythonLogger* _logger = new CxxPythonLogger()
|
cdef CxxPythonLogger* _logger = new CxxPythonLogger()
|
||||||
CxxSetLogger(_logger)
|
CxxSetLogger(_logger)
|
||||||
|
|
||||||
cdef string stringify(x):
|
cdef string stringify(x) except *:
|
||||||
""" Converts Python strings to std::string. """
|
""" Converts Python strings to std::string. """
|
||||||
# This method works with both Python 2.x and 3.x.
|
# This method works with both Python 2.x and 3.x.
|
||||||
if isinstance(x, bytes):
|
if isinstance(x, bytes):
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,15 @@
|
||||||
function setState_Psat(tp, px)
|
function setState_Psat(tp, px)
|
||||||
% SETSTATE_PSAT Set the fluid to a saturated state at a given pressure.
|
% SETSTATE_PSAT Set the fluid state using the given pressure and quality.
|
||||||
% setState_Psat(tp,px)
|
% setState_Psat(tp,px)
|
||||||
|
% The fluid state will be set to a saturated liquid-vapor state using the
|
||||||
|
% input pressure and vapor fraction (quality) as the independent,
|
||||||
|
% intensive variables.
|
||||||
% :param tp:
|
% :param tp:
|
||||||
% Instance of class :mat:func:`ThermoPhase` (or another
|
% Instance of class :mat:func:`ThermoPhase` (or another
|
||||||
% class derived from ThermoPhase)
|
% class derived from ThermoPhase)
|
||||||
% :param px:
|
% :param px:
|
||||||
% Pressure. Units: Pa
|
% Vector of length 2 containing the desired values for the pressure (Pa)
|
||||||
|
% and the vapor fraction
|
||||||
%
|
%
|
||||||
|
|
||||||
thermo_set(tp.tp_id, 24, px);
|
thermo_set(tp.tp_id, 24, px);
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,15 @@
|
||||||
function setState_Tsat(tp, tx)
|
function setState_Tsat(tp, tx)
|
||||||
% SETSTATE_TSAT Set the fluid to a saturated state at a given temperature.
|
% SETSTATE_TSAT Set the fluid state using the given temperature and quality.
|
||||||
% setState_Tsat(tp,tx)
|
% setState_Tsat(tp,tx)
|
||||||
|
% The fluid state will be set to a saturated liquid-vapor state using the
|
||||||
|
% input temperature and vapor fraction (quality) as the independent,
|
||||||
|
% intensive variables.
|
||||||
% :param tp:
|
% :param tp:
|
||||||
% Instance of class :mat:func:`ThermoPhase` (or another
|
% Instance of class :mat:func:`ThermoPhase` (or another
|
||||||
% class derived from ThermoPhase)
|
% class derived from ThermoPhase)
|
||||||
% :param tx:
|
% :param tx:
|
||||||
% Temperature. Units: K
|
% Vector of length 2 containing the desired values for the temperature (K)
|
||||||
|
% and the vapor fraction (quality)
|
||||||
%
|
%
|
||||||
|
|
||||||
thermo_set(tp.tp_id, 25, tx);
|
thermo_set(tp.tp_id, 25, tx);
|
||||||
|
|
|
||||||
|
|
@ -6,4 +6,4 @@ function setState_satLiquid(tp)
|
||||||
% class derived from ThermoPhase)
|
% class derived from ThermoPhase)
|
||||||
%
|
%
|
||||||
|
|
||||||
thermo_set(tp.tp_id, 2, 0);
|
set(tp, 'T', temperature(tp), 'Liquid', 1.0)
|
||||||
|
|
|
||||||
|
|
@ -6,4 +6,4 @@ function setState_satVapor(tp)
|
||||||
% class derived from ThermoPhase)
|
% class derived from ThermoPhase)
|
||||||
%
|
%
|
||||||
|
|
||||||
thermo_set(tp.tp_id, 3, 0);
|
set(tp, 'T', temperature(tp), 'Vapor', 1.0)
|
||||||
|
|
|
||||||
|
|
@ -64,15 +64,7 @@ CANTERA_SUNDIALS_LIBS=@mak_sundials_libdir@ @mak_sundials_libs@
|
||||||
# BLAS LAPACK LINKAGE
|
# BLAS LAPACK LINKAGE
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
CANTERA_have_blas_lapack_dir=@mak_have_blas_lapack_dir@
|
CANTERA_BLAS_LAPACK_LIBS=-L@blas_lapack_dir@ @mak_blas_lapack_libs@
|
||||||
|
|
||||||
ifeq ($(CANTERA_have_blas_lapack_dir), 1)
|
|
||||||
CANTERA_BLAS_LAPACK_LIBS=@blas_lapack_dir@ @mak_blas_lapack_libs@
|
|
||||||
CANTERA_BLAS_LAPACK_LIBS_DEP= @mak_blas_lapack_libs_dep@
|
|
||||||
else
|
|
||||||
CANTERA_BLAS_LAPACK_LIBS=@mak_blas_lapack_libs@
|
|
||||||
CANTERA_BLAS_LAPACK_LIBS_DEP=$(CANTERA_INSTALL_DIR)/lib/libctlapack.a $(CANTERA_INSTALL_DIR)/lib/libctblas.a
|
|
||||||
endif
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
# COMBINATIONS OF INCLUDES AND LIBS
|
# COMBINATIONS OF INCLUDES AND LIBS
|
||||||
|
|
@ -94,9 +86,7 @@ CANTERA_LIBS=$(CANTERA_CORE_LIBS) \
|
||||||
CANTERA_TOTAL_LIBS=$(CANTERA_LIBS)
|
CANTERA_TOTAL_LIBS=$(CANTERA_LIBS)
|
||||||
|
|
||||||
CANTERA_TOTAL_LIBS_DEP= $(CANTERA_CORE_LIBS_DEP) \
|
CANTERA_TOTAL_LIBS_DEP= $(CANTERA_CORE_LIBS_DEP) \
|
||||||
$(CANTERA_SUNDIALS_LIBS_DEP) \
|
$(CANTERA_SUNDIALS_LIBS_DEP)
|
||||||
$(CANTERA_BLAS_LAPACK_LIBS_DEP)
|
|
||||||
|
|
||||||
|
|
||||||
CANTERA_FORTRAN_LIBS=$(CANTERA_CORE_FTN) \
|
CANTERA_FORTRAN_LIBS=$(CANTERA_CORE_FTN) \
|
||||||
$(CANTERA_EXTRA_LIBDIRS) $(CANTERA_SUNDIALS_LIBS) \
|
$(CANTERA_EXTRA_LIBDIRS) $(CANTERA_SUNDIALS_LIBS) \
|
||||||
|
|
|
||||||
|
|
@ -32,10 +32,10 @@ pc_cflags = []
|
||||||
|
|
||||||
localenv['mak_corelibs'] = '-lcantera'
|
localenv['mak_corelibs'] = '-lcantera'
|
||||||
|
|
||||||
localenv['mak_extra_includes'] = ['-I%s' % s for s in localenv['extra_inc_dirs']]
|
localenv['mak_extra_includes'] = ' '.join('-I%s' % s for s in localenv['extra_inc_dirs'])
|
||||||
pc_incdirs.extend(localenv['extra_inc_dirs'])
|
pc_incdirs.extend(localenv['extra_inc_dirs'])
|
||||||
|
|
||||||
localenv['mak_extra_libdirs'] = ['-L%s' % s for s in localenv['extra_lib_dirs']]
|
localenv['mak_extra_libdirs'] = ' '.join('-L%s' % s for s in localenv['extra_lib_dirs'])
|
||||||
pc_libdirs.extend(localenv['extra_lib_dirs'])
|
pc_libdirs.extend(localenv['extra_lib_dirs'])
|
||||||
|
|
||||||
if env['use_sundials'] == 'n':
|
if env['use_sundials'] == 'n':
|
||||||
|
|
@ -74,14 +74,7 @@ localenv['mak_boost_libs'] = ' '.join('-l%s' % s for s in localenv['boost_libs']
|
||||||
pc_libs += localenv['boost_libs']
|
pc_libs += localenv['boost_libs']
|
||||||
|
|
||||||
# Handle BLAS/LAPACK linkage
|
# Handle BLAS/LAPACK linkage
|
||||||
localenv['mak_have_blas_lapack_dir'] = '1' if localenv['blas_lapack_dir'] else '0'
|
localenv['mak_blas_lapack_libs'] = ' '.join('-l%s' % s for s in localenv['blas_lapack_libs'])
|
||||||
|
|
||||||
if localenv['blas_lapack_dir']:
|
|
||||||
localenv['mak_blas_lapack_libs'] = ' '.join('-l%s' % s for s in localenv['blas_lapack_libs'])
|
|
||||||
localenv['mak_blas_lapack_libs_dep'] = ''
|
|
||||||
else:
|
|
||||||
localenv['mak_blas_lapack_libs'] = ''
|
|
||||||
localenv['mak_blas_lapack_libs_dep'] = ''
|
|
||||||
|
|
||||||
if 'Accelerate' in localenv['FRAMEWORKS']:
|
if 'Accelerate' in localenv['FRAMEWORKS']:
|
||||||
localenv['mak_blas_lapack_libs'] += ' -framework Accelerate'
|
localenv['mak_blas_lapack_libs'] += ' -framework Accelerate'
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#define BVP_H
|
#define BVP_H
|
||||||
|
|
||||||
#include "cantera/onedim.h"
|
#include "cantera/onedim.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
/// Namespace for the boundary value problem package.
|
/// Namespace for the boundary value problem package.
|
||||||
namespace BVP
|
namespace BVP
|
||||||
|
|
@ -113,18 +114,19 @@ public:
|
||||||
* @param n Component number.
|
* @param n Component number.
|
||||||
* @param c Component parameter values
|
* @param c Component parameter values
|
||||||
*/
|
*/
|
||||||
void setComponent(int n, Component& c) {
|
void setComponent(size_t n, Component& c) {
|
||||||
if (m_sim == 0) {
|
if (m_sim == 0) {
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
if (n < 0 || n >= m_nv) {
|
if (n >= m_nv) {
|
||||||
throw Cantera::CanteraError("BoundaryValueProblem::setComponent",
|
throw Cantera::CanteraError("BoundaryValueProblem::setComponent",
|
||||||
"Illegal solution component number");
|
"Illegal solution component number");
|
||||||
}
|
}
|
||||||
// set the upper and lower bounds for this component
|
// set the upper and lower bounds for this component
|
||||||
setBounds(n, c.lower, c.upper);
|
setBounds(n, c.lower, c.upper);
|
||||||
// set the error tolerances
|
// set the error tolerances
|
||||||
setTolerances(n, c.rtol, c.atol);
|
setSteadyTolerances(c.rtol, c.atol, n);
|
||||||
|
setTransientTolerances(c.rtol, c.atol, n);
|
||||||
// specify whether this component should be considered in
|
// specify whether this component should be considered in
|
||||||
// refining the grid
|
// refining the grid
|
||||||
m_refiner->setActive(n, c.refine);
|
m_refiner->setActive(n, c.refine);
|
||||||
|
|
@ -209,7 +211,7 @@ protected:
|
||||||
* True if n is the index of the left-most grid point (zero),
|
* True if n is the index of the left-most grid point (zero),
|
||||||
* false otherwise.
|
* false otherwise.
|
||||||
*/
|
*/
|
||||||
bool isLeft(int n) const {
|
bool isLeft(size_t n) const {
|
||||||
return (n == 0);
|
return (n == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -217,7 +219,7 @@ protected:
|
||||||
* True if \a n is the index of the right-most grid point, false
|
* True if \a n is the index of the right-most grid point, false
|
||||||
* otherwise.
|
* otherwise.
|
||||||
*/
|
*/
|
||||||
bool isRight(int n) const {
|
bool isRight(size_t n) const {
|
||||||
return (n == nPoints() - 1);
|
return (n == nPoints() - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,6 @@ void runexample()
|
||||||
|
|
||||||
// use reaction mechanism GRI-Mech 3.0
|
// use reaction mechanism GRI-Mech 3.0
|
||||||
IdealGasMix gas("gri30.cti", "gri30");
|
IdealGasMix gas("gri30.cti", "gri30");
|
||||||
int nsp = gas.nSpecies();
|
|
||||||
|
|
||||||
// create a reservoir for the fuel inlet, and set to pure methane.
|
// create a reservoir for the fuel inlet, and set to pure methane.
|
||||||
Reservoir fuel_in;
|
Reservoir fuel_in;
|
||||||
|
|
@ -105,7 +104,6 @@ void runexample()
|
||||||
double tfinal = 1.0;
|
double tfinal = 1.0;
|
||||||
double tnow = 0.0;
|
double tnow = 0.0;
|
||||||
double tres;
|
double tres;
|
||||||
int k;
|
|
||||||
|
|
||||||
std::ofstream f("combustor_cxx.csv");
|
std::ofstream f("combustor_cxx.csv");
|
||||||
std::vector<size_t> k_out;
|
std::vector<size_t> k_out;
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "cantera/IdealGasMix.h" // defines class IdealGasMix
|
#include "cantera/IdealGasMix.h" // defines class IdealGasMix
|
||||||
#include "cantera/transport.h" // transport properties
|
#include "cantera/transport.h" // transport properties
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
// All Cantera kernel names are in namespace Cantera. You can either
|
// All Cantera kernel names are in namespace Cantera. You can either
|
||||||
// reference everything as Cantera::<name>, or include the following
|
// reference everything as Cantera::<name>, or include the following
|
||||||
|
|
|
||||||
|
|
@ -48,7 +48,7 @@ int kinetics1(int np, void* p)
|
||||||
// create a container object to run the simulation
|
// create a container object to run the simulation
|
||||||
// and add the reactor to it
|
// and add the reactor to it
|
||||||
ReactorNet sim;
|
ReactorNet sim;
|
||||||
sim.addReactor(&r);
|
sim.addReactor(r);
|
||||||
|
|
||||||
// main loop
|
// main loop
|
||||||
clock_t t0 = clock(); // save start time
|
clock_t t0 = clock(); // save start time
|
||||||
|
|
|
||||||
|
|
@ -235,15 +235,20 @@ def compareTextFiles(env, file1, file2):
|
||||||
# String representations match, so replacement is unnecessary
|
# String representations match, so replacement is unnecessary
|
||||||
continue
|
continue
|
||||||
|
|
||||||
delta = max(getPrecision(floats1[j][1]), getPrecision(floats2[j][1]))
|
try:
|
||||||
num1 = float(floats1[j][1])
|
delta = max(getPrecision(floats1[j][1]), getPrecision(floats2[j][1]))
|
||||||
num2 = float(floats2[j][1])
|
num1 = float(floats1[j][1])
|
||||||
abserr = abs(num1-num2)
|
num2 = float(floats2[j][1])
|
||||||
relerr = abserr / (0.5 * abs(num1 + num2) + atol)
|
abserr = abs(num1-num2)
|
||||||
if abserr > (1.1*delta + atol) and relerr > rtol:
|
relerr = abserr / (0.5 * abs(num1 + num2) + atol)
|
||||||
print 'Values differ: {0: 14g} {1: 14g}; rel. err = {2:.3e}; abs. err = {3:.3e}'.format(num1, num2, relerr, abserr)
|
if abserr > (1.1*delta + atol) and relerr > rtol:
|
||||||
allMatch = False
|
print 'Values differ: {0: 14g} {1: 14g}; rel. err = {2:.3e}; abs. err = {3:.3e}'.format(num1, num2, relerr, abserr)
|
||||||
break
|
allMatch = False
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
# Something went wrong -- one of the strings isn't actually a number,
|
||||||
|
# so just ignore this line and let the test fail
|
||||||
|
pass
|
||||||
|
|
||||||
# All the values are sufficiently close, so replace the string
|
# All the values are sufficiently close, so replace the string
|
||||||
# so that the diff of this line will succeed
|
# so that the diff of this line will succeed
|
||||||
|
|
@ -307,7 +312,6 @@ def compareCsvFiles(env, file1, file2):
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
import numpy as np
|
import numpy as np
|
||||||
hasSkipHeader = tuple(np.version.version.split('.')[:2]) >= ('1','4')
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
print 'WARNING: skipping .csv diff because numpy is not installed'
|
print 'WARNING: skipping .csv diff because numpy is not installed'
|
||||||
return 0
|
return 0
|
||||||
|
|
@ -323,12 +327,8 @@ def compareCsvFiles(env, file1, file2):
|
||||||
break
|
break
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if hasSkipHeader:
|
data1 = np.genfromtxt(file1, skip_header=headerRows, delimiter=',')
|
||||||
data1 = np.genfromtxt(file1, skip_header=headerRows, delimiter=',')
|
data2 = np.genfromtxt(file2, skip_header=headerRows, delimiter=',')
|
||||||
data2 = np.genfromtxt(file2, skip_header=headerRows, delimiter=',')
|
|
||||||
else:
|
|
||||||
data1 = np.genfromtxt(file1, skiprows=headerRows, delimiter=',')
|
|
||||||
data2 = np.genfromtxt(file2, skiprows=headerRows, delimiter=',')
|
|
||||||
except (IOError, StopIteration) as e:
|
except (IOError, StopIteration) as e:
|
||||||
print e
|
print e
|
||||||
return 1
|
return 1
|
||||||
|
|
|
||||||
|
|
@ -76,7 +76,7 @@ class WxsGenerator(object):
|
||||||
UpgradeCode='2340BEE1-279D-11E1-A4AA-001FBC085391',
|
UpgradeCode='2340BEE1-279D-11E1-A4AA-001FBC085391',
|
||||||
Language='1033',
|
Language='1033',
|
||||||
Codepage='1252',
|
Codepage='1252',
|
||||||
Version='2.2.0',
|
Version='2.2.1',
|
||||||
Manufacturer='Cantera Developers'))
|
Manufacturer='Cantera Developers'))
|
||||||
|
|
||||||
fields = {'Platform': 'x64'} if self.x64 else {}
|
fields = {'Platform': 'x64'} if self.x64 else {}
|
||||||
|
|
|
||||||
|
|
@ -28,14 +28,14 @@
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
#define isnan(x) _isnan(x)
|
#define isnan(x) _isnan(x)
|
||||||
#define finite(x) _finite(x)
|
#define finite(x) _finite(x)
|
||||||
#elif defined(USE_STD_ISNAN)
|
|
||||||
// From C++11
|
|
||||||
using std::isnan;
|
|
||||||
#define finite(x) std::isfinite(x)
|
|
||||||
#elif defined(USE_GLOBAL_ISNAN)
|
#elif defined(USE_GLOBAL_ISNAN)
|
||||||
// From C99
|
// From C99
|
||||||
using ::isnan;
|
using ::isnan;
|
||||||
using ::finite;
|
using ::finite;
|
||||||
|
#elif defined(USE_STD_ISNAN)
|
||||||
|
// From C++11
|
||||||
|
using std::isnan;
|
||||||
|
#define finite(x) std::isfinite(x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace Cantera {
|
namespace Cantera {
|
||||||
|
|
|
||||||
|
|
@ -327,7 +327,7 @@ extern "C" {
|
||||||
try {
|
try {
|
||||||
return ThermoCabinet::item(n).nAtoms(k,m);
|
return ThermoCabinet::item(n).nAtoms(k,m);
|
||||||
} catch (...) {
|
} catch (...) {
|
||||||
return handleAllExceptions(-1, ERR);
|
return handleAllExceptions(ERR, ERR);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -155,13 +155,12 @@ void ImplicitSurfChem::eval(doublereal time, doublereal* y,
|
||||||
{
|
{
|
||||||
updateState(y); // synchronize the surface state(s) with y
|
updateState(y); // synchronize the surface state(s) with y
|
||||||
doublereal rs0, sum;
|
doublereal rs0, sum;
|
||||||
size_t loc, kstart;
|
size_t loc = 0, kstart;
|
||||||
for (size_t n = 0; n < m_nsurf; n++) {
|
for (size_t n = 0; n < m_nsurf; n++) {
|
||||||
rs0 = 1.0/m_surf[n]->siteDensity();
|
rs0 = 1.0/m_surf[n]->siteDensity();
|
||||||
m_vecKinPtrs[n]->getNetProductionRates(DATA_PTR(m_work));
|
m_vecKinPtrs[n]->getNetProductionRates(DATA_PTR(m_work));
|
||||||
kstart = m_vecKinPtrs[n]->kineticsSpeciesIndex(0,m_surfindex[n]);
|
kstart = m_vecKinPtrs[n]->kineticsSpeciesIndex(0,m_surfindex[n]);
|
||||||
sum = 0.0;
|
sum = 0.0;
|
||||||
loc = 0;
|
|
||||||
for (size_t k = 1; k < m_nsp[n]; k++) {
|
for (size_t k = 1; k < m_nsp[n]; k++) {
|
||||||
ydot[k + loc] = m_work[kstart + k] * rs0 * m_surf[n]->size(k);
|
ydot[k + loc] = m_work[kstart + k] * rs0 * m_surf[n]->size(k);
|
||||||
sum -= ydot[k];
|
sum -= ydot[k];
|
||||||
|
|
|
||||||
|
|
@ -119,24 +119,46 @@ void phasemethods(int nlhs, mxArray* plhs[],
|
||||||
// floating-point attributes
|
// floating-point attributes
|
||||||
case 1:
|
case 1:
|
||||||
vv = phase_temperature(ph);
|
vv = phase_temperature(ph);
|
||||||
|
if (vv == DERR) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
vv = phase_density(ph);
|
vv = phase_density(ph);
|
||||||
|
if (vv == DERR) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
vv = phase_molarDensity(ph);
|
vv = phase_molarDensity(ph);
|
||||||
|
if (vv == DERR) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
vv = phase_meanMolecularWeight(ph);
|
vv = phase_meanMolecularWeight(ph);
|
||||||
|
if (vv == DERR) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
vv = 1.0/phase_density(ph);
|
vv = phase_density(ph);
|
||||||
|
if (vv == DERR) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
|
vv = 1.0/vv;
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
vv = static_cast<int>(phase_nElements(ph));
|
vv = static_cast<int>(phase_nElements(ph));
|
||||||
|
if (vv == -1) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
vv = static_cast<int>(phase_nSpecies(ph));
|
vv = static_cast<int>(phase_nSpecies(ph));
|
||||||
|
if (vv == -1) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
input_buf = getString(prhs[3]);
|
input_buf = getString(prhs[3]);
|
||||||
|
|
@ -150,18 +172,21 @@ void phasemethods(int nlhs, mxArray* plhs[],
|
||||||
k = getInt(prhs[3]);
|
k = getInt(prhs[3]);
|
||||||
m = getInt(prhs[4]);
|
m = getInt(prhs[4]);
|
||||||
vv = phase_nAtoms(ph,k-1,m-1);
|
vv = phase_nAtoms(ph,k-1,m-1);
|
||||||
|
if (vv == ERR) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 15:
|
case 15:
|
||||||
show_thermo = getInt(prhs[3]);
|
show_thermo = getInt(prhs[3]);
|
||||||
threshold = getDouble(prhs[4]);
|
threshold = getDouble(prhs[4]);
|
||||||
vv = write_phase(ph,show_thermo,threshold);
|
vv = write_phase(ph,show_thermo,threshold);
|
||||||
|
if (vv == -1 || vv == ERR) {
|
||||||
|
reportError();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
mexErrMsgTxt("Unknown job number");
|
mexErrMsgTxt("Unknown job number");
|
||||||
}
|
}
|
||||||
if (vv == DERR || vv == -1 || vv == ERR) {
|
|
||||||
reportError();
|
|
||||||
}
|
|
||||||
plhs[0] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
|
plhs[0] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
|
||||||
double* h = mxGetPr(plhs[0]);
|
double* h = mxGetPr(plhs[0]);
|
||||||
*h = vv;
|
*h = vv;
|
||||||
|
|
|
||||||
|
|
@ -1037,7 +1037,7 @@ void DebyeHuckel::initThermoXML(XML_Node& phaseNode, const std::string& id_)
|
||||||
for (size_t k = 0; k < m_kk; k++) {
|
for (size_t k = 0; k < m_kk; k++) {
|
||||||
std::string kname = speciesName(k);
|
std::string kname = speciesName(k);
|
||||||
const XML_Node* spPtr = xspecies[k];
|
const XML_Node* spPtr = xspecies[k];
|
||||||
if (!spPtr) {
|
if (spPtr) {
|
||||||
if (spPtr->hasChild("electrolyteSpeciesType")) {
|
if (spPtr->hasChild("electrolyteSpeciesType")) {
|
||||||
std::string est = getChildValue(*spPtr, "electrolyteSpeciesType");
|
std::string est = getChildValue(*spPtr, "electrolyteSpeciesType");
|
||||||
if ((m_electrolyteSpeciesType[k] = interp_est(est)) == -1) {
|
if ((m_electrolyteSpeciesType[k] = interp_est(est)) == -1) {
|
||||||
|
|
|
||||||
|
|
@ -173,10 +173,6 @@ void GeneralSpeciesThermo::reportParams(size_t index, int& type,
|
||||||
if (sp) {
|
if (sp) {
|
||||||
sp->reportParameters(n, type, minTemp_, maxTemp_,
|
sp->reportParameters(n, type, minTemp_, maxTemp_,
|
||||||
refPressure_, c);
|
refPressure_, c);
|
||||||
if (n != index) {
|
|
||||||
throw CanteraError("GeneralSpeciesThermo::reportParams",
|
|
||||||
"Internal error encountered");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
type = -1;
|
type = -1;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1533,7 +1533,7 @@ void HMWSoln::initThermoXML(XML_Node& phaseNode, const std::string& id_)
|
||||||
std::vector<const XML_Node*> xspecies = speciesData();
|
std::vector<const XML_Node*> xspecies = speciesData();
|
||||||
for (size_t k = 0; k < m_kk; k++) {
|
for (size_t k = 0; k < m_kk; k++) {
|
||||||
const XML_Node* spPtr = xspecies[k];
|
const XML_Node* spPtr = xspecies[k];
|
||||||
if (!spPtr) {
|
if (spPtr) {
|
||||||
if (spPtr->hasChild("electrolyteSpeciesType")) {
|
if (spPtr->hasChild("electrolyteSpeciesType")) {
|
||||||
string est = getChildValue(*spPtr, "electrolyteSpeciesType");
|
string est = getChildValue(*spPtr, "electrolyteSpeciesType");
|
||||||
if ((m_electrolyteSpeciesType[k] = interp_est(est)) == -1) {
|
if ((m_electrolyteSpeciesType[k] = interp_est(est)) == -1) {
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
|
|
||||||
#include "cantera/thermo/IdealGasPhase.h"
|
#include "cantera/thermo/IdealGasPhase.h"
|
||||||
#include "cantera/base/vec_functions.h"
|
#include "cantera/base/vec_functions.h"
|
||||||
|
#include "cantera/thermo/ThermoFactory.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
@ -30,7 +31,7 @@ IdealGasPhase::IdealGasPhase(XML_Node& phaseRef, const std::string& id_) :
|
||||||
m_p0(-1.0),
|
m_p0(-1.0),
|
||||||
m_logc0(0.0)
|
m_logc0(0.0)
|
||||||
{
|
{
|
||||||
initThermoXML(phaseRef, id_);
|
importPhase(phaseRef, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
IdealGasPhase::IdealGasPhase(const IdealGasPhase& right) :
|
IdealGasPhase::IdealGasPhase(const IdealGasPhase& right) :
|
||||||
|
|
|
||||||
|
|
@ -645,15 +645,19 @@ doublereal Phase::elementalMassFraction(const size_t m) const
|
||||||
doublereal Phase::elementalMoleFraction(const size_t m) const
|
doublereal Phase::elementalMoleFraction(const size_t m) const
|
||||||
{
|
{
|
||||||
checkElementIndex(m);
|
checkElementIndex(m);
|
||||||
doublereal Z_n = 0.0;
|
double denom = 0;
|
||||||
for (size_t k = 0; k != m_kk; ++k) {
|
for (size_t k = 0; k < m_kk; k++) {
|
||||||
double nTotalAtoms = 0;
|
double atoms = 0;
|
||||||
for (size_t l = 0; l != m_mm; ++l) {
|
for (size_t j = 0; j < nElements(); j++) {
|
||||||
nTotalAtoms += nAtoms(k, l);
|
atoms += nAtoms(k, j);
|
||||||
}
|
}
|
||||||
Z_n += nAtoms(k, m) / nTotalAtoms * moleFraction(k);
|
denom += atoms * moleFraction(k);
|
||||||
}
|
}
|
||||||
return Z_n;
|
doublereal numerator = 0.0;
|
||||||
|
for (size_t k = 0; k != m_kk; ++k) {
|
||||||
|
numerator += nAtoms(k, m) * moleFraction(k);
|
||||||
|
}
|
||||||
|
return numerator / denom;
|
||||||
}
|
}
|
||||||
|
|
||||||
doublereal Phase::molarDensity() const
|
doublereal Phase::molarDensity() const
|
||||||
|
|
|
||||||
|
|
@ -465,23 +465,28 @@ void GasTransport::getTransportData()
|
||||||
{
|
{
|
||||||
for (size_t k = 0; k < m_thermo->nSpecies(); k++) {
|
for (size_t k = 0; k < m_thermo->nSpecies(); k++) {
|
||||||
shared_ptr<Species> s = m_thermo->species(m_thermo->speciesName(k));
|
shared_ptr<Species> s = m_thermo->species(m_thermo->speciesName(k));
|
||||||
const GasTransportData& sptran =
|
const GasTransportData* sptran =
|
||||||
dynamic_cast<GasTransportData&>(*s->transport.get());
|
dynamic_cast<GasTransportData*>(s->transport.get());
|
||||||
if (sptran.geometry == "atom") {
|
if (!sptran) {
|
||||||
|
throw CanteraError("GasTransport::getTransportData",
|
||||||
|
"Missing gas-phase transport data for species '" + s->name + "'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sptran->geometry == "atom") {
|
||||||
m_crot[k] = 0.0;
|
m_crot[k] = 0.0;
|
||||||
} else if (sptran.geometry == "linear") {
|
} else if (sptran->geometry == "linear") {
|
||||||
m_crot[k] = 1.0;
|
m_crot[k] = 1.0;
|
||||||
} else if (sptran.geometry == "nonlinear") {
|
} else if (sptran->geometry == "nonlinear") {
|
||||||
m_crot[k] = 1.5;
|
m_crot[k] = 1.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_sigma[k] = sptran.diameter;
|
m_sigma[k] = sptran->diameter;
|
||||||
m_eps[k] = sptran.well_depth;
|
m_eps[k] = sptran->well_depth;
|
||||||
m_dipole(k,k) = sptran.dipole;
|
m_dipole(k,k) = sptran->dipole;
|
||||||
m_polar[k] = (sptran.dipole > 0);
|
m_polar[k] = (sptran->dipole > 0);
|
||||||
m_alpha[k] = sptran.polarizability;
|
m_alpha[k] = sptran->polarizability;
|
||||||
m_zrot[k] = sptran.rotational_relaxation;
|
m_zrot[k] = sptran->rotational_relaxation;
|
||||||
m_w_ac[k] = sptran.acentric_factor;
|
m_w_ac[k] = sptran->acentric_factor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ namespace Cantera
|
||||||
bool FlowDevice::install(ReactorBase& in, ReactorBase& out)
|
bool FlowDevice::install(ReactorBase& in, ReactorBase& out)
|
||||||
{
|
{
|
||||||
if (m_in || m_out) {
|
if (m_in || m_out) {
|
||||||
return false;
|
throw CanteraError("FlowDevice::install", "Already installed");
|
||||||
}
|
}
|
||||||
m_in = ∈
|
m_in = ∈
|
||||||
m_out = &out;
|
m_out = &out;
|
||||||
|
|
@ -19,9 +19,6 @@ bool FlowDevice::install(ReactorBase& in, ReactorBase& out)
|
||||||
// construct adapters between inlet and outlet species
|
// construct adapters between inlet and outlet species
|
||||||
ThermoPhase* mixin = &m_in->contents();
|
ThermoPhase* mixin = &m_in->contents();
|
||||||
ThermoPhase* mixout = &m_out->contents();
|
ThermoPhase* mixout = &m_out->contents();
|
||||||
if (mixin == 0 || mixout == 0) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_nspin = mixin->nSpecies();
|
m_nspin = mixin->nSpecies();
|
||||||
m_nspout = mixout->nSpecies();
|
m_nspout = mixout->nSpecies();
|
||||||
|
|
|
||||||
|
|
@ -234,6 +234,11 @@ size_t ReactorNet::globalComponentIndex(const string& component, size_t reactor)
|
||||||
void ReactorNet::registerSensitivityReaction(void* reactor,
|
void ReactorNet::registerSensitivityReaction(void* reactor,
|
||||||
size_t reactionIndex, const std::string& name, int leftright)
|
size_t reactionIndex, const std::string& name, int leftright)
|
||||||
{
|
{
|
||||||
|
if (m_integrator_init) {
|
||||||
|
throw CanteraError("ReactorNet::registerSensitivityReaction",
|
||||||
|
"Sensitivity reactions cannot be added after the"
|
||||||
|
"integrator has been initialized.");
|
||||||
|
}
|
||||||
std::pair<void*, int> R = std::make_pair(reactor, leftright);
|
std::pair<void*, int> R = std::make_pair(reactor, leftright);
|
||||||
if (m_sensOrder.count(R) &&
|
if (m_sensOrder.count(R) &&
|
||||||
m_sensOrder[R].count(reactionIndex)) {
|
m_sensOrder[R].count(reactionIndex)) {
|
||||||
|
|
|
||||||
|
|
@ -28,12 +28,8 @@ localenv['ENV']['CANTERA_DATA'] = Dir('#build/data').abspath
|
||||||
|
|
||||||
PASSED_FILES = {}
|
PASSED_FILES = {}
|
||||||
|
|
||||||
# Needed for Intel runtime libraries when compiling with ICC
|
|
||||||
# Add build/lib in order to find Cantera shared library
|
# Add build/lib in order to find Cantera shared library
|
||||||
if localenv['ENV'].get('LD_LIBRARY_PATH'):
|
localenv.PrependENVPath('LD_LIBRARY_PATH', Dir('#build/lib').abspath)
|
||||||
localenv['ENV']['LD_LIBRARY_PATH'] += os.pathsep + Dir('#build/lib').abspath
|
|
||||||
else:
|
|
||||||
localenv['ENV']['LD_LIBRARY_PATH'] = Dir('#build/lib').abspath
|
|
||||||
|
|
||||||
def addTestProgram(subdir, progName, env_vars={}):
|
def addTestProgram(subdir, progName, env_vars={}):
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,14 @@ REACTIONS
|
||||||
R1A+R1B=>H+P1 1e12 0.0 20000.0
|
R1A+R1B=>H+P1 1e12 0.0 20000.0
|
||||||
FORD / R1A 1.5 /
|
FORD / R1A 1.5 /
|
||||||
FORD / R1B 0.5 /
|
FORD / R1B 0.5 /
|
||||||
|
DUPLICATE
|
||||||
|
|
||||||
H+P1=>R1A+R1B 5e13 -2.0 5000.0
|
H+P1=>R1A+R1B 5e13 -2.0 5000.0
|
||||||
FORD / P1 0.2 /
|
FORD / P1 0.2 /
|
||||||
|
|
||||||
|
R1A+R1B=>H+P1 1e12 0.0 20000.0
|
||||||
|
FORD / R1A 3.0 /
|
||||||
|
FORD / R1B 0.0 /
|
||||||
|
DUPLICATE
|
||||||
|
|
||||||
END
|
END
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@
|
||||||
<reactionData id="reaction_data">
|
<reactionData id="reaction_data">
|
||||||
|
|
||||||
<!-- reaction 0001 -->
|
<!-- reaction 0001 -->
|
||||||
<reaction reversible="no" id="0001">
|
<reaction duplicate="yes" reversible="no" id="0001">
|
||||||
<equation>R1A + R1B =] H + P1</equation>
|
<equation>R1A + R1B =] H + P1</equation>
|
||||||
<order species="R1B">0.5</order>
|
<order species="R1B">0.5</order>
|
||||||
<order species="R1A">1.5</order>
|
<order species="R1A">1.5</order>
|
||||||
|
|
@ -138,5 +138,21 @@
|
||||||
<reactants>H:1.0 P1:1</reactants>
|
<reactants>H:1.0 P1:1</reactants>
|
||||||
<products>R1B:1 R1A:1.0</products>
|
<products>R1B:1 R1A:1.0</products>
|
||||||
</reaction>
|
</reaction>
|
||||||
|
|
||||||
|
<!-- reaction 0003 -->
|
||||||
|
<reaction duplicate="yes" reversible="no" id="0003">
|
||||||
|
<equation>R1A + R1B =] H + P1</equation>
|
||||||
|
<order species="R1B">0.0</order>
|
||||||
|
<order species="R1A">3.0</order>
|
||||||
|
<rateCoeff>
|
||||||
|
<Arrhenius>
|
||||||
|
<A>1.000000E+06</A>
|
||||||
|
<b>0.0</b>
|
||||||
|
<E units="cal/mol">20000.000000</E>
|
||||||
|
</Arrhenius>
|
||||||
|
</rateCoeff>
|
||||||
|
<reactants>R1B:1 R1A:1.0</reactants>
|
||||||
|
<products>H:1.0 P1:1</products>
|
||||||
|
</reaction>
|
||||||
</reactionData>
|
</reactionData>
|
||||||
</ctml>
|
</ctml>
|
||||||
|
|
|
||||||
|
|
@ -91,4 +91,15 @@ TEST_F(TestThermoMethods, getMassFractionsByName)
|
||||||
EXPECT_EQ(Y.size(), (size_t) 3);
|
EXPECT_EQ(Y.size(), (size_t) 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TestThermoMethods, setState_nan)
|
||||||
|
{
|
||||||
|
double nan = std::numeric_limits<double>::quiet_NaN();
|
||||||
|
thermo->setState_TP(500, 12345);
|
||||||
|
EXPECT_THROW(thermo->setState_TP(nan, 55555), CanteraError);
|
||||||
|
EXPECT_THROW(thermo->setState_TP(555, nan), CanteraError);
|
||||||
|
EXPECT_THROW(thermo->setState_HP(nan, 55555), CanteraError);
|
||||||
|
EXPECT_THROW(thermo->setState_SV(1234, nan), CanteraError);
|
||||||
|
EXPECT_THROW(thermo->setState_TR(555, nan), CanteraError);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG_CHEMEQUIL
|
#ifdef DEBUG_CHEMEQUIL
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -33,10 +33,7 @@ else:
|
||||||
localenv['ENV']['CANTERA_DATA'] = pjoin(os.getcwd(), '..', 'build', 'data')
|
localenv['ENV']['CANTERA_DATA'] = pjoin(os.getcwd(), '..', 'build', 'data')
|
||||||
|
|
||||||
# Add build/lib in order to find Cantera shared library
|
# Add build/lib in order to find Cantera shared library
|
||||||
if localenv['ENV'].get('LD_LIBRARY_PATH'):
|
localenv.PrependENVPath('LD_LIBRARY_PATH', Dir('#build/lib').abspath)
|
||||||
localenv['ENV']['LD_LIBRARY_PATH'] += os.pathsep + Dir('#build/lib').abspath
|
|
||||||
else:
|
|
||||||
localenv['ENV']['LD_LIBRARY_PATH'] = Dir('#build/lib').abspath
|
|
||||||
|
|
||||||
PASSED_FILES = {}
|
PASSED_FILES = {}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ void printUsage()
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
suppress_deprecation_warnings();
|
suppress_deprecation_warnings();
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ void pAtable(HMWSoln* HMW)
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
int retn = 0;
|
int retn = 0;
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ void pAtable(HMWSoln* HMW)
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
WaterPropsIAPWSphi* phi = new WaterPropsIAPWSphi();
|
WaterPropsIAPWSphi* phi = new WaterPropsIAPWSphi();
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ double numdpdt(WaterPropsIAPWS* water, double T, double pres)
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
double dens, u, s, h;
|
double dens, u, s, h;
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
double dens, u, s, h, cv, cp, pres;
|
double dens, u, s, h, cv, cp, pres;
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ double tvalue(double val, double atol = 1.0E-9)
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
double pres;
|
double pres;
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ double tvalue(double val, double atol = 1.0E-9)
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
double pres;
|
double pres;
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ exfun fex[] = {kinetics_example1, kinetics_example3,
|
||||||
// main program
|
// main program
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
int example_num = 0;
|
int example_num = 0;
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ void printDbl(double val)
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
if (argc != 2) {
|
if (argc != 2) {
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
string infile = "diamond.xml";
|
string infile = "diamond.xml";
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ static double cutoff(double val, double atol=1.0E-15)
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
string infile = "diamond.xml";
|
string infile = "diamond.xml";
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ double tvalue(double val, double atol = 1.0E-9)
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
double pres;
|
double pres;
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ int openRankine(int np, void* p)
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ using namespace Cantera;
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -151,7 +151,7 @@ void printSurf(ostream& oooo,
|
||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
#ifdef _MSC_VER
|
#if defined(_MSC_VER) && _MSC_VER < 1900
|
||||||
_set_output_format(_TWO_DIGIT_EXPONENT);
|
_set_output_format(_TWO_DIGIT_EXPONENT);
|
||||||
#endif
|
#endif
|
||||||
string infile;
|
string infile;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue