Skip to content

Commit

Permalink
Make Reactor Jacobian available in Python
Browse files Browse the repository at this point in the history
  • Loading branch information
speth committed Aug 30, 2022
1 parent 9101e60 commit 3fc279e
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 4 deletions.
1 change: 1 addition & 0 deletions interfaces/cython/cantera/reactor.pxd
Expand Up @@ -42,6 +42,7 @@ cdef extern from "cantera/zerodim.h" namespace "Cantera":
string componentName(size_t) except +translate_exception
size_t neq()
void getState(double*) except +translate_exception
CxxSparseMatrix jacobian() except +translate_exception
void addSurface(CxxReactorSurface*)
void setAdvanceLimit(string&, double) except +translate_exception
void addSensitivityReaction(size_t) except +translate_exception
Expand Down
4 changes: 4 additions & 0 deletions interfaces/cython/cantera/reactor.pyx
Expand Up @@ -333,6 +333,10 @@ cdef class Reactor(ReactorBase):
self.reactor.getState(&y[0])
return y

property jacobian:
def __get__(self):
return get_from_sparse(self.reactor.jacobian(), self.n_vars, self.n_vars)

def set_advance_limit(self, name, limit):
"""
Limit absolute change of component ``name`` during `ReactorNet.advance`.
Expand Down
9 changes: 7 additions & 2 deletions src/zeroD/IdealGasConstPressureMoleReactor.cpp
Expand Up @@ -134,6 +134,10 @@ void IdealGasConstPressureMoleReactor::eval(double time, double* LHS, double* RH

Eigen::SparseMatrix<double> IdealGasConstPressureMoleReactor::jacobian()
{
if (m_nv == 0) {
throw CanteraError("IdealGasConstPressureMoleReactor::jacobian",
"Reactor must be initialized first.");
}
// clear former jacobian elements
m_jac_trips.clear();
// Determine Species Derivatives
Expand Down Expand Up @@ -174,10 +178,11 @@ Eigen::SparseMatrix<double> IdealGasConstPressureMoleReactor::jacobian()
yNext[0] += deltaTemp;
// getting perturbed state
updateState(yNext.data());
eval(m_net->time(), yNext.data(), ydotNext.data());
double time = (m_net != nullptr) ? m_net->time() : 0.0;
eval(time, yNext.data(), ydotNext.data());
// reset and get original state
updateState(yCurrent.data());
eval(m_net->time(), yCurrent.data(), ydotCurrent.data());
eval(time, yCurrent.data(), ydotCurrent.data());
// d T_dot/dT
m_jac_trips.emplace_back(0, 0, (ydotNext[0] - ydotCurrent[0]) / deltaTemp);
// d omega_dot_j/dT
Expand Down
9 changes: 7 additions & 2 deletions src/zeroD/IdealGasMoleReactor.cpp
Expand Up @@ -158,6 +158,10 @@ void IdealGasMoleReactor::eval(double time, double* LHS, double* RHS)

Eigen::SparseMatrix<double> IdealGasMoleReactor::jacobian()
{
if (m_nv == 0) {
throw CanteraError("IdealGasMoleReactor::jacobian",
"Reactor must be initialized first.");
}
// clear former jacobian elements
m_jac_trips.clear();
// Determine Species Derivatives
Expand Down Expand Up @@ -186,10 +190,11 @@ Eigen::SparseMatrix<double> IdealGasMoleReactor::jacobian()
yNext[0] += deltaTemp;
// getting perturbed state
updateState(yNext.data());
eval(m_net->time(), yNext.data(), ydotNext.data());
double time = (m_net != nullptr) ? m_net->time() : 0.0;
eval(time, yNext.data(), ydotNext.data());
// reset and get original state
updateState(yCurrent.data());
eval(m_net->time(), yCurrent.data(), ydotCurrent.data());
eval(time, yCurrent.data(), ydotCurrent.data());
// d T_dot/dT
m_jac_trips.emplace_back(0, 0, (ydotNext[0] - ydotCurrent[0]) / deltaTemp);
// d omega_dot_j/dT
Expand Down

0 comments on commit 3fc279e

Please sign in to comment.