cantera/test/kinetics/pdep.cpp
Ray Speth 64ccd58680 Added a kinetics test suite with tests for P-log reactions
Added a sample mechanism file containing P-log and Chebyshev reactions.
2012-03-30 23:47:58 +00:00

166 lines
4.7 KiB
C++

#include "gtest/gtest.h"
#include "cantera/kinetics/importKinetics.h"
#include "cantera/thermo/IdealGasPhase.h"
#include "cantera/kinetics/GasKinetics.h"
namespace Cantera
{
class PdepTest : public testing::Test
{
public:
PdepTest() {}
static void SetUpTestCase() {
XML_Node* phase_node = get_XML_File("../data/pdep-test.xml");
thermo_ = new IdealGasPhase();
kin_ = new GasKinetics();
buildSolutionFromXML(*phase_node, "gas", "phase", thermo_, kin_);
}
static void TearDownTestCase() {
delete thermo_;
thermo_ = NULL;
delete kin_;
kin_ = NULL;
}
void SetUp() {
std::string Xref = "H:1.0, R1A:1.0, R1B:1.0, R2:1.0, "
"R3:1.0, R4:1.0, R5:1.0, R6:1.0";
thermo_->setState_TPX(900.0, 101325 * 8.0, Xref);
}
protected:
static ThermoPhase* thermo_;
static Kinetics* kin_;
void set_TP(double T, double P) {
T_ = T;
RT_ = GasConstant / 4184.0 * T;
P_ = P;
thermo_->setState_TP(T_, P_);
}
double k(double A, double n, double Ea) {
return A * pow(T_, n) * exp(-Ea/RT_);
}
double T_, RT_, P_;
};
ThermoPhase* PdepTest::thermo_ = NULL;
Kinetics* PdepTest::kin_ = NULL;
TEST_F(PdepTest, reactionCounts) {
EXPECT_EQ(6, kin_->nReactions());
}
TEST_F(PdepTest, PlogLowPressure) {
// Test that P-log reactions have the right low-pressure limit
set_TP(500.0, 1e-7);
vector_fp kf(6);
kin_->getFwdRateConstants(&kf[0]);
// Pre-exponential factor decreases by 10^3 for second-order reaction
// when converting from cm + mol to m + kmol
double kf0 = k(1.212400e+13, -0.5779, 10872.7);
double kf1 = k(1.230000e+05, 1.53, 4737.0);
double kf2 = k(2.440000e+7, 1.04, 3980.0);
double kf3 = k(1.740000e+04, 1.98, 4521.0);
EXPECT_NEAR(kf0, kf[0], 1e-9 * kf0);
EXPECT_NEAR(kf1, kf[1], 1e-9 * kf1);
EXPECT_NEAR(kf2, kf[2], 1e-9 * kf2);
EXPECT_NEAR(kf3, kf[3], 1e-9 * kf3);
}
TEST_F(PdepTest, PlogHighPressure) {
// Test that P-log reactions have the right high-pressure limit
set_TP(500.0, 1e10);
vector_fp kf(6);
kin_->getFwdRateConstants(&kf[0]);
// Pre-exponential factor decreases by 10^3 for second-order reaction
// when converting from cm + mol to m + kmol
double kf0 = k(5.963200e+53, -11.529, 52599.6);
double kf3 = k(1.740000e+04, 1.98, 4521.0);
EXPECT_NEAR(kf0, kf[0], 1e-9 * kf0);
EXPECT_NEAR(kf3, kf[3], 1e-9 * kf3);
}
TEST_F(PdepTest, PlogDuplicatePressures) {
// Test that multiple rate expressions are combined when necessary
set_TP(500.0, 1e10);
vector_fp kf(6);
kin_->getFwdRateConstants(&kf[0]);
double kf1 = k(1.3700e+14, -0.79, 17603.0) + k(1.2800e+03, 1.71, 9774.0);
double kf2 = k(-7.4100e+27, -5.54, 12108.0) + k(1.9000e+12, -0.29, 8306.0);
EXPECT_NEAR(kf1, kf[1], 1e-9 * kf1);
EXPECT_NEAR(kf2, kf[2], 1e-9 * kf2);
}
TEST_F(PdepTest, PlogCornerCases) {
// Test rate evaluation at the corner cases where the pressure
// is exactly of the specified interpolation values
set_TP(500.0, 101325);
vector_fp kf(6);
kin_->getFwdRateConstants(&kf[0]);
double kf0 = k(4.910800e+28, -4.8507, 24772.8);
double kf1 = k(1.2600e+17, -1.83, 15003.0) + k(1.2300e+01, 2.68, 6335.0);
double kf2 = k(3.4600e+9, 0.442, 5463.0);
EXPECT_NEAR(kf0, kf[0], 1e-9 * kf0);
EXPECT_NEAR(kf1, kf[1], 1e-9 * kf1);
EXPECT_NEAR(kf2, kf[2], 1e-9 * kf2);
}
TEST_F(PdepTest, PlogIntermediatePressure1) {
set_TP(1100.0, 20*101325);
vector_fp ropf(6);
kin_->getFwdRatesOfProgress(&ropf[0]);
// Expected rates computed using Chemkin
// ROP increases by 10**3 when converting from mol/cm3 to kmol/m3
EXPECT_NEAR(3.100682e+05, ropf[0], 1e2);
EXPECT_NEAR(2.006871e+05, ropf[1], 1e2);
EXPECT_NEAR(4.468658e+06, ropf[2], 1e2);
EXPECT_NEAR(1.774796e+06, ropf[3], 1e2);
}
TEST_F(PdepTest, PlogIntermediatePressure2) {
thermo_->setState_TP(1100.0, 0.5*101325);
vector_fp ropf(6);
kin_->getFwdRatesOfProgress(&ropf[0]);
EXPECT_NEAR(5.244649e+02, ropf[0], 5e-2);
EXPECT_NEAR(2.252537e+02, ropf[1], 2e-2);
EXPECT_NEAR(2.985338e+03, ropf[2], 3e-1);
EXPECT_NEAR(1.109248e+03, ropf[3], 1e-1);
}
TEST_F(PdepTest, PlogIntermediatePressure3) {
thermo_->setState_TP(800.0, 70*101325);
vector_fp ropf(6);
kin_->getFwdRatesOfProgress(&ropf[0]);
EXPECT_NEAR(2.274501e+04, ropf[0], 1e+1);
EXPECT_NEAR(2.307191e+05, ropf[1], 1e+2);
EXPECT_NEAR(2.224601e+07, ropf[2], 1e+3);
EXPECT_NEAR(1.007440e+07, ropf[3], 1e+3);
}
} // namespace Cantera
int main(int argc, char** argv)
{
printf("Running main() from pdep.cpp\n");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}