[1D] Include transport derivatives when computing Jacobian for adjoint
This commit is contained in:
parent
ca8b101acc
commit
0bfdf146c0
4 changed files with 24 additions and 4 deletions
|
|
@ -539,6 +539,16 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void _finalize(const doublereal* x) {}
|
virtual void _finalize(const doublereal* x) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* In some cases, for computational efficiency some properties (e.g.
|
||||||
|
* transport coefficients) may not be updated during Jacobian evaluations.
|
||||||
|
* Set this to `true` to force these properties to be udpated even while
|
||||||
|
* calculating Jacobian elements.
|
||||||
|
*/
|
||||||
|
void forceFullUpdate(bool update) {
|
||||||
|
m_force_full_update = update;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
doublereal m_rdt;
|
doublereal m_rdt;
|
||||||
size_t m_nv;
|
size_t m_nv;
|
||||||
|
|
@ -572,6 +582,7 @@ protected:
|
||||||
vector_int m_td; //!< @deprecated To be removed after Cantera 2.3.
|
vector_int m_td; //!< @deprecated To be removed after Cantera 2.3.
|
||||||
std::vector<std::string> m_name;
|
std::vector<std::string> m_name;
|
||||||
int m_bw;
|
int m_bw;
|
||||||
|
bool m_force_full_update;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,8 @@ Domain1D::Domain1D(size_t nv, size_t points, double time) :
|
||||||
m_jstart(0),
|
m_jstart(0),
|
||||||
m_left(0),
|
m_left(0),
|
||||||
m_right(0),
|
m_right(0),
|
||||||
m_bw(-1)
|
m_bw(-1),
|
||||||
|
m_force_full_update(false)
|
||||||
{
|
{
|
||||||
resize(nv, points);
|
resize(nv, points);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -569,7 +569,13 @@ void Sim1D::evalSSJacobian()
|
||||||
|
|
||||||
void Sim1D::solveAdjoint(const double* b, double* lambda)
|
void Sim1D::solveAdjoint(const double* b, double* lambda)
|
||||||
{
|
{
|
||||||
|
for (auto& D : m_dom) {
|
||||||
|
D->forceFullUpdate(true);
|
||||||
|
}
|
||||||
evalSSJacobian();
|
evalSSJacobian();
|
||||||
|
for (auto& D : m_dom) {
|
||||||
|
D->forceFullUpdate(false);
|
||||||
|
}
|
||||||
|
|
||||||
// Form J^T
|
// Form J^T
|
||||||
size_t bw = bandwidth();
|
size_t bw = bandwidth();
|
||||||
|
|
|
||||||
|
|
@ -268,10 +268,12 @@ void StFlow::eval(size_t jg, doublereal* xg,
|
||||||
// ------------ update properties ------------
|
// ------------ update properties ------------
|
||||||
|
|
||||||
updateThermo(x, j0, j1);
|
updateThermo(x, j0, j1);
|
||||||
if (jg == npos) {
|
if (jg == npos || m_force_full_update) {
|
||||||
// update transport properties only if a Jacobian is not being evaluated
|
// update transport properties only if a Jacobian is not being
|
||||||
|
// evaluated, or if specifically requested
|
||||||
updateTransport(x, j0, j1);
|
updateTransport(x, j0, j1);
|
||||||
|
}
|
||||||
|
if (jg == npos) {
|
||||||
double* Yleft = x + index(c_offset_Y, jmin);
|
double* Yleft = x + index(c_offset_Y, jmin);
|
||||||
m_kExcessLeft = distance(Yleft, max_element(Yleft, Yleft + m_nsp));
|
m_kExcessLeft = distance(Yleft, max_element(Yleft, Yleft + m_nsp));
|
||||||
double* Yright = x + index(c_offset_Y, jmax);
|
double* Yright = x + index(c_offset_Y, jmax);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue