1 #include "gtest/gtest.h"
2
3 #include "cantera/transport/TransportData.h"
4 #include "cantera/transport/MixTransport.h"
5 #include "cantera/transport/MultiTransport.h"
6 #include "cantera/transport/TransportFactory.h"
7 #include "cantera/thermo/ThermoFactory.h"
8 #include "cantera/thermo/IdealGasPhase.h"
9 #include "cantera/thermo/Species.h"
10 #include "cantera/thermo/NasaPoly2.h"
11 #include "cantera/base/global.h"
12 #include "cantera/base/stringUtils.h"
13
14 #include "../thermo/thermo_data.h"
15
16 using namespace Cantera;
17
18 class TransportFromScratch : public testing::Test
19 {
20 public:
TransportFromScratch()21 TransportFromScratch()
22 : sH2(new Species("H2", parseCompString("H:2")))
23 , sO2(new Species("O2", parseCompString("O:2")))
24 , sH2O(new Species("H2O", parseCompString("H:2 O:1")))
25 , tH2(new GasTransportData())
26 , tO2(new GasTransportData())
27 , tH2O(new GasTransportData())
28 {
29 sH2->thermo.reset(new NasaPoly2(200, 3500, 101325, h2_nasa_coeffs));
30 sO2->thermo.reset(new NasaPoly2(200, 3500, 101325, o2_nasa_coeffs));
31 sH2O->thermo.reset(new NasaPoly2(200, 3500, 101325, h2o_nasa_coeffs));
32
33 tH2->setCustomaryUnits("linear", 2.92, 38.0, 0.0, 0.79, 280.0);
34 tO2->setCustomaryUnits("linear", 3.458, 107.40, 0.0, 1.60, 3.80);
35 tH2O->setCustomaryUnits("nonlinear", 2.605, 572.4, 1.844, 0.0, 4.00);
36
37 sH2->transport = tH2;
38 sO2->transport = tO2;
39 sH2O->transport = tH2O;
40
41 AnyMap phase_def = AnyMap::fromYamlString(
42 "name: test\n"
43 "thermo: ideal-gas\n"
44 "species: [{gri30.yaml/species: [H2, O2, H2O]}]");
45
46 ref = newPhase(phase_def);
47 test.reset(new IdealGasPhase());
48
49 test->addElement("O");
50 test->addElement("H");
51 test->addSpecies(sH2);
52 test->addSpecies(sO2);
53 test->addSpecies(sH2O);
54 test->initThermo();
55
56 ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
57 test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
58 }
59
60 shared_ptr<Species> sH2, sO2, sH2O;
61 shared_ptr<GasTransportData> tH2, tO2, tH2O;
62 unique_ptr<ThermoPhase> ref;
63 unique_ptr<ThermoPhase> test;
64 };
65
TEST_F(TransportFromScratch,binaryDiffCoeffs)66 TEST_F(TransportFromScratch, binaryDiffCoeffs)
67 {
68 Transport* trRef = newTransportMgr("Mix", ref.get());
69 MixTransport trTest;
70 trTest.init(test.get());
71
72 size_t K = ref->nSpecies();
73 Array2D bdiffRef(3,3);
74 Array2D bdiffTest(3,3);
75 ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
76 test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
77 trRef->getBinaryDiffCoeffs(K, &bdiffRef(0,0));
78 trTest.getBinaryDiffCoeffs(K, &bdiffTest(0,0));
79
80 for (size_t i=0; i < K; i++) {
81 for (size_t j=0; j < K; j++) {
82 EXPECT_DOUBLE_EQ(bdiffRef(i,j), bdiffTest(i,j)) << "i = " << i << ", j = " << j;
83 }
84 }
85 }
86
TEST_F(TransportFromScratch,mixDiffCoeffs)87 TEST_F(TransportFromScratch, mixDiffCoeffs)
88 {
89 Transport* trRef = newTransportMgr("Mix", ref.get());
90 MixTransport trTest;
91 trTest.init(test.get());
92
93 size_t K = ref->nSpecies();
94 vector_fp Dref(3);
95 vector_fp Dtest(3);
96 ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
97 test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
98 trRef->getMixDiffCoeffs(&Dref[0]);
99 trTest.getMixDiffCoeffs(&Dtest[0]);
100
101 for (size_t k=0; k < K; k++) {
102 EXPECT_DOUBLE_EQ(Dref[k], Dtest[k]) << "k = " << k;
103 }
104 }
105
TEST_F(TransportFromScratch,viscosity)106 TEST_F(TransportFromScratch, viscosity)
107 {
108 Transport* trRef = newTransportMgr("Mix", ref.get());
109 MixTransport trTest;
110 trTest.init(test.get());
111
112 for (int i = 0; i < 10; i++) {
113 double T = 300 + 111*i;
114 ref->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
115 test->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
116 EXPECT_DOUBLE_EQ(trRef->viscosity(), trTest.viscosity()) << "T = " << T;
117 }
118 }
119
TEST_F(TransportFromScratch,thermalConductivityMix)120 TEST_F(TransportFromScratch, thermalConductivityMix)
121 {
122 Transport* trRef = newTransportMgr("Mix", ref.get());
123 MixTransport trTest;
124 trTest.init(test.get());
125
126 for (int i = 0; i < 10; i++) {
127 double T = 300 + 111*i;
128 ref->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
129 test->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
130 EXPECT_DOUBLE_EQ(trRef->thermalConductivity(),
131 trTest.thermalConductivity()) << "T = " << T;
132 }
133 }
134
TEST_F(TransportFromScratch,multiDiffCoeffs)135 TEST_F(TransportFromScratch, multiDiffCoeffs)
136 {
137 Transport* trRef = newTransportMgr("Multi", ref.get());
138 MultiTransport trTest;
139 trTest.init(test.get());
140
141 size_t K = ref->nSpecies();
142 Array2D Dref(3,3);
143 Array2D Dtest(3,3);
144 ref->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
145 test->setState_TPX(400, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
146 trRef->getMultiDiffCoeffs(K, &Dref(0,0));
147 trTest.getMultiDiffCoeffs(K, &Dtest(0,0));
148
149 for (size_t i=0; i < K; i++) {
150 for (size_t j=0; j < K; j++) {
151 EXPECT_DOUBLE_EQ(Dref(i,j), Dtest(i,j)) << "i = " << i << ", j = " << j;
152 }
153 }
154 }
155
TEST_F(TransportFromScratch,thermalConductivityMulti)156 TEST_F(TransportFromScratch, thermalConductivityMulti)
157 {
158 Transport* trRef = newTransportMgr("Multi", ref.get());
159 MultiTransport trTest;
160 trTest.init(test.get());
161
162 for (int i = 0; i < 10; i++) {
163 double T = 300 + 111*i;
164 ref->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
165 test->setState_TPX(T, 5e5, "H2:0.5, O2:0.3, H2O:0.2");
166 EXPECT_DOUBLE_EQ(trRef->thermalConductivity(),
167 trTest.thermalConductivity()) << "T = " << T;
168 }
169 }
170
main(int argc,char ** argv)171 int main(int argc, char** argv)
172 {
173 printf("Running main() from transportFromScratch.cpp\n");
174 testing::InitGoogleTest(&argc, argv);
175 int result = RUN_ALL_TESTS();
176 appdelete();
177 return result;
178 }
179