Skip to content

Commit d8dfc83

Browse files
Cpp Wall Jacobian Test
1 parent 147e4d1 commit d8dfc83

File tree

2 files changed

+81
-1
lines changed

2 files changed

+81
-1
lines changed

interfaces/cython/cantera/reactor.pyx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1822,4 +1822,3 @@ cdef class ReactorNet:
18221822
def __get__(self):
18231823
return get_from_sparse(self.net.finiteDifferenceJacobian(),
18241824
self.n_vars, self.n_vars)
1825-

test/zeroD/test_zeroD.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,87 @@ TEST(AdaptivePreconditionerTests, test_precon_solver_stats)
190190
EXPECT_GE(stats["nonlinear_conv_fails"].asInt(), 0);
191191
}
192192

193+
TEST(JacobianTests, test_wall_jacobian_build)
194+
{
195+
// create first reactor
196+
auto sol1 = newSolution("h2o2.yaml");
197+
sol1->thermo()->setState_TPY(1000.0, OneAtm, " O2:1.0");
198+
IdealGasMoleReactor reactor1;
199+
reactor1.insert(sol1);
200+
reactor1.setInitialVolume(1.0);
201+
// create second reactor
202+
auto sol2 = newSolution("h2o2.yaml");
203+
sol2->thermo()->setState_TPY(900.0, OneAtm, " O2:1.0");
204+
IdealGasConstPressureMoleReactor reactor2;
205+
reactor2.insert(sol2);
206+
reactor2.setInitialVolume(1.0);
207+
// create the wall
208+
Wall w;
209+
w.install(reactor1, reactor2);
210+
w.setArea(2.0);
211+
w.setHeatTransferCoeff(3.0);
212+
// setup reactor network and integrate
213+
ReactorNet network;
214+
network.addReactor(reactor1);
215+
network.addReactor(reactor2);
216+
network.initialize();
217+
// create jacobian the size of network
218+
Eigen::SparseMatrix<double> wallJacMat;
219+
wallJacMat.resize(network.neq(), network.neq());
220+
// manually get wall jacobian elements
221+
vector<Eigen::Triplet<double>> wallJac;
222+
// build jac for reactor 1 wall only
223+
w.buildReactorJacobian(&reactor1, wallJac);
224+
wallJacMat.setFromTriplets(wallJac.begin(), wallJac.end());
225+
// check appropriate values
226+
// double tol = 1e-8;
227+
for (int k = 0; k < wallJacMat.outerSize(); k++) {
228+
for (Eigen::SparseMatrix<double>::InnerIterator it(wallJacMat, k); it; ++it) {
229+
EXPECT_DOUBLE_EQ(it.value(), 6000.0);
230+
EXPECT_EQ(it.row(), 0); // check that it is the first row
231+
EXPECT_GE(it.col(), reactor1.speciesOffset());
232+
EXPECT_LT(it.col(), reactor1.neq());
233+
}
234+
}
235+
// build jac for reactor 2 wall only
236+
wallJac.clear();
237+
w.buildReactorJacobian(&reactor2, wallJac);
238+
wallJacMat.setZero();
239+
wallJacMat.setFromTriplets(wallJac.begin(), wallJac.end());
240+
// check appropriate values
241+
// double tol = 1e-8;
242+
for (int k = 0; k < wallJacMat.outerSize(); k++) {
243+
for (Eigen::SparseMatrix<double>::InnerIterator it(wallJacMat, k); it; ++it) {
244+
EXPECT_DOUBLE_EQ(it.value(), -5400.0);
245+
EXPECT_EQ(it.row(), 0); // check that it is the first row
246+
EXPECT_GE(it.col(), reactor2.speciesOffset());
247+
EXPECT_LT(it.col(), reactor2.neq());
248+
}
249+
}
250+
// build jac for network terms
251+
wallJac.clear();
252+
w.buildNetworkJacobian(wallJac);
253+
wallJacMat.setZero();
254+
wallJacMat.setFromTriplets(wallJac.begin(), wallJac.end());
255+
// check appropriate values
256+
// double tol = 1e-8;
257+
for (int k = 0; k < wallJacMat.outerSize(); k++) {
258+
for (Eigen::SparseMatrix<double>::InnerIterator it(wallJacMat, k); it; ++it) {
259+
if (it.value() < 0) {
260+
EXPECT_DOUBLE_EQ(it.value(), -5400.0);
261+
EXPECT_EQ(it.row(), 0); // check that it is the first row
262+
EXPECT_GE(it.col(), reactor1.neq() + reactor2.speciesOffset());
263+
EXPECT_LT(it.col(), reactor1.neq() + reactor2.neq());
264+
} else {
265+
EXPECT_DOUBLE_EQ(it.value(), 6000.0);
266+
EXPECT_EQ(it.row(), reactor1.neq()); // check that it is the first row
267+
EXPECT_GE(it.col(), reactor2.speciesOffset());
268+
EXPECT_LT(it.col(), reactor1.neq());
269+
}
270+
}
271+
}
272+
}
273+
193274
int main(int argc, char** argv)
194275
{
195276
printf("Running main() from test_zeroD.cpp\n");

0 commit comments

Comments
 (0)