36 const label SIBS::nSeq_[iMaxX_] = {2, 6, 10, 14, 22, 34, 50, 70};
41 SIBS::redMax = 1.0e-5,
53 alpha_(kMaxX_, kMaxX_, 0.0),
54 d_p_(n_, kMaxX_, 0.0),
81 bool exitflag =
false;
85 dxTry = xNew_ = -GREAT;
91 a_[
k + 1] = a_[
k] + nSeq_[
k + 1];
94 for (
label iq = 1; iq<kMaxX_; iq++)
99 pow(eps1, (a_[
k + 1] - a_[iq + 1])
100 /((a_[iq + 1] - a_[0] + 1.0)*(2*
k + 3)));
104 epsOld_ = relTol_[0];
109 a_[
k + 1] = a_[
k] + nSeq_[
k + 1];
112 for (kOpt_ = 1; kOpt_<kMaxX_ - 1; kOpt_++)
114 if (a_[kOpt_ + 1] > a_[kOpt_]*alpha_[kOpt_ - 1][kOpt_])
128 if (x != xNew_ || h != dxTry)
136 scalar maxErr = SMALL;
142 for (k=0; k <= kMax_; k++)
149 <<
"step size underflow" 153 SIMPR(x, yTemp_, dydx0_, dfdx_, dfdy_, h, nSeq_[k], ySeq_);
154 scalar xest =
sqr(h/nSeq_[k]);
156 polyExtrapolate(k, xest, ySeq_, y, yErr_, x_p_, d_p_);
170 err_[km] =
pow(maxErr/safe1, 1.0/(2*km + 3));
173 if (k != 0 && (k >= kOpt_ - 1 || first_))
181 if (k == kMax_ || k == kOpt_ + 1)
183 red = safe2/err_[km];
186 else if (k == kOpt_ && alpha_[kOpt_ - 1][kOpt_] < err_[km])
191 else if (kOpt_ == kMax_ && alpha_[km][kMax_ - 1] < err_[km])
193 red = alpha_[km][kMax_ - 1]*safe2/err_[km];
196 else if (alpha_[km][kOpt_] < err_[km])
198 red = alpha_[km][kOpt_ - 1]/err_[km];
209 red =
min(red, redMin);
210 red =
max(red, redMax);
217 scalar wrkmin = GREAT;
220 for (
label kk=0; kk<=km; kk++)
222 scalar fact =
max(err_[kk], scaleMX);
223 scalar work = fact*a_[kk + 1];
234 if (kOpt_ >= k && kOpt_ != kMax_ && !reduct)
236 scalar fact =
max(scale/alpha_[kOpt_ - 1][kOpt_], scaleMX);
237 if (a_[kOpt_ + 1]*fact <= wrkmin)
dimensionedScalar pow(const dimensionedScalar &ds, const dimensionedScalar &expt)
dimensioned< scalar > mag(const dimensioned< Type > &)
SIBS(const ODESystem &ode, const dictionary &dict)
Construct from ODE.
void solve(scalar &x, scalarField &y, scalar &dxTry) const
Solve the ODE system as far as possible upto dxTry.
label n_
Size of the ODESystem.
scalarField relTol_
Relative convergence tolerance per step.
intWM_LABEL_SIZE_t label
A label is an int32_t or int64_t as specified by the pre-processor macro WM_LABEL_SIZE.
errorManipArg< error, int > exit(error &err, const int errNo=1)
A list of keyword definitions, which are a keyword followed by any number of values (e...
virtual void derivatives(const scalar x, const scalarField &y, scalarField &dydx) const =0
Calculate the derivatives in dydx.
Abstract base class for the systems of ordinary differential equations.
An ODE solver for chemistry.
scalarField absTol_
Absolute convergence tolerance per step.
dimensioned< Type > max(const dimensioned< Type > &, const dimensioned< Type > &)
label k
Boltzmann constant.
const ODESystem & odes_
Reference to ODESystem.
Macros for easy insertion into run-time selection tables.
Abstract base-class for ODE system solvers.
#define FatalErrorIn(functionName)
Report an error message using Foam::FatalError.
virtual void jacobian(const scalar x, const scalarField &y, scalarField &dfdx, scalarSquareMatrix &dfdy) const =0
Calculate the Jacobian of the system.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
dimensioned< Type > min(const dimensioned< Type > &, const dimensioned< Type > &)
addToRunTimeSelectionTable(ensightPart, ensightPartCells, istream)
const dimensionedScalar h
Planck constant.
defineTypeNameAndDebug(combustionModel, 0)