NAG Library Routine Document
d02qgf
(ivp_adams_roots_revcom)
1
Purpose
d02qgf is a reverse communication routine for integrating a non-stiff system of first-order ordinary differential equations using a variable-order variable-step Adams' method. A root-finding facility is provided.
2
Specification
Fortran Interface
Subroutine d02qgf ( |
neqf,
t,
y,
tout,
neqg,
root,
irevcm,
trvcm,
yrvcm,
yprvcm,
grvcm,
kgrvcm,
rwork,
lrwork,
iwork,
liwork,
ifail) |
Integer, Intent (In) | :: |
neqf,
neqg,
lrwork,
liwork | Integer, Intent (Inout) | :: |
irevcm,
kgrvcm,
iwork(liwork),
ifail | Integer, Intent (Out) | :: |
yrvcm,
yprvcm | Real (Kind=nag_wp), Intent (In) | :: |
tout,
grvcm | Real (Kind=nag_wp), Intent (Inout) | :: |
t,
y(neqf),
rwork(lrwork) | Real (Kind=nag_wp), Intent (Out) | :: |
trvcm | Logical, Intent (Out) | :: |
root |
|
C Header Interface
#include nagmk26.h
void |
d02qgf_ (
const Integer *neqf,
double *t,
double y[],
const double *tout,
const Integer *neqg,
logical *root,
Integer *irevcm,
double *trvcm,
Integer *yrvcm,
Integer *yprvcm,
const double *grvcm,
Integer *kgrvcm,
double rwork[],
const Integer *lrwork,
Integer iwork[],
const Integer *liwork,
Integer *ifail) |
|
3
Description
Given the initial values
d02qgf integrates a non-stiff system of first-order differential equations of the type
from
to
using a variable-order variable-step Adams' method. You define the system by reverse communication, evaluating
in terms of
and
, and
are supplied at
by
d02qgf. The routine is capable of finding roots (values of
) of prescribed event functions of the form
Each
is considered to be independent of the others so that roots are sought of each
individually. The root reported by the routine will be the first root encountered by any
. Two techniques for determining the presence of a root in an integration step are available: the sophisticated method described in
Watts (1985) and a simplified method whereby sign changes in each
are looked for at the ends of each integration step. You also define each
by reverse communication. In one-step mode the routine returns an approximation to the solution at each integration point. In interval mode this value is returned at the end of the integration range. If a root is detected this approximation is given at the root. You select the mode of operation, the error control, the root-finding technique and various optional inputs by a prior call to the setup routine
d02qwf.
For a description of the practical implementation of an Adams' formula see
Shampine and Gordon (1975).
4
References
Shampine L F and Gordon M K (1975) Computer Solution of Ordinary Differential Equations – The Initial Value Problem W H Freeman & Co., San Francisco
Shampine L F and Watts H A (1979) DEPAC – design of a user oriented package of ODE solvers Report SAND79-2374 Sandia National Laboratory
Watts H A (1985) RDEAM – An Adams ODE code with root solving capability Report SAND85-1595 Sandia National Laboratory
5
Arguments
Note: this routine uses
reverse communication. Its use involves an initial entry, intermediate exits and re-entries, and a final exit, as indicated by the argument
irevcm. Between intermediate exits and re-entries,
all arguments other than grvcm and rwork must remain unchanged.
- 1: – IntegerInput
-
On initial entry: the number of first-order ordinary differential equations to be solved by
d02qgf. It must contain the same value as the argument
neqf used in the prior call to
d02qwf.
Constraint:
.
- 2: – Real (Kind=nag_wp)Input/Output
-
On initial entry: that is after a call to
d02qwf with
,
t must be set to the initial value of the independent variable
.
On final exit: the value of
at which
has been computed. This may be an intermediate output point, a root,
tout or a point at which an error has occurred. If the integration is to be continued, possibly with a new value for
tout,
t must not be changed.
- 3: – Real (Kind=nag_wp) arrayInput/Output
-
On initial entry: the initial values of the solution .
On final exit: the computed values of the solution at the exit value of
t. If the integration is to be continued, possibly with a new value for
tout, these values must not be changed.
- 4: – Real (Kind=nag_wp)Input
-
On initial entry: the next value of
at which a computed solution is required. For the initial
t, the input value of
tout is used to determine the direction of integration. Integration is permitted in either direction. If
on exit,
tout must be reset beyond
t in the direction of integration, before any continuation call.
- 5: – IntegerInput
-
On initial entry: the number of event functions which you are defining for root-finding. If root-finding is not required the value for
neqg must be
. Otherwise it must be the same value as the argument
neqg used in the prior call to
d02qwf.
- 6: – LogicalOutput
-
On final exit: if root-finding was required (
on entry),
root specifies whether or not the output value of the argument
t is a root of one of the event functions. If
, no root was detected, whereas
indicates a root and you should make a call to
d02qyf for further information.
If root-finding was not required ( on entry), .
- 7: – IntegerInput/Output
-
On initial entry: must have the value .
On intermediate exit:
specifies what action you must take before re-entering
d02qgf with irevcm unchanged.
- , , , , , or
- Indicates that you must supply , where is given by trvcm and
is returned in , for when and
, for when .
should be placed in location , for .
- Indicates that the current step was not successful due to error test failure. The only information supplied to you on this return is the current value of the independent variable t, as given by trvcm. No values must be changed before re-entering d02qgf. This facility enables you to determine the number of unsuccessful steps.
- , , or
- Indicates that you must supply , where is given by kgrvcm, is given by trvcm, is given by and is given by . The result should be placed in the variable grvcm.
On final exit: has the value
, which indicates that an output point or root has been reached or an error has occurred (see
ifail).
Note: any values you return to d02qgf as part of the reverse communication procedure should not include floating-point NaN (Not a Number) or infinity values, since these are not handled by d02qgf. If your code inadvertently does return any NaNs or infinities, d02qgf is likely to produce unexpected results.
- 8: – Real (Kind=nag_wp)Output
-
On intermediate exit:
the current value of the independent variable.
- 9: – IntegerOutput
-
On intermediate exit:
with
,
,
,
,
,
,
,
,
,
or
,
yrvcm specifies the locations of the dependent variables
for use in evaluating the differential system or the event functions.
- is given by , for .
- is given by , for .
- 10: – IntegerOutput
-
On intermediate exit:
with
,
,
,
,
,
or
,
yprvcm specifies the positions in
rwork at which you should place the derivatives
.
should be placed in location
, for
.
With
,
,
or
,
yprvcm specifies the locations of the derivatives
for use in evaluating the event functions.
is given by
, for
.
- 11: – Real (Kind=nag_wp)Input
-
On initial entry: need not be set.
On intermediate re-entry: with
,
,
or
,
grvcm must contain the value of
, where
is given by
kgrvcm.
- 12: – IntegerInput/Output
-
On intermediate re-entry: with
,
,
or
,
kgrvcm must remain unchanged from a previous call to
d02qgf.
On intermediate exit:
with
,
,
or
,
kgrvcm specifies which event function
you must evaluate.
- 13: – Real (Kind=nag_wp) arrayCommunication Array
-
This
must be the same argument
rwork as supplied to
d02qwf. It is used to pass information from
d02qwf to
d02qgf, and from
d02qgf to
d02qxf,
d02qyf and
d02qzf. Therefore the contents of this array
must not be changed before the call to
d02qgf or calling any of the routines
d02qxf,
d02qyf and
d02qzf.
- 14: – IntegerInput
-
On initial entry: the dimension of the array
rwork as declared in the (sub)program from which
d02qgf is called.
This must be the same argument
lrwork as supplied to
d02qwf.
- 15: – Integer arrayCommunication Array
-
This
must be the same argument
iwork as supplied to
d02qwf. It is used to pass information from
d02qwf to
d02qgf, and from
d02qgf to
d02qxf,
d02qyf and
d02qzf. Therefore the contents of this array
must not be changed before the call to
d02qgf or calling any of the routines
d02qxf,
d02qyf and
d02qzf.
- 16: – IntegerInput
-
On initial entry: the dimension of the array
iwork as declared in the (sub)program from which
d02qgf is called.
This must be the same argument
liwork as supplied to
d02qwf.
- 17: – IntegerInput/Output
-
On initial entry:
ifail must be set to
,
. If you are unfamiliar with this argument you should refer to
Section 3.4 in How to Use the NAG Library and its Documentation for details.
For environments where it might be inappropriate to halt program execution when an error is detected, the value
is recommended. If the output of error messages is undesirable, then the value
is recommended. Otherwise, because for this routine the values of the output arguments may be useful even if
on exit, the recommended value is
.
When the value is used it is essential to test the value of ifail on exit.
On final exit:
unless the routine detects an error or a warning has been flagged (see
Section 6).
6
Error Indicators and Warnings
If on entry
or
, explanatory error messages are output on the current error message unit (as defined by
x04aaf).
Errors or warnings detected by the routine:
-
On entry, the integrator detected an illegal input, or
d02qwf has not been called before the call to the integrator.
This error may be caused by overwriting elements of
rwork and
iwork.
-
The maximum number of steps has been attempted (at a cost of about
derivative evaluations per step). (See argument
maxstp in
d02qwf.) If integration is to be continued then you need only reset
ifail and call the routine again and a further
maxstp steps will be attempted.
-
The step size needed to satisfy the error requirements is too small for the
machine precision being used. (See argument
tolfac in
d02qxf.)
-
Some error weight
became zero during the integration (see arguments
vectol,
rtol and
atol in
d02qwf.) Pure relative error control (
) was requested on a variable (the
th) which has now become zero. (See argument
badcmp in
d02qxf.) The integration was successful as far as
t.
-
The problem appears to be stiff (see the
D02 Chapter Introduction for a discussion of the term ‘stiff’). Although it is inefficient to use this integrator to solve stiff problems, integration may be continued by resetting
ifail and calling the routine again.
-
A change in sign of an event function has been detected but the root-finding process appears to have converged to a singular point
t rather than a root. Integration may be continued by resetting
ifail and calling the routine again.
-
The code has detected two successive error exits at the current value of
t and cannot proceed. Check all input variables.
An unexpected error has been triggered by this routine. Please
contact
NAG.
See
Section 3.9 in How to Use the NAG Library and its Documentation for further information.
Your licence key may have expired or may not have been installed correctly.
See
Section 3.8 in How to Use the NAG Library and its Documentation for further information.
Dynamic memory allocation failed.
See
Section 3.7 in How to Use the NAG Library and its Documentation for further information.
7
Accuracy
The accuracy of integration is determined by the arguments
vectol,
rtol and
atol in a prior call to
d02qwf. Note that only the local error at each step is controlled by these arguments. The error estimates obtained are not strict bounds but are usually reliable over one step. Over a number of steps the overall error may accumulate in various ways, depending on the properties of the differential equation system. The code is designed so that a reduction in the tolerances should lead to an approximately proportional reduction in the error. You are strongly recommended to call
d02qgf with more than one set of tolerances and to compare the results obtained to estimate their accuracy.
The accuracy obtained depends on the type of error test used. If the solution oscillates around zero a relative error test should be avoided, whereas if the solution is exponentially increasing an absolute error test should not be used. If different accuracies are required for different components of the solution then a component-wise error test should be used. For a description of the error test see the specifications of the arguments
vectol,
rtol and
atol in the routine document for
d02qwf.
The accuracy of any roots located will depend on the accuracy of integration and may also be restricted by the numerical properties of . When evaluating you should try to write the code so that unnecessary cancellation errors will be avoided.
8
Parallelism and Performance
d02qgf is not thread safe and should not be called from a multithreaded user program. Please see
Section 3.12.1 in How to Use the NAG Library and its Documentation for more information on thread safety.
d02qgf is not threaded in any implementation.
If
d02qgf fails with
then the combination of
atol and
rtol may be so small that a solution cannot be obtained, in which case the routine should be called again with larger values for
rtol and/or
atol (see
d02qwf). If the accuracy requested is really needed then you should consider whether there is a more fundamental difficulty. For example:
(a) |
in the region of a singularity the solution components will usually be of a large magnitude. d02qgf could be used in one-step mode to monitor the size of the solution with the aim of trapping the solution before the singularity. In any case numerical integration cannot be continued through a singularity, and analytical treatment may be necessary; |
(b) |
for ‘stiff’ equations, where the solution contains rapidly decaying components, the routine will require a very small step size to preserve stability. This will usually be exhibited by excessive computing time and sometimes an error exit with , but usually an error exit with or . The Adams' methods are not efficient in such cases and you should consider using a routine from the Sub-chapter D02M–N. A high proportion of failed steps (see argument nfail in d02qxf) may indicate stiffness but there may be other reasons for this phenomenon. |
d02qgf can be used for producing results at short intervals (for example, for graph plotting); you should set
and
tcrit to the last output point required in a prior call to
d02qwf and then set
tout appropriately for each output point in turn in the call to
d02qgf.
10
Example
This example solves the following system (for a projectile)
over an interval
starting with values
,
and
using scalar error control (
) until the first point where
is encountered.
Also, d02qgf is used to produce output at intervals of .
10.1
Program Text
Program Text (d02qgfe.f90)
10.2
Program Data
Program Data (d02qgfe.d)
10.3
Program Results
Program Results (d02qgfe.r)