diff --git a/test/SConscript b/test/SConscript index 80adc7591..ce17c56d9 100644 --- a/test/SConscript +++ b/test/SConscript @@ -219,6 +219,7 @@ else: addTestProgram('general', 'general', env_vars=python_env_vars) addTestProgram('thermo', 'thermo', env_vars=python_env_vars) addTestProgram('kinetics', 'kinetics', env_vars=python_env_vars) +addTestProgram('transport', 'transport', env_vars=python_env_vars) python_subtests = [''] test_root = '#interfaces/cython/cantera/test' diff --git a/test/transport/transportFromScratch.cpp b/test/transport/transportFromScratch.cpp new file mode 100644 index 000000000..d34720729 --- /dev/null +++ b/test/transport/transportFromScratch.cpp @@ -0,0 +1,175 @@ +#include "gtest/gtest.h" + +#include "cantera/transport/TransportData.h" +#include "cantera/transport/MixTransport.h" +#include "cantera/transport/MultiTransport.h" +#include "cantera/transport/TransportFactory.h" +#include "cantera/thermo/ThermoFactory.h" +#include "cantera/thermo/IdealGasPhase.h" +#include "cantera/thermo/NasaPoly2.h" +#include "cantera/base/global.h" +#include "cantera/base/stringUtils.h" + +#include "../thermo/thermo_data.h" + +using namespace Cantera; + +class TransportFromScratch : public testing::Test +{ +public: + TransportFromScratch() + : sH2("H2", parseCompString("H:2"), + new NasaPoly2(0, 200, 3500, 101325, h2_nasa_coeffs)) + , sO2("O2", parseCompString("O:2"), + new NasaPoly2(0, 200, 3500, 101325, o2_nasa_coeffs)) + , sH2O("H2O", parseCompString("H:2 O:1"), + new NasaPoly2(0, 200, 3500, 101325, h2o_nasa_coeffs)) + , tH2(new GasTransportData()) + , tO2(new GasTransportData()) + , tH2O(new GasTransportData()) + { + tH2->setCustomaryUnits("H2", "linear", 2.92, 38.0, 0.0, 0.79, 280.0); + tO2->setCustomaryUnits("O2", "linear", 3.46, 107.40, 0.0, 1.60, 3.80); + tH2O->setCustomaryUnits("H2O", "nonlinear", 2.60, 572.4, 1.84, 0.0, 4.00); + + sH2.transport = tH2; + sO2.transport = tO2; + sH2O.transport = tH2O; + + std::string phase_def = "ideal_gas(name='test', elements='O H'," + "species='gri30: H2 O2 H2O')"; + + XML_Node* fxml = get_XML_from_string(phase_def); + ref.reset(newPhase(*fxml->findByName("phase"))); + test.reset(new IdealGasPhase()); + + test->addElement("O"); + test->addElement("H"); + test->addSpecies(sH2); + test->addSpecies(sO2); + test->addSpecies(sH2O); + test->initThermo(); + + ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + } + + Species sH2, sO2, sH2O; + shared_ptr tH2, tO2, tH2O; + shared_ptr ref; + shared_ptr test; +}; + +TEST_F(TransportFromScratch, binaryDiffCoeffs) +{ + Transport* trRef = newTransportMgr("Mix", ref.get()); + MixTransport trTest; + trTest.init(test.get()); + + size_t K = ref->nSpecies(); + Array2D bdiffRef(3,3); + Array2D bdiffTest(3,3); + ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + trRef->getBinaryDiffCoeffs(K, &bdiffRef(0,0)); + trTest.getBinaryDiffCoeffs(K, &bdiffTest(0,0)); + + for (size_t i=0; i < K; i++) { + for (size_t j=0; j < K; j++) { + EXPECT_DOUBLE_EQ(bdiffRef(i,j), bdiffTest(i,j)) << "i = " << i << ", j = " << j; + } + } +} + +TEST_F(TransportFromScratch, mixDiffCoeffs) +{ + Transport* trRef = newTransportMgr("Mix", ref.get()); + MixTransport trTest; + trTest.init(test.get()); + + size_t K = ref->nSpecies(); + vector_fp Dref(3); + vector_fp Dtest(3); + ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + trRef->getMixDiffCoeffs(&Dref[0]); + trTest.getMixDiffCoeffs(&Dtest[0]); + + for (size_t k=0; k < K; k++) { + EXPECT_DOUBLE_EQ(Dref[k], Dtest[k]) << "k = " << k; + } +} + +TEST_F(TransportFromScratch, viscosity) +{ + Transport* trRef = newTransportMgr("Mix", ref.get()); + MixTransport trTest; + trTest.init(test.get()); + + for (size_t i = 0; i < 10; i++) { + double T = 300 + 111*i; + ref->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + test->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + EXPECT_DOUBLE_EQ(trRef->viscosity(), trTest.viscosity()) << "T = " << T; + } +} + +TEST_F(TransportFromScratch, thermalConductivityMix) +{ + Transport* trRef = newTransportMgr("Mix", ref.get()); + MixTransport trTest; + trTest.init(test.get()); + + for (size_t i = 0; i < 10; i++) { + double T = 300 + 111*i; + ref->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + test->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + EXPECT_DOUBLE_EQ(trRef->thermalConductivity(), + trTest.thermalConductivity()) << "T = " << T; + } +} + +TEST_F(TransportFromScratch, multiDiffCoeffs) +{ + Transport* trRef = newTransportMgr("Multi", ref.get()); + MultiTransport trTest; + trTest.init(test.get()); + + size_t K = ref->nSpecies(); + Array2D Dref(3,3); + Array2D Dtest(3,3); + ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + trRef->getMultiDiffCoeffs(K, &Dref(0,0)); + trTest.getMultiDiffCoeffs(K, &Dtest(0,0)); + + for (size_t i=0; i < K; i++) { + for (size_t j=0; j < K; j++) { + EXPECT_DOUBLE_EQ(Dref(i,j), Dtest(i,j)) << "i = " << i << ", j = " << j; + } + } +} + +TEST_F(TransportFromScratch, thermalConductivityMulti) +{ + Transport* trRef = newTransportMgr("Multi", ref.get()); + MultiTransport trTest; + trTest.init(test.get()); + + for (size_t i = 0; i < 10; i++) { + double T = 300 + 111*i; + ref->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + test->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2"); + EXPECT_DOUBLE_EQ(trRef->thermalConductivity(), + trTest.thermalConductivity()) << "T = " << T; + } +} + +int main(int argc, char** argv) +{ + printf("Running main() from transportFromScratch.cpp\n"); + testing::InitGoogleTest(&argc, argv); + int result = RUN_ALL_TESTS(); + appdelete(); + return result; +}