@@ -190,6 +190,87 @@ TEST(AdaptivePreconditionerTests, test_precon_solver_stats)
190
190
EXPECT_GE (stats[" nonlinear_conv_fails" ].asInt (), 0 );
191
191
}
192
192
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
+
193
274
int main (int argc, char ** argv)
194
275
{
195
276
printf (" Running main() from test_zeroD.cpp\n " );
0 commit comments