[Input] Parse YAML entries for Plog reactions

This commit is contained in:
Ray Speth 2018-12-10 17:25:06 -05:00
parent d476ad8e59
commit b54ea8bd82
2 changed files with 46 additions and 5 deletions

View file

@ -284,7 +284,7 @@ Arrhenius readArrhenius(const XML_Node& arrhenius_node)
getFloat(arrhenius_node, "E", "actEnergy") / GasConstant);
}
Arrhenius readArrhenius(const Reaction& R, const AnyValue& rate_node,
Arrhenius readArrhenius(const Reaction& R, const AnyValue& rate,
const Kinetics& kin, const UnitSystem& units,
int pressure_dependence=0)
{
@ -314,10 +314,10 @@ Arrhenius readArrhenius(const Reaction& R, const AnyValue& rate_node,
len_dim += pressure_dependence * reaction_phase_ndim;
quantity_dim -= pressure_dependence;
const auto& rate = rate_node.asVector<AnyValue>();
double A = units.convert(rate[0], Units(1.0, 0, len_dim, -1, 0, 0, quantity_dim));
double b = rate[1].asDouble();
double Ta = units.convertMolarEnergy(rate[2], "K");
auto& rate_vec = rate.asVector<AnyValue>();
double A = units.convert(rate_vec[0], Units(1.0, 0, len_dim, -1, 0, 0, quantity_dim));
double b = rate_vec[1].asDouble();
double Ta = units.convertMolarEnergy(rate_vec[2], "K");
return Arrhenius(A, b, Ta);
}
@ -665,6 +665,19 @@ void setupPlogReaction(PlogReaction& R, const XML_Node& rxn_node)
setupReaction(R, rxn_node);
}
void setupPlogReaction(PlogReaction& R, const AnyMap& node,
const Kinetics& kin, const UnitSystem& units)
{
setupReaction(R, node);
std::multimap<double, Arrhenius> rates;
for (const auto& rate : node.at("rate-constants").asVector<AnyValue>()) {
const auto& p_rate = rate.asVector<AnyValue>();
rates.insert({units.convert(p_rate[0], "Pa"),
readArrhenius(R, p_rate[1], kin, units)});
}
R.rate = Plog(rates);
}
void PlogReaction::validate()
{
Reaction::validate();
@ -896,6 +909,10 @@ unique_ptr<Reaction> newReaction(const AnyMap& node, const Kinetics& kin,
unique_ptr<ChemicallyActivatedReaction> R(new ChemicallyActivatedReaction());
setupFalloffReaction(*R, node, kin, units);
return unique_ptr<Reaction>(move(R));
} else if (type == "pressure-dependent-Arrhenius") {
unique_ptr<PlogReaction> R(new PlogReaction());
setupPlogReaction(*R, node, kin, units);
return unique_ptr<Reaction>(move(R));
} else {
throw CanteraError("newReaction", "Unknown reaction type '{}'", type);
}

View file

@ -117,3 +117,27 @@ TEST(Reaction, ChemicallyActivatedFromYaml)
EXPECT_DOUBLE_EQ(CAR.low_rate.preExponentialFactor(), 2.82320078e2);
EXPECT_EQ(CAR.falloff->nParameters(), (size_t) 0);
}
TEST(Reaction, PlogFromYaml)
{
IdealGasMix gas("gri30.xml");
AnyMap rxn = AnyMap::fromYamlString(
"equation: 'H + CH4 <=> H2 + CH3'\n"
"type: pressure-dependent-Arrhenius\n"
"rate-constants:\n"
"- [0.039474, [2.720000e+09 cm^3/mol/s, 1.2, 6834.0]]\n"
"- [1.0 atm, [1.260000e+20, -1.83, 15003.0]]\n"
"- [1.0 atm, [1.230000e+04, 2.68, 6335.0]]\n"
"- [1.01325 MPa, [1.680000e+16, -0.6, 14754.0]]");
UnitSystem U({"atm"});
auto R = newReaction(rxn, gas, U);
auto PR = dynamic_cast<PlogReaction&>(*R);
const auto& rates = PR.rate.rates();
EXPECT_EQ(rates.size(), (size_t) 4);
EXPECT_NEAR(rates[0].first, 0.039474 * OneAtm, 1e-6);
EXPECT_NEAR(rates[2].first, OneAtm, 1e-6);
EXPECT_NEAR(rates[3].first, 10 * OneAtm, 1e-6);
EXPECT_DOUBLE_EQ(rates[0].second.preExponentialFactor(), 2.72e6);
EXPECT_DOUBLE_EQ(rates[3].second.preExponentialFactor(), 1.68e16);
}