d02nec is a general purpose function for integrating the initial value problem for a stiff system of implicit ordinary differential equations with coupled algebraic equations written in the form
d02nec uses the DASSL implementation of the Backward Differentiation Formulae (BDF) of orders one to five to solve a system of the above form for
(
y) and
(
ydot). Values for
y and
ydot at the initial time must be given as input. These values must be consistent, (i.e., if
t,
y,
ydot are the given initial values, they must satisfy
). The function solves the system from
to
.
An outline of a typical calling program for
d02nec is given below. It calls the DASSL implementation of the BDF integrator setup function
d02mwc and the banded matrix setup function
d02npc (if required), and, if the integration needs to proceed, calls
d02mcc before continuing the integration.
/* declarations */
EXTERN res, jac
.
.
.
/* Initialize the integrator */
nag_ode_dae_dassl_setup(...);
/* Is the Jacobian matrix banded? */
if (banded) {nag_ode_dae_dassl_linalg(...);}
/* Set dt to the required temporal resolution */
/* Set tend to the final time */
/* Call the integrator for each temporal value */
itask = 0;
while (tout<tend && itask>-1) {
nag_ode_dae_dassl_gen (...);
if (itask != 1)
tout = MIN(tout+dt,tend);
/* Print the solution */
}
.
.
.
None.
-
1:
– Integer
Input
-
On entry: the number of differential-algebraic equations to be solved.
Constraint:
.
-
2:
– double *
Input/Output
-
On initial entry: the initial value of the independent variable, .
On intermediate exit:
, the current value of the independent variable.
On final exit: the value of the independent variable at which the computed solution
is returned (usually at
tout).
-
3:
– double
Input
-
On entry: the next value of at which a computed solution is desired.
On initial entry:
tout is used to determine the direction of integration. Integration is permitted in either direction (see also
itask).
Constraint:
.
-
4:
– double
Input/Output
-
On initial entry: the vector of initial values of the dependent variables .
On intermediate exit:
the computed solution vector, , evaluated at .
On final exit: the computed solution vector, evaluated at (usually ).
-
5:
– double
Input/Output
-
On initial entry:
ydot must contain approximations to the time derivatives
of the vector
evaluated at the initial value of the independent variable.
On exit: the time derivatives of the vector at the last integration point.
-
6:
– double
Input/Output
-
Note: the dimension,
dim, of the array
rtol depends on the value of
vector_tol as set in
d02mwc; it
must be at least
- when ;
- when .
On entry: the relative local error tolerance.
Constraint:
, for
where when and otherwise.
On exit:
rtol remains unchanged unless
d02nec exits with
NE_ODE_TOL in which case the values may have been increased to values estimated to be appropriate for continuing the integration.
-
7:
– double
Input/Output
-
Note: the dimension,
dim, of the array
atol depends on the value of
vector_tol as set in
d02mwc; it
must be at least
- when ;
- when .
On entry: the absolute local error tolerance.
Constraint:
, for
where when and otherwise.
On exit:
atol remains unchanged unless
d02nec exits with
NE_ODE_TOL in which case the values may have been increased to values estimated to be appropriate for continuing the integration.
-
8:
– Integer *
Input/Output
-
On initial entry: need not be set.
On exit: the task performed by the integrator on successful completion or an indicator that a problem occurred during integration.
- The integration to tout was successfully completed () by stepping exactly to tout.
- The integration to tout was successfully completed () by stepping past tout. y and ydot are obtained by interpolation.
- Different negative values of itask returned correspond to different failure exits. fail should always be checked in such cases and the corrective action taken where appropriate.
itask must remain
unchanged between calls to
d02nec.
-
9:
– function, supplied by the user
External Function
-
res must evaluate the residual
The specification of
res is:
void |
res (Integer neq,
double t,
const double y[],
const double ydot[],
double r[],
Integer *ires,
Nag_Comm *comm)
|
|
-
1:
– Integer
Input
-
On entry: the number of differential-algebraic equations being solved.
-
2:
– double
Input
-
On entry: , the current value of the independent variable.
-
3:
– const double
Input
-
On entry: , for , the current solution component.
-
4:
– const double
Input
-
On entry: the derivative of the solution at the current point .
-
5:
– double
Output
-
On exit:
must contain the
th component of
, for
where
-
6:
– Integer *
Input/Output
-
On entry: is always equal to zero.
On exit:
ires should normally be left unchanged. However, if an illegal value of
y is encountered,
ires should be set to
;
d02nec will then attempt to resolve the problem so that illegal values of
y are not encountered.
ires should be set to
if you wish to return control to the calling function; this will cause
d02nec to exit with
NE_RES_FLAG.
-
7:
– Nag_Comm *
Pointer to structure of type Nag_Comm; the following members are relevant to
res.
- user – double *
- iuser – Integer *
- p – Pointer
The type Pointer will be
void *. Before calling
d02nec you may allocate memory and initialize these pointers with various quantities for use by
res when called from
d02nec (see
Section 3.1.1 in the Introduction to the NAG Library CL Interface).
Note: res should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by
d02nec. If your code inadvertently
does return any NaNs or infinities,
d02nec is likely to produce unexpected results.
-
10:
– function, supplied by the user
External Function
-
Evaluates the matrix of partial derivatives,
, where
If this option is not required, the actual argument for
jac must be specified as NULLFN. You must indicate to the integrator whether this option is to be used by setting the argument
jceval appropriately in a call to the setup function
d02mwc.
The specification of
jac is:
void |
jac (Integer neq,
double t,
const double y[],
const double ydot[],
double pd[],
double cj,
Nag_Comm *comm)
|
|
-
1:
– Integer
Input
-
On entry: the number of differential-algebraic equations being solved.
-
2:
– double
Input
-
On entry: , the current value of the independent variable.
-
3:
– const double
Input
-
On entry: , for , the current solution component.
-
4:
– const double
Input
-
On entry: the derivative of the solution at the current point .
-
5:
– double
Input/Output
-
Note: the dimension of the array
pd will be
when the Jacobian is full and will be
when the Jacobian is banded (that is, a prior call to
d02npc has been made).
On entry:
pd is preset to zero before the call to
jac.
On exit: if the Jacobian is full then
, for
and
; if the Jacobian is banded then
, for
; (see also in
f07bdc).
-
6:
– double
Input
-
On entry:
cj is a scalar constant which will be defined in
d02nec.
-
7:
– Nag_Comm *
Pointer to structure of type Nag_Comm; the following members are relevant to
jac.
- user – double *
- iuser – Integer *
- p – Pointer
The type Pointer will be
void *. Before calling
d02nec you may allocate memory and initialize these pointers with various quantities for use by
jac when called from
d02nec (see
Section 3.1.1 in the Introduction to the NAG Library CL Interface).
Note: jac should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by
d02nec. If your code inadvertently
does return any NaNs or infinities,
d02nec is likely to produce unexpected results.
-
11:
– Integer
Communication Array
-
icom contains information which is usually of no interest, but is necessary for subsequent calls. However you may find the following useful:
- The order of the method to be attempted on the next step.
- The order of the method used on the last step.
- The number of steps taken so far.
- The number of calls to res so far.
- The number of evaluations of the matrix of partial derivatives needed so far.
- The total number of error test failures so far.
- The total number of convergence test failures so far.
-
12:
– double
Communication Array
-
com contains information which is usually of no interest, but is necessary for subsequent calls. However you may find the following useful:
- The step size to be attempted on the next step.
- The current value of the independent variable, i.e., the farthest point integration has reached. This will be different from t only when interpolation has been performed ().
-
13:
– Integer
Input
-
On entry: the dimension of the array
com.
Constraint:
where
is the maximum order that can be used by the integration method (see
maxord in
d02mwc);
when the Jacobian is full and
when the Jacobian is banded; and,
when the Jacobian is to be evaluated numerically and
otherwise.
-
14:
– Nag_Comm *
-
The NAG communication argument (see
Section 3.1.1 in the Introduction to the NAG Library CL Interface).
-
15:
– NagError *
Input/Output
-
The NAG error argument (see
Section 7 in the Introduction to the NAG Library CL Interface).
- NE_ALLOC_FAIL
-
Dynamic memory allocation failed.
See
Section 3.1.2 in the Introduction to the NAG Library CL Interface for further information.
- NE_ARRAY_INPUT
-
All elements of
rtol and
atol are zero.
Some element of
atol is less than zero.
Some element of
rtol is less than zero.
- NE_BAD_PARAM
-
On entry, argument had an illegal value.
- NE_CONV_CONT
-
The corrector could not converge and the error test failed repeatedly. . Stepsize .
The corrector repeatedly failed to converge with . . Stepsize .
- NE_CONV_JACOBG
-
The iteration matrix is singular. . Stepsize .
- NE_CONV_ROUNDOFF
-
The error test failed repeatedly with . . Stepsize .
- NE_INITIALIZATION
-
Either the initialization function has not been called prior to the first call of this function or a communication array has become corrupted.
- NE_INT
-
A previous call to this function returned with and no appropriate action was taken.
- NE_INT_2
-
com array is of insufficient length; length required
; actual length
.
- NE_INT_ARG_LT
-
On entry, .
Constraint: .
- NE_INTERNAL_ERROR
-
An internal error has occurred in this function. Check the function call and any array sizes. If the call is correct then please contact
NAG for assistance.
See
Section 7.5 in the Introduction to the NAG Library CL Interface for further information.
- NE_MAX_STEP
-
Maximum number of steps taken on this call before reaching
tout:
, maximum number of steps
.
- NE_NO_LICENCE
-
Your licence key may have expired or may not have been installed correctly.
See
Section 8 in the Introduction to the NAG Library CL Interface for further information.
- NE_ODE_TOL
-
A solution component has become zero when a purely relative tolerance (zero absolute tolerance) was selected for that component. , for component .
Too much accuracy requested for precision of machine.
rtol and
atol were increased by scale factor
. Try running again with these scaled tolerances.
,
.
- NE_REAL_2
-
tout is behind
t in the direction of
:
,
.
tout is too close to
t to start integration:
:
.
- NE_REAL_ARG_EQ
-
On entry, .
Constraint: .
- NE_RES_FLAG
-
ires was set to
during a call to
res and could not be resolved.
. Stepsize
.
ires was set to
during a call to
res.
. Stepsize
.
Repeated occurrences of input constraint violations have been detected. This could result in a potential infinite loop: . Current violation corresponds to exit with .
- NE_SINGULAR_POINT
-
The initial
ydot could not be computed.
. Stepsize
.
The accuracy of the numerical solution may be controlled by a careful choice of the arguments
rtol and
atol. You are advised to use scalar error control unless the components of the solution are expected to be poorly scaled. For the type of decaying solution typical of many stiff problems, relative error control with a small absolute error threshold will be most appropriate (that is, you are advised to choose
with
small but positive).
Please consult the
X06 Chapter Introduction for information on how to control and interrogate the OpenMP environment used within this function. Please also consult the
Users' Note for your implementation for any additional implementation-specific information.
The cost of computing a solution depends critically on the size of the differential system and to a lesser extent on the degree of stiffness of the problem. For banded systems the cost is proportional to , while for full systems the cost is proportional to
. Note however that for moderately sized problems which are only mildly nonlinear the cost may be dominated by factors proportional to and respectively.
This example solves the well-known stiff Robertson problem written in implicit form
with initial conditions
and
over the range
the BDF method (setup function
d02mwc and
d02npc).
None.