119 lines
4.2 KiB
C++
119 lines
4.2 KiB
C++
#include "gtest/gtest.h"
|
|
#include "cantera/base/Units.h"
|
|
#include "cantera/IdealGasMix.h"
|
|
|
|
using namespace Cantera;
|
|
|
|
TEST(Reaction, ElementaryFromYaml)
|
|
{
|
|
// @TODO: Use of XML input files in these tests of the YAML format needs to
|
|
// be eliminated before we can deprecate the XML format.
|
|
IdealGasMix gas("gri30.xml");
|
|
AnyMap rxn = AnyMap::fromYamlString(
|
|
"{equation: N + NO <=> N2 + O,"
|
|
" rate-constant: [-2.70000E+13 cm^3/mol/s, 0, 355 cal/mol],"
|
|
" negative-A: true}");
|
|
|
|
UnitSystem U;
|
|
auto R = newReaction(rxn, gas, U);
|
|
EXPECT_EQ(R->reactants.at("NO"), 1);
|
|
EXPECT_EQ(R->products.at("N2"), 1);
|
|
EXPECT_EQ(R->reaction_type, ELEMENTARY_RXN);
|
|
|
|
auto ER = dynamic_cast<ElementaryReaction&>(*R);
|
|
EXPECT_DOUBLE_EQ(ER.rate.preExponentialFactor(), -2.7e10);
|
|
EXPECT_DOUBLE_EQ(ER.rate.activationEnergy_R(), 355 / GasConst_cal_mol_K);
|
|
EXPECT_TRUE(ER.allow_negative_pre_exponential_factor);
|
|
EXPECT_FALSE(ER.allow_negative_orders);
|
|
}
|
|
|
|
TEST(Reaction, ThreeBodyFromYaml1)
|
|
{
|
|
IdealGasMix gas("gri30.xml");
|
|
AnyMap rxn = AnyMap::fromYamlString(
|
|
"{equation: 2 O + M <=> O2 + M,"
|
|
" type: three-body,"
|
|
" rate-constant: [1.20000E+17 cm^6/mol^2/s, -1, 0],"
|
|
" efficiencies: {AR: 0.83, H2O: 5}}");
|
|
|
|
UnitSystem U;
|
|
auto R = newReaction(rxn, gas, U);
|
|
EXPECT_EQ(R->reactants.count("M"), (size_t) 0);
|
|
|
|
auto TBR = dynamic_cast<ThreeBodyReaction&>(*R);
|
|
EXPECT_DOUBLE_EQ(TBR.rate.preExponentialFactor(), 1.2e11);
|
|
EXPECT_DOUBLE_EQ(TBR.third_body.efficiencies["H2O"], 5.0);
|
|
EXPECT_DOUBLE_EQ(TBR.third_body.default_efficiency, 1.0);
|
|
}
|
|
|
|
TEST(Reaction, ThreeBodyFromYaml2)
|
|
{
|
|
IdealGasMix gas("gri30.xml");
|
|
AnyMap rxn = AnyMap::fromYamlString(
|
|
"{equation: 2 O <=> O2," // Missing "M" on each side of the equation
|
|
" type: three-body,"
|
|
" rate-constant: [1.20000E+17, -1, 0]}");
|
|
|
|
UnitSystem U;
|
|
EXPECT_THROW(newReaction(rxn, gas, U), CanteraError);
|
|
}
|
|
|
|
TEST(Reaction, FalloffFromYaml1)
|
|
{
|
|
IdealGasMix gas("gri30.xml");
|
|
AnyMap rxn = AnyMap::fromYamlString(
|
|
"{equation: N2O (+M) <=> N2 + O (+ M),"
|
|
" type: falloff,"
|
|
" high-P-rate-constant: [7.91000E+10, 0, 56020],"
|
|
" low-P-rate-constant: [6.37000E+14, 0, 56640],"
|
|
" SRI: {A: 1.1, B: 700.0, C: 1234.0, D: 56.0, E: 0.7},"
|
|
" efficiencies: {AR: 0.625}}");
|
|
|
|
UnitSystem U;
|
|
auto R = newReaction(rxn, gas, U);
|
|
auto FR = dynamic_cast<FalloffReaction&>(*R);
|
|
EXPECT_DOUBLE_EQ(FR.third_body.efficiency("AR"), 0.625);
|
|
EXPECT_DOUBLE_EQ(FR.third_body.efficiency("N2"), 1.0);
|
|
}
|
|
|
|
TEST(Reaction, FalloffFromYaml2)
|
|
{
|
|
IdealGasMix gas("gri30.xml");
|
|
AnyMap rxn = AnyMap::fromYamlString(
|
|
"{equation: H + CH2 (+ N2) <=> CH3 (+N2),"
|
|
" type: falloff,"
|
|
" high-P-rate-constant: [6.00000E+14 cm^3/mol/s, 0, 0],"
|
|
" low-P-rate-constant: [1.04000E+26 cm^6/mol^2/s, -2.76, 1600],"
|
|
" Troe: {A: 0.562, T3: 91, T1: 5836}}");
|
|
|
|
UnitSystem U;
|
|
auto R = newReaction(rxn, gas, U);
|
|
auto FR = dynamic_cast<FalloffReaction&>(*R);
|
|
EXPECT_DOUBLE_EQ(FR.third_body.efficiency("N2"), 1.0);
|
|
EXPECT_DOUBLE_EQ(FR.third_body.efficiency("H2O"), 0.0);
|
|
EXPECT_DOUBLE_EQ(FR.high_rate.preExponentialFactor(), 6e11);
|
|
EXPECT_DOUBLE_EQ(FR.low_rate.preExponentialFactor(), 1.04e20);
|
|
vector_fp params(4);
|
|
FR.falloff->getParameters(params.data());
|
|
EXPECT_DOUBLE_EQ(params[0], 0.562);
|
|
EXPECT_DOUBLE_EQ(params[1], 91.0);
|
|
EXPECT_DOUBLE_EQ(params[3], 0.0);
|
|
}
|
|
|
|
TEST(Reaction, ChemicallyActivatedFromYaml)
|
|
{
|
|
IdealGasMix gas("gri30.xml");
|
|
AnyMap rxn = AnyMap::fromYamlString(
|
|
"{equation: CH3 + OH (+M) <=> CH2O + H2 (+M),"
|
|
" type: chemically-activated,"
|
|
" high-P-rate-constant: [5.88E-14, 6.721, -3022.227],"
|
|
" low-P-rate-constant: [282320.078, 1.46878, -3270.56495]}");
|
|
|
|
UnitSystem U;
|
|
U.setDefaults({"cm", "mol"});
|
|
auto R = newReaction(rxn, gas, U);
|
|
auto CAR = dynamic_cast<ChemicallyActivatedReaction&>(*R);
|
|
EXPECT_DOUBLE_EQ(CAR.high_rate.preExponentialFactor(), 5.88e-14);
|
|
EXPECT_DOUBLE_EQ(CAR.low_rate.preExponentialFactor(), 2.82320078e2);
|
|
EXPECT_EQ(CAR.falloff->nParameters(), (size_t) 0);
|
|
}
|