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