Skip to content

Commit 67bccad

Browse files
Add tests, fix bugs, remove added unused code in cython and cpp
1 parent aeca67b commit 67bccad

File tree

11 files changed

+111
-77
lines changed

11 files changed

+111
-77
lines changed

include/cantera/zeroD/FlowDevice.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,9 @@ class FlowDevice
140140
//! @since New in %Cantera 3.0.
141141
//!
142142
virtual void buildNetworkJacobian(vector<Eigen::Triplet<double>>& jacVector) {
143-
throw NotImplementedError(type() + "::buildNetworkJacobian");
143+
if (!m_jac_calculated) {
144+
throw NotImplementedError(type() + "::buildNetworkJacobian");
145+
}
144146
}
145147

146148
//! Specify the jacobian terms have been calculated and should not be recalculated.

include/cantera/zeroD/IdealGasConstPressureMoleReactor.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,6 @@ class IdealGasConstPressureMoleReactor : public ConstPressureMoleReactor
4949

5050
bool preconditionerSupported() const override { return true; };
5151

52-
double temperatureDerivative() override { return 1; };
53-
54-
double temperatureRadiationDerivative() override {
55-
return 4 * std::pow(temperature(), 3);
56-
}
57-
5852
double moleDerivative(size_t index) override;
5953

6054
double moleRadiationDerivative(size_t index) override;

include/cantera/zeroD/IdealGasMoleReactor.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ class IdealGasMoleReactor : public MoleReactor
4545

4646
bool preconditionerSupported() const override {return true;};
4747

48-
double temperatureDerivative() override { return 1; };
49-
50-
double temperatureRadiationDerivative() override {
51-
return 4 * std::pow(temperature(), 3);
52-
}
53-
5448
double moleDerivative(size_t index) override;
5549

5650
double moleRadiationDerivative(size_t index) override;

include/cantera/zeroD/ReactorBase.h

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -283,32 +283,6 @@ class ReactorBase
283283
//! Set the ReactorNet that this reactor belongs to.
284284
void setNetwork(ReactorNet* net);
285285

286-
//! Calculate the derivative of temperature with respect to the temperature in the
287-
//! heat transfer equation based on the reactor specific equation of state.
288-
//! This function should also transform the state of the derivative to that
289-
//! appropriate for the jacobian's state/
290-
//! @warning This function is an experimental part of the %Cantera API and may be changed
291-
//! or removed without notice.
292-
//! @since New in %Cantera 3.0.
293-
//!
294-
virtual double temperatureDerivative() {
295-
throw NotImplementedError("Reactor::temperatureDerivative");
296-
}
297-
298-
//! Calculate the derivative of temperature with respect to the temperature in the
299-
//! heat transfer radiation equation based on the reactor specific equation of
300-
//! state.
301-
//! This function should also transform the state of the derivative to that
302-
//! appropriate for the jacobian's state/
303-
//! @warning This function is an experimental part of the %Cantera API and may be
304-
//! changed
305-
//! or removed without notice.
306-
//! @since New in %Cantera 3.0.
307-
//!
308-
virtual double temperatureRadiationDerivative() {
309-
throw NotImplementedError("Reactor::temperatureRadiationDerivative");
310-
}
311-
312286
//! Calculate the derivative of T with respect to the ith species in the heat
313287
//! transfer equation based on the reactor specific equation of state.
314288
//! @param index index of the species the derivative is with respect too

interfaces/cython/cantera/_utils.pxd

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,4 @@ cdef anymap_to_py(CxxAnyMap& m)
110110
cdef CxxAnyValue python_to_anyvalue(item, name=*) except *
111111
cdef anyvalue_to_python(string name, CxxAnyValue& v)
112112

113-
cdef vector[CxxEigenTriplet] python_to_triplets(triplets) except *
114-
cdef triplets_to_python(vector[CxxEigenTriplet]& triplets)
115-
116113
cdef CxxEigenTriplet get_triplet(row, col, val) except *

interfaces/cython/cantera/_utils.pyx

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -520,41 +520,10 @@ cdef vector[vector[string]] list2_string_to_anyvalue(data):
520520
v[i][j] = stringify(jtem)
521521
return v
522522

523-
cdef vector[CxxEigenTriplet] python_to_triplets(triplets):
524-
# check that triplet dimensions are met
525-
trip_shape = np.shape(triplets)
526-
assert len(trip_shape) == 2
527-
assert trip_shape[1] == 3
528-
cdef vector[CxxEigenTriplet] trips
529-
# c++ variables
530-
cdef size_t row
531-
cdef size_t col
532-
cdef double val
533-
cdef CxxEigenTriplet* trip_ptr
534-
for r, c, v in triplets:
535-
row = r
536-
col = c
537-
val = v
538-
trip_ptr = new CxxEigenTriplet(row, col, val)
539-
trips.push_back(dereference(trip_ptr))
540-
return trips
541-
542523
cdef CxxEigenTriplet get_triplet(row, col, val):
543524
cdef CxxEigenTriplet* trip_ptr = new CxxEigenTriplet(row, col, val)
544525
return dereference(trip_ptr)
545526

546-
cdef triplets_to_python(vector[CxxEigenTriplet]& triplets):
547-
values = []
548-
cdef size_t row
549-
cdef size_t col
550-
cdef double val
551-
for t in triplets:
552-
row = t.row()
553-
col = t.col()
554-
val = t.value()
555-
values.append((row, col, val))
556-
return values
557-
558527
def _py_to_any_to_py(dd):
559528
# used for internal testing purposes only
560529
cdef string name = stringify("test")

interfaces/cython/cantera/delegator.pyx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ from libc.stdlib cimport malloc
99
from libc.string cimport strcpy
1010

