cantera/Cantera/src/converters/writelog.cpp
2005-01-07 10:26:43 +00:00

245 lines
7 KiB
C++
Executable file

/**
* @file converters/writelog.cpp
*
*/
// Copyright 2001 California Institute of Technology
// turn off warnings about truncating long names under Windows
#ifdef WIN32
#pragma warning(disable:4786)
#endif
#include <stdio.h>
#include "writelog.h"
namespace ckr {
/// format a string for the log file message printed when starting a new task
string newTask(string msg) {
string s = "\n";
s += msg + "...\n";
return s;
}
/// print the falloff parameters for a pressure-dependent reaction
bool writeFalloff(int type, const vector_fp& c, ostream& log) {
log.precision(6);
log.width(0);
log.flags(ios::uppercase);
// bool ok = true;
switch (type) {
case Lindemann:
log << " Lindemann falloff function" << endl;
return true;
case Troe:
log << " Troe falloff function: " << endl;
if (c.size() == 3) {
log << " alpha, T***, T* = (" << c[0] << ", " << c[1]
<< ", " << c[2] << ")" << endl;
}
else if (c.size() == 4) {
log << " alpha, T***, T*, T** = (" << c[0] << ", " << c[1]
<< ", " << c[2] << ", " << c[3] << ")" << endl;
}
else {
for (size_t n = 0; n < c.size(); n++) {
log << c[n] << ", "; log << endl;
}
log << "###### ERROR ##### incorrect number of parameters" << endl;
return false;
}
return true;
case SRI:
log << " SRI falloff function: " << endl;
if (c.size() == 3) {
log << " a, b, c = (" << c[0] << ", " << c[1]
<< ", " << c[2] << ")" << endl;
}
else if (c.size() == 5) {
log << " a, b, c, d, e = (" << c[0] << ", " << c[1]
<< ", " << c[2] << ", " << c[3] << ", " << c[4]
<< ")" << endl;
}
else {
for (size_t n = 0; n < c.size(); n++) {
log << c[n] << ", "; log << endl;
}
log << "##### ERROR ##### incorrect number of parameters" << endl;
return false;
}
return true;
default:
log << "unknown falloff type: " << type << endl;
return false;
}
}
/// print the rate coefficient parameters
bool writeRateCoeff(const RateCoeff& k, ostream& log) {
log.precision(10);
log.width(0);
log.flags(ios::uppercase);
int n;
bool ok = true;
int nb;
switch (k.type) {
case Arrhenius:
log <<" A, n, E = (" << k.A << ", " << k.n
<< ", " << k.E << ")" << endl;
break;
case LandauTeller:
log << "A, n, E, B, C = (" << k.A << ", " << k.n
<< ", " << k.E << ", " << k.B << ", " << k.C
<< ") *** Landau-Teller ***" << endl;
break;
case Jan:
log <<" A, n, E = (" << k.A << ", " << k.n
<< ", " << k.E << ") *** JAN *** " << endl;
nb = k.b.size();
for (n = 0; n < nb; n++) {
log << " b" << n+1 << ": " << k.b[n] << endl;
}
if (nb != 9) log
<< "warning: number of b coefficients should be 9."
<< endl;
break;
case Fit1:
log <<" A, n, E = (" << k.A << ", " << k.n
<< ", " << k.E << ") *** FIT1 *** " << endl;
nb = k.b.size();
for (n = 0; n < nb; n++) {
log << " b" << n+1 << ": " << k.b[n] << endl;
}
if (nb != 9) log
<< "warning: number of b coefficients should be 4."
<< endl;
break;
default:
log << "unknown rate coefficient type: " << k.type << endl;
ok = false;
}
return ok;
}
/**
* Write onto an output stream the chemical equation for a reaction.
*/
void printReactionEquation(ostream& f, const Reaction& r) {
// r.write(f);
f << reactionEquation(r);
}
/**
* Write to a string the chemical equation for a reaction.
*/
string reactionEquation(const Reaction& r) {
string s = "";
int nr = static_cast<int>(r.reactants.size());
int np = static_cast<int>(r.products.size());
int k;
double m;
char buf[20];
for (k = 0; k < nr; k++) {
m = r.reactants[k].number;
if (m != 1.0) {
sprintf(buf,"%g",m);
s += string(buf);
s += " ";
}
s += r.reactants[k].name;
if (k < nr - 1) s += " + ";
}
if (r.isFalloffRxn) s += " (+ " + r.thirdBody + ")";
else if (r.isThreeBodyRxn) s += " + " + r.thirdBody;
if (r.isReversible) s += " <=> ";
else s += " => ";
for (k = 0; k < np; k++) {
m = r.products[k].number;
if (m != 1.0) {
sprintf(buf,"%g",m);
s += string(buf);
s += " ";
}
s += r.products[k].name;
if (k < np - 1) s += " + ";
}
if (r.isFalloffRxn) s += " (+ " + r.thirdBody + ")";
else if (r.isThreeBodyRxn) s += " + " + r.thirdBody;
return s;
}
/**
*
* Write a summary of the properties of one species to the log file.
* @param log log file output stream
* @param spec instance of Species class
*/
void writeSpeciesData(ostream& log, const Species& spec) {
if (!spec.id.empty())
log << endl << " id/date: " << spec.id << endl;
else
log << " ... " << endl;
log << " phase: "
<< spec.phase << endl
<< " composition: (";
for (size_t ie = 0; ie < spec.elements.size(); ie++) {
if (!spec.elements[ie].name.empty()) {
log.flags(ios::fixed);
log.precision(0);
if (ie > 0) log << ", ";
log << spec.elements[ie].number << " "
<< spec.elements[ie].name;
}
}
log << ")";
log.flags(ios::showpoint | ios::fixed);
log.precision(2);
log << endl << " Tlow, Tmid, Thigh: (" << spec.tlow << ", " <<
spec.tmid << ", " << spec.thigh << ")" << endl << endl;
log << " coefficients (low, high):" << endl;
log.flags(ios::scientific | ios::uppercase | ios::internal);
log.precision(8);
for (int j = 0; j < 7; j++) {
log << " a" << j + 1;
log.setf(ios::showpos);
log << " \t" << spec.lowCoeffs[j]
<< " \t" << spec.highCoeffs[j] << endl;
log.unsetf(ios::showpos);
}
log << endl;
}
}