From 53102e8d70ab030def307d12e9c1ba61f7fa66b4 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Fri, 26 Sep 2014 13:45:06 +0000 Subject: [PATCH] [Test] Convert 'fracCoeff' test to GTest --- test/SConscript | 2 +- .../fracCoeff => test/data}/frac.cti | 9 +- .../fracCoeff => test/data}/frac.xml | 0 test/kinetics/rates.cpp | 147 ++++++++++++++++ test_problems/SConscript | 1 - test_problems/fracCoeff/fracCoeff.cpp | 161 ------------------ test_problems/fracCoeff/frac_blessed.out | 31 ---- test_problems/fracCoeff/frac_blessed.xml | 157 ----------------- test_problems/fracCoeff/runtest | 47 ----- 9 files changed, 149 insertions(+), 406 deletions(-) rename {test_problems/fracCoeff => test/data}/frac.cti (97%) rename {test_problems/fracCoeff => test/data}/frac.xml (100%) create mode 100644 test/kinetics/rates.cpp delete mode 100644 test_problems/fracCoeff/fracCoeff.cpp delete mode 100644 test_problems/fracCoeff/frac_blessed.out delete mode 100644 test_problems/fracCoeff/frac_blessed.xml delete mode 100755 test_problems/fracCoeff/runtest diff --git a/test/SConscript b/test/SConscript index 2c456013b..8bda81f3d 100644 --- a/test/SConscript +++ b/test/SConscript @@ -196,7 +196,7 @@ else: # Instantiate tests addTestProgram('thermo', 'thermo', env_vars=python_env_vars) -addTestProgram('kinetics', 'kinetics') +addTestProgram('kinetics', 'kinetics', env_vars=python_env_vars) python_subtests = [''] test_root = '#interfaces/cython/cantera/test' diff --git a/test_problems/fracCoeff/frac.cti b/test/data/frac.cti similarity index 97% rename from test_problems/fracCoeff/frac.cti rename to test/data/frac.cti index 15d3edf0f..a338a42b3 100644 --- a/test_problems/fracCoeff/frac.cti +++ b/test/data/frac.cti @@ -1,11 +1,7 @@ -# -# Input file to test use of non-integral stoichiometric -# coefficients. Used with script frac.py. -# +# Input file to test use of non-integral stoichiometric coefficients. units(length = "cm", time = "s", quantity = "mol", act_energy = "cal/mol") - ideal_gas(name = "gas", elements = " O H ", species = """ H2 H O O2 OH H2O """, @@ -13,8 +9,6 @@ ideal_gas(name = "gas", initial_state = state(temperature = 300.0, pressure = OneAtm) ) - - #------------------------------------------------------------------------------- # Species data #------------------------------------------------------------------------------- @@ -103,4 +97,3 @@ reaction( "H2O => 1.4 H + 0.6 OH + 0.2 O2", [1.0e13, 0.0, 0.0]) # coefficients. reaction( "0.7 H2 + 0.6 OH + 0.2 O2 => H2O", [1.0e13, 0.0, 0.0], order = "H2:0.8 OH:2 O2:1") - diff --git a/test_problems/fracCoeff/frac.xml b/test/data/frac.xml similarity index 100% rename from test_problems/fracCoeff/frac.xml rename to test/data/frac.xml diff --git a/test/kinetics/rates.cpp b/test/kinetics/rates.cpp new file mode 100644 index 000000000..7256d4967 --- /dev/null +++ b/test/kinetics/rates.cpp @@ -0,0 +1,147 @@ +#include "gtest/gtest.h" +#include "cantera/kinetics.h" +#include "cantera/thermo/IdealGasPhase.h" + +namespace Cantera +{ + +#ifndef HAS_NO_PYTHON +TEST(FracCoeff, ConvertFracCoeff) +{ + IdealGasPhase thermo1("../data/frac.cti", "gas"); + std::vector phases1; + phases1.push_back(&thermo1); + GasKinetics kinetics1; + importKinetics(thermo1.xml(), phases1, &kinetics1); + + IdealGasPhase thermo2("../data/frac.xml", "gas"); + std::vector phases2; + phases2.push_back(&thermo2); + GasKinetics kinetics2; + importKinetics(thermo2.xml(), phases2, &kinetics2); + + ASSERT_EQ(thermo2.nSpecies(), thermo1.nSpecies()); + ASSERT_EQ(kinetics2.nReactions(), kinetics1.nReactions()); + + for (size_t i = 0; i < kinetics1.nReactions(); i++) { + for (size_t k = 0; k < thermo1.nSpecies(); k++) { + EXPECT_EQ(kinetics1.reactantStoichCoeff(k,i), + kinetics2.reactantStoichCoeff(k,i)); + EXPECT_EQ(kinetics1.productStoichCoeff(k,i), + kinetics2.productStoichCoeff(k,i)); + } + } +} +#endif + +class FracCoeffTest : public testing::Test +{ +public: + FracCoeffTest() : + therm("../data/frac.xml", "gas") + { + std::vector phases; + phases.push_back(&therm); + importKinetics(therm.xml(), phases, &kin); + therm.setState_TPX(2000, 4*OneAtm, + "H2O:0.5, OH:.05, H:0.1, O2:0.15, H2:0.2"); + kH2O = therm.speciesIndex("H2O"); + kH = therm.speciesIndex("H"); + kOH = therm.speciesIndex("OH"); + kO2 = therm.speciesIndex("O2"); + kH2 = therm.speciesIndex("H2"); + } + IdealGasPhase therm; + GasKinetics kin; + size_t kH2O, kH, kOH, kO2, kH2; +}; + +TEST_F(FracCoeffTest, StoichCoeffs) +{ + EXPECT_DOUBLE_EQ(1.0, kin.reactantStoichCoeff(kH2O, 0)); + EXPECT_DOUBLE_EQ(1.4, kin.productStoichCoeff(kH, 0)); + EXPECT_DOUBLE_EQ(0.6, kin.productStoichCoeff(kOH, 0)); + EXPECT_DOUBLE_EQ(0.2, kin.productStoichCoeff(kO2, 0)); + + EXPECT_DOUBLE_EQ(0.7, kin.reactantStoichCoeff(kH2, 1)); + EXPECT_DOUBLE_EQ(0.6, kin.reactantStoichCoeff(kOH, 1)); + EXPECT_DOUBLE_EQ(0.2, kin.reactantStoichCoeff(kO2, 1)); + EXPECT_DOUBLE_EQ(1.0, kin.productStoichCoeff(kH2O, 1)); +} + +TEST_F(FracCoeffTest, RateConstants) +{ + vector_fp kf(kin.nReactions(), 0.0); + vector_fp kr(kin.nReactions(), 0.0); + kin.getFwdRateConstants(&kf[0]); + kin.getRevRateConstants(&kr[0]); + + // sum of reaction orders is 1.0; kf has units of 1/s + EXPECT_DOUBLE_EQ(1e13, kf[0]); + + // sum of reaction orders is 3.8. + // kf = 1e13 (mol/cm^3)^-2.8 s^-1 = 1e13*1000^-2.8 (kmol/m^3)^-2.8 s^-1 + EXPECT_NEAR(1e13*pow(1e3, -2.8), kf[1], 1e-2); + + // Reactions are irreversible + EXPECT_DOUBLE_EQ(0.0, kr[0]); + EXPECT_DOUBLE_EQ(0.0, kr[1]); +} + +TEST_F(FracCoeffTest, RatesOfProgress) +{ + vector_fp kf(kin.nReactions(), 0.0); + vector_fp conc(therm.nSpecies(), 0.0); + vector_fp ropf(kin.nReactions(), 0.0); + therm.getConcentrations(&conc[0]); + kin.getFwdRateConstants(&kf[0]); + kin.getFwdRatesOfProgress(&ropf[0]); + + EXPECT_DOUBLE_EQ(conc[kH2O]*kf[0], ropf[0]); + EXPECT_DOUBLE_EQ(pow(conc[kH2], 0.8)*conc[kO2]*pow(conc[kOH],2)*kf[1], + ropf[1]); +} + +TEST_F(FracCoeffTest, CreationDestructionRates) +{ + vector_fp ropf(kin.nReactions(), 0.0); + vector_fp cdot(therm.nSpecies(), 0.0); + vector_fp ddot(therm.nSpecies(), 0.0); + kin.getFwdRatesOfProgress(&ropf[0]); + kin.getCreationRates(&cdot[0]); + kin.getDestructionRates(&ddot[0]); + + EXPECT_DOUBLE_EQ(ropf[0], ddot[kH2O]); + EXPECT_DOUBLE_EQ(1.4*ropf[0], cdot[kH]); + EXPECT_DOUBLE_EQ(0.6*ropf[0], cdot[kOH]); + EXPECT_DOUBLE_EQ(0.2*ropf[0], cdot[kO2]); + + EXPECT_DOUBLE_EQ(0.7*ropf[1], ddot[kH2]); + EXPECT_DOUBLE_EQ(0.6*ropf[1], ddot[kOH]); + EXPECT_DOUBLE_EQ(0.2*ropf[1], ddot[kO2]); + EXPECT_DOUBLE_EQ(ropf[1], cdot[kH2O]); + + EXPECT_DOUBLE_EQ(0.0, cdot[therm.speciesIndex("O")]); + EXPECT_DOUBLE_EQ(0.0, ddot[therm.speciesIndex("O")]); +} + +TEST_F(FracCoeffTest, EquilibriumConstants) +{ + vector_fp Kc(kin.nReactions(), 0.0); + vector_fp mu0(therm.nSpecies(), 0.0); + + kin.getEquilibriumConstants(&Kc[0]); + therm.getGibbs_ref(&mu0[0]); // at pRef + + double deltaG0_0 = 1.4 * mu0[kH] + 0.6 * mu0[kOH] + 0.2 * mu0[kO2] - mu0[kH2O]; + double deltaG0_1 = mu0[kH2O] - 0.7 * mu0[kH2] - 0.6 * mu0[kOH] - 0.2 * mu0[kO2]; + + double pRef = therm.refPressure(); + double RT = GasConstant * therm.temperature(); + + // Net stoichiometric coefficients are 1.2 and -0.5 + EXPECT_NEAR(exp(-deltaG0_0/RT) * pow(pRef/RT, 1.2), Kc[0], 1e-13 * Kc[0]); + EXPECT_NEAR(exp(-deltaG0_1/RT) * pow(pRef/RT, -0.5), Kc[1], 1e-13 * Kc[1]); +} + +} diff --git a/test_problems/SConscript b/test_problems/SConscript index d01f5ef20..91fc58856 100644 --- a/test_problems/SConscript +++ b/test_problems/SConscript @@ -257,7 +257,6 @@ if haveConverters: options='diamond.cti', artifacts=diamond_name) CompileAndTest('dustyGasTransport', 'dustyGasTransport', 'dustyGasTransport', 'output_blessed.txt') -CompileAndTest('fracCoeff', 'fracCoeff', 'fracCoeff', 'frac_blessed.out') CompileAndTest('mixGasTransport', 'mixGasTransport', 'mixGasTransport', 'output_blessed.txt') CompileAndTest('multiGasTransport', diff --git a/test_problems/fracCoeff/fracCoeff.cpp b/test_problems/fracCoeff/fracCoeff.cpp deleted file mode 100644 index 7edcf8c66..000000000 --- a/test_problems/fracCoeff/fracCoeff.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/** - * @file runDiamond.cpp - */ - -// Example -// -// Note that this example needs updating. It works fine, but is -// written in a way that is less than transparent or -// user-friendly. This could be rewritten using class Interface to -// make things simpler. - -#include "cantera/kinetics.h" -#include - -using namespace std; -using namespace Cantera; - -void printDbl(double val) -{ - if (fabs(val) < 5.0E-200) { - cout << " nil"; - } else { - cout << val; - } -} - -int main(int argc, char** argv) -{ -#ifdef _MSC_VER - _set_output_format(_TWO_DIGIT_EXPONENT); -#endif - string infile = "frac.xml"; - double x[10], kc[10]; - double cdot[10], ddot[10]; - //double fwd_rop[10]; - try { - XML_Node* xc = get_XML_File(infile); - - XML_Node* const xg = xc->findNameID("phase", "gas"); - ThermoPhase* gasTP = newPhase(*xg); - size_t nsp = gasTP->nSpecies(); - cout.precision(4); - cout << "Number of species = " << nsp << endl; - - vector phaseList; - phaseList.push_back(gasTP); - GasKinetics* iKin_ptr = new GasKinetics(); - importKinetics(*xg, phaseList, iKin_ptr); - size_t nr = iKin_ptr->nReactions(); - cout << "Number of reactions = " << nr << endl; - - size_t iH2 = gasTP->speciesIndex("H2"); - size_t iH = gasTP->speciesIndex("H"); - size_t iO2 = gasTP->speciesIndex("O2"); - size_t iOH = gasTP->speciesIndex("OH"); - size_t iH2O = gasTP->speciesIndex("H2O"); - - for (size_t i = 0; i < nsp; i++) { - x[i] = 0.0; - } - x[iH2O] = 1.0/2.0; - x[iOH] = 0.1/2.0; - x[iH] = 0.2/2.0; - x[iO2] = 0.3/2.0; - x[iH2] = 0.4/2.0; - - double p = OneAtm; - - gasTP->setState_TPX(2000., p, x); - - - double src[20]; - for (size_t i = 0; i < 20; i++) { - src[i] = 0.0; - } - iKin_ptr->getNetProductionRates(src); - - double fwd_rop[10]; - iKin_ptr->getFwdRatesOfProgress(fwd_rop); - cout << "fwd_rop[0] = " << fwd_rop[0] << endl; - cout << "fwd_rop[1] = " << fwd_rop[1] << endl; - - iKin_ptr->getCreationRates(cdot); - iKin_ptr->getDestructionRates(ddot); - - for (size_t k = 0; k < nsp; k++) { - string sss = gasTP->speciesName(k); - cout << k << " " << sss << " "; - printDbl(src[k]); - cout << endl; - } - - printf("Creation Rates: \n"); - for (size_t k = 0; k < nsp - 1; k++) { - string sss = gasTP->speciesName(k); - cout << k << " " << sss << " "; - cout << cdot[k] << " "; - cout << cdot[k] / fwd_rop[0] << " "; - cout << endl; - } - string sss = gasTP->speciesName(iH2O); - cout << iH2O << " " << sss << " "; - cout << cdot[iH2O] << " "; - cout << cdot[iH2O] / fwd_rop[1] << " "; - cout << endl; - - - printf("Destruction Rates: \n"); - for (size_t k = 0; k < nsp-1; k++) { - string sss = gasTP->speciesName(k); - cout << k << " " << sss << " "; - cout << ddot[k] << " "; - cout << ddot[k] / fwd_rop[1] << " "; - cout << endl; - } - sss = gasTP->speciesName(iH2O); - cout << iH2O << " " << sss << " "; - cout << ddot[iH2O] << " "; - cout << ddot[iH2O] / fwd_rop[0] << " "; - cout << endl; - - - double c[10]; - gasTP->getConcentrations(c); - - double order_H2 = 0.8; - double order_OH = 2.0; - double order_O2 = 1.0; - - double kf[10]; - iKin_ptr->getFwdRateConstants(kf); - printf("kf[0] = %g\n", kf[0]); - printf("kf[1] = %g\n", kf[1]); - - //double cprod0 = c[iH2O]; - double cprod1 = pow(c[iH2], order_H2) * pow(c[iOH], order_OH) * pow(c[iO2], order_O2); - - printf("equal numbers 0: %g %g \n", kf[0] * c[iH2O], fwd_rop[0]); - - printf("equal numbers 1: %g %g\n", kf[1] * cprod1, fwd_rop[1]); - - iKin_ptr->getEquilibriumConstants(kc); - - printf("Equilibrium constants for irreversible fractional rxns:\n"); - printf("Kc[0] = %g\n", kc[0]); - printf("Kc[1] = %g\n", kc[1]); - - delete iKin_ptr; - iKin_ptr = 0; - delete gasTP; - appdelete(); - - - } catch (CanteraError& err) { - std::cout << err.what() << std::endl; - return -1; - } - - return 0; -} -/***********************************************************/ diff --git a/test_problems/fracCoeff/frac_blessed.out b/test_problems/fracCoeff/frac_blessed.out deleted file mode 100644 index da0c45c8b..000000000 --- a/test_problems/fracCoeff/frac_blessed.out +++ /dev/null @@ -1,31 +0,0 @@ -Number of species = 6 -Number of reactions = 2 -fwd_rop[0] = 3.047e+10 -fwd_rop[1] = 1.575e-08 -0 H2 -1.103e-08 -1 H 4.265e+10 -2 O nil -3 O2 6.093e+09 -4 OH 1.828e+10 -5 H2O -3.047e+10 -Creation Rates: -0 H2 0 0 -1 H 4.265e+10 1.4 -2 O 0 0 -3 O2 6.093e+09 0.2 -4 OH 1.828e+10 0.6 -5 H2O 1.575e-08 1 -Destruction Rates: -0 H2 1.103e-08 0.7 -1 H 0 0 -2 O 0 0 -3 O2 3.15e-09 0.2 -4 OH 9.45e-09 0.6 -5 H2O 3.047e+10 1 -kf[0] = 1e+13 -kf[1] = 39810.7 -equal numbers 0: 3.04665e+10 3.04665e+10 -equal numbers 1: 1.57505e-08 1.57505e-08 -Equilibrium constants for irreversible fractional rxns: -Kc[0] = 5.60014e-11 -Kc[1] = 62705 diff --git a/test_problems/fracCoeff/frac_blessed.xml b/test_problems/fracCoeff/frac_blessed.xml deleted file mode 100644 index 8b09e3c3c..000000000 --- a/test_problems/fracCoeff/frac_blessed.xml +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - O H - H2 H O O2 OH H2O - - - 300.0 - 101325.0 - - - - - - - - - - - - H:2 - - - - 2.344331120E+00, 7.980520750E-03, -1.947815100E-05, 2.015720940E-08, - -7.376117610E-12, -9.179351730E+02, 6.830102380E-01 - - - - 3.337279200E+00, -4.940247310E-05, 4.994567780E-07, -1.795663940E-10, - 2.002553760E-14, -9.501589220E+02, -3.205023310E+00 - - - - - - - H:1 - - - - 2.500000000E+00, 7.053328190E-13, -1.995919640E-15, 2.300816320E-18, - -9.277323320E-22, 2.547365990E+04, -4.466828530E-01 - - - - 2.500000010E+00, -2.308429730E-11, 1.615619480E-14, -4.735152350E-18, - 4.981973570E-22, 2.547365990E+04, -4.466829140E-01 - - - - - - - O:1 - - - - 3.168267100E+00, -3.279318840E-03, 6.643063960E-06, -6.128066240E-09, - 2.112659710E-12, 2.912225920E+04, 2.051933460E+00 - - - - 2.569420780E+00, -8.597411370E-05, 4.194845890E-08, -1.001777990E-11, - 1.228336910E-15, 2.921757910E+04, 4.784338640E+00 - - - - - - - O:2 - - - - 3.782456360E+00, -2.996734160E-03, 9.847302010E-06, -9.681295090E-09, - 3.243728370E-12, -1.063943560E+03, 3.657675730E+00 - - - - 3.282537840E+00, 1.483087540E-03, -7.579666690E-07, 2.094705550E-10, - -2.167177940E-14, -1.088457720E+03, 5.453231290E+00 - - - - - - - H:1 O:1 - - - - 3.992015430E+00, -2.401317520E-03, 4.617938410E-06, -3.881133330E-09, - 1.364114700E-12, 3.615080560E+03, -1.039254580E-01 - - - - 3.092887670E+00, 5.484297160E-04, 1.265052280E-07, -8.794615560E-11, - 1.174123760E-14, 3.858657000E+03, 4.476696100E+00 - - - - - - - H:2 O:1 - - - - 4.198640560E+00, -2.036434100E-03, 6.520402110E-06, -5.487970620E-09, - 1.771978170E-12, -3.029372670E+04, -8.490322080E-01 - - - - 3.033992490E+00, 2.176918040E-03, -1.640725180E-07, -9.704198700E-11, - 1.682009920E-14, -3.000429710E+04, 4.966770100E+00 - - - - - - - - - H2O =] 1.4 H + 0.6 OH + 0.2 O2 - - - 1.000000E+13 - 0.0 - 0.000000 - - - H2O:1.0 - H:1.3999999999999999 O2:0.20000000000000001 OH:0.59999999999999998 - - - - - 0.7 H2 + 0.6 OH + 0.2 O2 =] H2O - 0.80000000000000004 - 1.0 - 2.0 - - - 3.981072E+04 - 0.0 - 0.000000 - - - H2:0.69999999999999996 O2:0.20000000000000001 OH:0.59999999999999998 - H2O:1.0 - - - diff --git a/test_problems/fracCoeff/runtest b/test_problems/fracCoeff/runtest deleted file mode 100755 index 90d2d4798..000000000 --- a/test_problems/fracCoeff/runtest +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/sh -# -# - -temp_success="0" -/bin/rm -f output.txt outputa.txt - -################################################################# -# -################################################################# -CANTERA_DATA=${CANTERA_DATA:=../../data/inputs}; export CANTERA_DATA - -CANTERA_BIN=${CANTERA_BIN:=../../bin} -./fracCoeff > output.txt -retnStat=$? -if [ $retnStat != "0" ] -then - temp_success="1" - echo "fracCoeff returned with bad status, $retnStat, check output" -fi - -../../bin/exp3to2.sh output.txt > outputa.txt -diff -w outputa.txt frac_blessed.out > diff_test.out -retnStat=$? -if [ $retnStat = "0" ] -then - echo "successful diff comparison on fracCoeff test" -else - echo "unsuccessful diff comparison on fracCoeff test" - echo "FAILED" > csvCode.txt - temp_success="1" -fi - -../../bin/exp3to2.sh frac.xml > fraca.xml -diff -w fraca.xml frac_blessed.xml > xml_diff_test.out -retnStat=$? -if [ $retnStat = "0" ] -then - echo "successful diff comparison on fracCoeff.xml test" -else - echo "unsuccessful diff comparison on fracCoeff.xml test" - echo "FAILED" > csvCode.txt - temp_success="1" -fi - - -exit $temp_success