1111
from ._utils import CanteraError
12-
from ._utils cimport stringify, pystr, anymap_to_py, py_to_anymap, triplets_to_python, python_to_triplets, get_triplet
12+
from ._utils cimport stringify, pystr, anymap_to_py, py_to_anymap, get_triplet
1313
from .units cimport Units, UnitStack
1414
# from .reaction import ExtensibleRate, ExtensibleRateData
1515
from .reaction cimport (ExtensibleRate, ExtensibleRateData, CxxReaction,

src/zeroD/Reactor.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ void Reactor::buildFlowJacobian(vector<Eigen::Triplet<double>>& jacVector)
619619
m_outlet[i]->buildReactorJacobian(this, jacVector);
620620
}
621621

622-
for (size_t i = 0; i <m_outlet.size(); i++) {
622+
for (size_t i = 0; i <m_inlet.size(); i++) {
623623
m_inlet[i]->buildReactorJacobian(this, jacVector);
624624
}
625625
}

src/zeroD/ReactorNet.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ void ReactorNet::buildJacobian(vector<Eigen::Triplet<double>>& jacVector)
642642
}
643643
}
644644
// flow devices
645-
if (m_jac_skip_flow_devices) {
645+
if (!m_jac_skip_flow_devices) {
646646
// outlets
647647
for (size_t i = 0; i < r->nOutlets(); i++) {
648648
r->outlet(i).buildNetworkJacobian(jacVector);

test/python/test_reactor.py

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,61 @@ def test_finite_difference_jacobian(self):
198198
if name in constant:
199199
assert all(J[i, species_start:] == 0), (i, name)
200200

201+
def test_network_finite_difference_jacobian(self):
202+
self.make_reactors(T1=900, P1=101325, X1="H2:0.4, O2:0.4, N2:0.2")
203+
k1H2 = self.gas1.species_index("H2")
204+
k2H2 = self.gas1.species_index("H2")
205+
while self.r1.thermo.X[k1H2] > 0.3 or self.r2.thermo.X[k2H2] > 0.3:
206+
self.net.step()
207+
208+
J = self.net.finite_difference_jacobian
209+
assert J.shape == (self.net.n_vars, self.net.n_vars)
210+
211+
# state variables that should be constant, depending on reactor type
212+
constant = {"mass", "volume", "int_energy", "enthalpy", "pressure"}
213+
variable = {"temperature"}
214+
for i in range(3):
215+
name = self.r1.component_name(i)
216+
if name in constant:
217+
assert all(J[i,:] == 0), (i, name)
218+
elif name in variable:
219+
assert any(J[i,:] != 0)
220+
# check in second reactor
221+
name = self.r2.component_name(i)
222+
if name in constant:
223+
assert all(J[i + self.r1.n_vars,:] == 0), (i, name)
224+
elif name in variable:
225+
assert any(J[i + self.r1.n_vars,:] != 0)
226+
227+
# Disabling energy equation should zero these terms
228+
self.r1.energy_enabled = False
229+
self.r2.energy_enabled = False
230+
J = self.net.finite_difference_jacobian
231+
for i in range(3):
232+
name = self.r1.component_name(i)
233+
if name == "temperature":
234+
assert all(J[i,:] == 0)
235+
name = self.r2.component_name(i)
236+
if name == "temperature":
237+
assert all(J[i + self.r1.n_vars,:] == 0)
238+
239+
# Disabling species equations should zero these terms
240+
self.r1.energy_enabled = True
241+
self.r1.chemistry_enabled = False
242+
self.r2.energy_enabled = True
243+
self.r2.chemistry_enabled = False
244+
J = self.net.finite_difference_jacobian
245+
constant = set(self.gas1.species_names + self.gas2.species_names)
246+
r1_species_start = self.r1.component_index(self.gas1.species_name(0))
247+
r2_species_start = self.r2.component_index(self.gas2.species_name(0))
248+
for i in range(self.r1.n_vars):
249+
name = self.r1.component_name(i)
250+
if name in constant:
251+
assert all(J[i, r1_species_start:] == 0), (i, name)
252+
name = self.r2.component_name(i)
253+
if name in constant:
254+
assert all(J[i + self.r1.n_vars, (r2_species_start + self.r1.n_vars):] == 0), (i, name)
255+
201256
def test_timestepping(self):
202257
self.make_reactors()
203258

@@ -1378,14 +1433,26 @@ def create_reactors(self, **kwargs):
13781433
self.precon = ct.AdaptivePreconditioner()
13791434
self.net2.preconditioner = self.precon
13801435
self.net2.derivative_settings = {"skip-third-bodies":True, "skip-falloff":True,
1381-
"skip-coverage-dependence":True}
1436+
"skip-coverage-dependence":True, "skip-flow-devices": True}
13821437

13831438
def test_get_solver_type(self):
13841439
self.create_reactors()
13851440
assert self.precon.side == "right"
13861441
self.net2.initialize()
13871442
self.assertEqual(self.net2.linear_solver_type, "GMRES")
13881443

1444+
def test_mass_flow_jacobian(self):
1445+
self.create_reactors(add_mdot=True)
1446+
# reset derivative settings
1447+
self.net2.derivative_settings = {"skip-third-bodies":True, "skip-falloff":True,
1448+
"skip-coverage-dependence":True, "skip-flow-devices": False}
1449+
1450+
with pytest.raises(NotImplementedError, match="MassFlowController::buildReactorJacobian"):
1451+
J = self.net2.jacobian
1452+
1453+
with pytest.raises(NotImplementedError, match="MassFlowController::buildReactorJacobian"):
1454+
J = self.r2.jacobian
1455+
13891456
def test_heat_transfer_network(self):
13901457
# create first reactor
13911458
gas1 = ct.Solution("h2o2.yaml", "ohmech")

0 commit comments

Comments
 (0)