Cantera/CTI Files
From charlesreid1
CTI = CanTera Input file
CTI files use a custom markup language to specify information about the kinetics.
A CTI file must specify information about three things:
- Phases - Cantera/CTI Files/Phases
- Species - Cantera/CTI Files/Species
- Reactions - Cantera/CTI Files/Reactions
Division of CTI Files
The file can be divided into multiple parts:
- Phase specification
- Species
- Gas species
- Surface species
- Reactions
- Gas reactions
- Surface reactions
Units Specification
The units are the first thing defined in the file:
units(length = "cm", time = "s", quantity = "mol", act_energy = "J/mol")
Phases
Information about specifying phases in Cantera input file here: Cantera/CTI Files/Phases
Species
Information about specifying species in Cantera input files here: Cantera/CTI Files/Species
Reactions
Information about specifying reactions in Cantera input files here: Cantera/CTI Files/Reactions
CTI Code
Conversion of Chemkin Files to CTI
CTI files can be generated from the ck2cti app, contained in cantera/src/apps/ck2cti.cpp, which is a command-line utility to turn Chemkin-II reaction mechanism files, as well as transport and thermodynamic database files, into a CTI file.
This utility can be called like this:
ck2cti -i input -t thermo -tr transport -id idtag
where "input" is a Chemkin II reaction mechanism file (the meat of the CTI file), "thermo" is a file in which to look for thermodynamic data if there is no THERMO section of the Chemkin input file, "transport" is a file in which to look for transport data (no transport data is put into the final CTI file if this is left off), and "idtag" is a string name to give to the phase created in the new CTI file.
Conversion of CTI to XML
Once you have a CTI file (generated by hand, from a modified example, or from a Chemkin input file), the CTI file is then turned into an XML file, which is ultimately the format used by Cantera. This conversion is performed by the ct2ctml app, which is in cantera/src/base/ct2ctml.cpp. This code, in turn, creates a direct call from C++ to Python.
In ct2ctml.cpp, the following code block illustrates the call to Python to convert a CTI file to an XML file:
try {
exec_stream_t python;
python.set_wait_timeout(exec_stream_t::s_all, 1800000); // 30 minutes
python.start(pypath(), "-i");
stringstream output_stream;
python.in() <<
"if True:\n" << // Use this so that the rest is a single block
" import sys\n" <<
" sys.stderr = sys.stdout\n" <<
" import ctml_writer\n" <<
" ctml_writer.convert(r'" << file << "')\n" <<
" sys.exit(0)\n\n"
"sys.exit(7)\n";
python.close_in();
std::string line;
while (python.out().good()) {
std::getline(python.out(), line);
output_stream << line << std::endl;;
}
python.close();
python_exit_code = python.exit_code();
python_output = stripws(output_stream.str());
} catch (std::exception& err) {
The code that deals with CTI files is actually in two lines of Python code:
import ctml_writer ctml_writer.convert( [file] )
The call to ctml_writer references the Python routines located in cantera/interfaces/python/ctml_writer.py, which interprets the CTI file and turns it into an XML file.
Looking through the ctml_writer.py code, you can see that it starts at the convert() method, then moves to the write() method, where it builds each piece of information specified in the CTI into an XML data structure, which is then written to a file.