185 lines
5.4 KiB
C++
185 lines
5.4 KiB
C++
//! @file ResidJacEval.cpp
|
|
|
|
// This file is part of Cantera. See License.txt in the top-level directory or
|
|
// at http://www.cantera.org/license.txt for license and copyright information.
|
|
|
|
#include "cantera/base/ct_defs.h"
|
|
#include "cantera/numerics/ResidJacEval.h"
|
|
|
|
using namespace std;
|
|
|
|
namespace Cantera
|
|
{
|
|
ResidJacEval::ResidJacEval(doublereal atol) :
|
|
m_atol(atol)
|
|
{
|
|
}
|
|
|
|
ResidJacEval::ResidJacEval(const ResidJacEval& right)
|
|
{
|
|
warn_deprecated("ResidJacEval copy constructor",
|
|
"To be removed after Cantera 2.3.");
|
|
*this = right;
|
|
}
|
|
|
|
ResidJacEval& ResidJacEval::operator=(const ResidJacEval& right)
|
|
{
|
|
warn_deprecated("ResidJacEval assignment operator",
|
|
"To be removed after Cantera 2.3.");
|
|
if (this == &right) {
|
|
return *this;
|
|
}
|
|
|
|
ResidEval::operator=(right);
|
|
|
|
m_atol = right.m_atol;
|
|
neq_ = right.neq_;
|
|
|
|
return *this;
|
|
}
|
|
|
|
ResidJacEval* ResidJacEval::duplMyselfAsResidJacEval() const
|
|
{
|
|
return new ResidJacEval(*this);
|
|
}
|
|
|
|
int ResidJacEval::nEquations() const
|
|
{
|
|
return neq_;
|
|
}
|
|
|
|
void ResidJacEval::setAtol(doublereal atol)
|
|
{
|
|
m_atol = atol;
|
|
if (m_atol <= 0.0) {
|
|
throw CanteraError("ResidJacEval::setAtol",
|
|
"atol must be greater than zero");
|
|
}
|
|
}
|
|
|
|
int ResidJacEval::getInitialConditions(doublereal t0, doublereal* const y,
|
|
doublereal* const ydot)
|
|
{
|
|
for (int i = 0; i < neq_; i++) {
|
|
y[i] = 0.0;
|
|
}
|
|
if (ydot) {
|
|
for (int i = 0; i < neq_; i++) {
|
|
ydot[i] = 0.0;
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void ResidJacEval::user_out2(const int ifunc, const doublereal t,
|
|
const doublereal deltaT, const doublereal* y,
|
|
const doublereal* ydot)
|
|
{
|
|
}
|
|
|
|
void ResidJacEval::user_out(const int ifunc, const doublereal t,
|
|
const doublereal* y, const doublereal* ydot)
|
|
{
|
|
user_out2(ifunc, t, 0.0, y, ydot);
|
|
}
|
|
|
|
int ResidJacEval::evalTimeTrackingEqns(const doublereal t,
|
|
const doublereal delta_t,
|
|
const doublereal* y,
|
|
const doublereal* ydot)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
int ResidJacEval::calcDeltaSolnVariables(const doublereal t,
|
|
const doublereal* const ySoln,
|
|
const doublereal* const ySolnDot,
|
|
doublereal* const deltaYSoln,
|
|
const doublereal* const solnWeights)
|
|
{
|
|
if (!solnWeights) {
|
|
for (int i = 0; i < neq_; i++) {
|
|
deltaYSoln[i] = m_atol + fabs(1.0E-6 * ySoln[i]);
|
|
}
|
|
} else {
|
|
for (int i = 0; i < neq_; i++) {
|
|
deltaYSoln[i] = std::max(1.0E-2 * solnWeights[i], 1.0E-6 * fabs(ySoln[i]));
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
void ResidJacEval::calcSolnScales(const doublereal t,
|
|
const doublereal* const ysoln,
|
|
const doublereal* const ysolnOld,
|
|
doublereal* const ysolnScales)
|
|
{
|
|
if (ysolnScales && ysolnScales[0] == 0.0) {
|
|
for (int i = 0; i < neq_; i++) {
|
|
ysolnScales[i] = 1.0;
|
|
}
|
|
}
|
|
}
|
|
|
|
doublereal ResidJacEval::filterNewStep(doublereal t, const doublereal* const ybase, doublereal* const step)
|
|
{
|
|
return 0.0;
|
|
}
|
|
|
|
doublereal ResidJacEval::filterSolnPrediction(doublereal t, doublereal* const y)
|
|
{
|
|
return 0.0;
|
|
}
|
|
|
|
bool ResidJacEval::evalStoppingCritera(const doublereal t,
|
|
const doublereal delta_t,
|
|
const doublereal* const y,
|
|
const doublereal* const ydot)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
int ResidJacEval::matrixConditioning(doublereal* const matrix, const int nrows,
|
|
doublereal* const rhs)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
int ResidJacEval::evalResidNJ(const doublereal t, const doublereal deltaT,
|
|
const doublereal* y, const doublereal* ydot,
|
|
doublereal* const resid,
|
|
const ResidEval_Type_Enum evalType,
|
|
const int id_x, const doublereal delta_x)
|
|
{
|
|
throw CanteraError("ResidJacEval::evalResidNJ()", "Not implemented\n");
|
|
return 1;
|
|
}
|
|
|
|
int ResidJacEval::eval(const doublereal t, const doublereal* const y, const doublereal* const ydot,
|
|
doublereal* const r)
|
|
{
|
|
double deltaT = -1.0;
|
|
return evalResidNJ(t, deltaT, y, ydot, r);
|
|
}
|
|
|
|
int ResidJacEval::evalJacobian(const doublereal t, const doublereal delta_t,
|
|
doublereal cj, const doublereal* const y,
|
|
const doublereal* const ydot, DenseMatrix& J,
|
|
doublereal* const resid)
|
|
{
|
|
doublereal* const* jac_colPts = J.colPts();
|
|
return evalJacobianDP(t, delta_t, cj, y, ydot, jac_colPts, resid);
|
|
}
|
|
|
|
int ResidJacEval::evalJacobianDP(const doublereal t, const doublereal delta_t,
|
|
const doublereal c_j,
|
|
const doublereal* const y,
|
|
const doublereal* const ydot,
|
|
doublereal* const* jac_colPts,
|
|
doublereal* const resid)
|
|
{
|
|
throw CanteraError("ResidJacEval::evalJacobianDP()", "Not implemented\n");
|
|
return 1;
|
|
}
|
|
|
|
}
|