cantera/include/cantera/numerics/DAE_Solver.h

270 lines
7.2 KiB
C++

/**
* @file DAE_Solver.h
* Header file for class DAE_Solver
*/
// This file is part of Cantera. See License.txt in the top-level directory or
// at https://cantera.org/license.txt for license and copyright information.
#ifndef CT_DAE_Solver_H
#define CT_DAE_Solver_H
#include "ResidJacEval.h"
#include "cantera/base/global.h"
namespace Cantera
{
class Jacobian
{
public:
Jacobian() {}
virtual ~Jacobian() {}
virtual bool supplied() {
return false;
}
virtual bool isBanded() {
return false;
}
virtual int lowerBandWidth() {
return 0;
}
virtual int upperBandWidth() {
return 0;
}
};
class BandedJacobian : public Jacobian
{
public:
BandedJacobian(int ml, int mu) {
m_ml = ml;
m_mu = mu;
}
virtual bool supplied() {
return false;
}
virtual bool isBanded() {
return true;
}
virtual int lowerBandWidth() {
return m_ml;
}
virtual int upperBandWidth() {
return m_mu;
}
protected:
int m_ml, m_mu;
};
const int cDirect = 0;
const int cKrylov = 1;
/**
* Wrapper for DAE solvers
*
* @attention This class currently does not have any test cases or examples. Its
* implementation may be incomplete, and future changes to Cantera may
* unexpectedly cause this class to stop working. If you use this class,
* please consider contributing examples or test cases. In the absence of
* new tests or examples, this class may be deprecated and removed in a
* future version of Cantera. See
* https://github.com/Cantera/cantera/issues/267 for additional information.
*/
class DAE_Solver
{
public:
DAE_Solver(ResidJacEval& f) :
m_resid(f),
m_neq(f.nEquations()),
m_time(0.0) {
}
virtual ~DAE_Solver() {}
/**
* Set error tolerances. This version specifies a scalar
* relative tolerance, and a vector absolute tolerance.
*/
virtual void setTolerances(doublereal reltol,
doublereal* abstol) {
warn("setTolerances");
}
/**
* Set error tolerances. This version specifies a scalar
* relative tolerance, and a scalar absolute tolerance.
*/
virtual void setTolerances(doublereal reltol, doublereal abstol) {
warn("setTolerances");
}
/**
* Specify a Jacobian evaluator. If this method is not called,
* the Jacobian will be computed by finite difference.
*/
void setJacobian(Jacobian& jac) {
warn("setJacobian");
}
virtual void setLinearSolverType(int solverType) {
warn("setLinearSolverType");
}
virtual void setDenseLinearSolver() {
warn("setDenseLinearSolver");
}
virtual void setBandedLinearSolver(int m_upper, int m_lower) {
warn("setBandedLinearSolver");
}
virtual void setMaxStepSize(doublereal dtmax) {
warn("setMaxStepSize");
}
virtual void setMaxOrder(int n) {
warn("setMaxOrder");
}
virtual void setMaxNumSteps(int n) {
warn("setMaxNumSteps");
}
virtual void setInitialStepSize(doublereal h0) {
warn("setInitialStepSize");
}
virtual void setStopTime(doublereal tstop) {
warn("setStopTime");
}
virtual void setMaxErrTestFailures(int n) {
warn("setMaxErrTestFailures");
}
virtual void setMaxNonlinIterations(int n) {
warn("setMaxNonlinIterations");
}
virtual void setMaxNonlinConvFailures(int n) {
warn("setMaxNonlinConvFailures");
}
virtual void inclAlgebraicInErrorTest(bool yesno) {
warn("inclAlgebraicInErrorTest");
}
//! Calculate consistent value of the starting solution given the starting
//! solution derivatives
/**
* This method may be called if the initial conditions do not satisfy the
* residual equation F = 0. Given the derivatives of all variables, this
* method computes the initial y values.
*/
virtual void correctInitial_Y_given_Yp(doublereal* y, doublereal* yp,
doublereal tout) {
warn("correctInitial_Y_given_Yp");
}
//! Calculate consistent value of the algebraic constraints and derivatives
//! at the start of the problem
/**
* This method may be called if the initial conditions do not satisfy the
* residual equation F = 0. Given the initial values of all differential
* variables, it computes the initial values of all algebraic variables and
* the initial derivatives of all differential variables.
* @param y Calculated value of the solution vector after the procedure ends
* @param yp Calculated value of the solution derivative after the procedure
* @param tout The first value of t at which a soluton will be
* requested (from IDASolve). (This is needed here to
* determine the direction of integration and rough scale
* in the independent variable t.
*/
virtual void correctInitial_YaYp_given_Yd(doublereal* y, doublereal* yp,
doublereal tout) {
warn("correctInitial_YaYp_given_Yd");
}
/**
* Solve the system of equations up to time tout.
*/
virtual int solve(doublereal tout) {
warn("solve");
return 0;
}
/**
* Take one internal step.
*/
virtual doublereal step(doublereal tout) {
warn("step");
return 0;
}
/// Number of equations.
int nEquations() const {
return m_resid.nEquations();
}
/**
* initialize. Base class method does nothing.
*/
virtual void init(doublereal t0) {}
/**
* Set a solver-specific input parameter.
*/
virtual void setInputParameter(int flag, doublereal value) {
warn("setInputParameter");
}
/**
* Get the value of a solver-specific output parameter.
*/
virtual doublereal getOutputParameter(int flag) const {
warn("getOutputParameter");
return 0.0;
}
/// the current value of solution component k.
virtual doublereal solution(int k) const {
warn("solution");
return 0.0;
}
virtual const doublereal* solutionVector() const {
warn("solutionVector");
return &m_dummy;
}
/// the current value of the derivative of solution component k.
virtual doublereal derivative(int k) const {
warn("derivative");
return 0.0;
}
virtual const doublereal* derivativeVector() const {
warn("derivativeVector");
return &m_dummy;
}
protected:
doublereal m_dummy;
ResidJacEval& m_resid;
//! Number of total equations in the system
integer m_neq;
doublereal m_time;
private:
void warn(const std::string& msg) const {
writelog(">>>> Warning: method "+msg+" of base class "
+"DAE_Solver called. Nothing done.\n");
}
};
//! Factor method for choosing a DAE solver
/*!
* @param itype String identifying the type (IDA is the only option)
* @param f Residual function to be solved by the DAE algorithm
* @returns a point to the instantiated DAE_Solver object
*/
DAE_Solver* newDAE_Solver(const std::string& itype, ResidJacEval& f);
}
#endif