NAG CL Interface
d01dac (dim2_​fin)

1 Purpose

d01dac attempts to evaluate a double integral to a specified absolute accuracy by repeated applications of the method described by Patterson (1968) and Patterson (1969).

2 Specification

#include <nag.h>
void  d01dac (double ya, double yb,
double (*phi1)(double y, Nag_Comm *comm),
double (*phi2)(double y, Nag_Comm *comm),
double (*f)(double x, double y, Nag_Comm *comm),
double absacc, double *ans, Integer *npts, Nag_Comm *comm, NagError *fail)
The function may be called by the names: d01dac, nag_quad_dim2_fin or nag_quad_2d_fin.

3 Description

d01dac attempts to evaluate a definite integral of the form
I= ab ϕ1y ϕ2y fx,y dx dy  
where a and b are constants and ϕ1y and ϕ2y are functions of the variable y.
The integral is evaluated by expressing it as
I=abFydy,   where  Fy= ϕ1y ϕ2y fx,ydx.  
Both the outer integral I and the inner integrals Fy are evaluated by the method, described by Patterson (1968) and Patterson (1969), of the optimum addition of points to Gauss quadrature formulae.
This method uses a family of interlacing common point formulae. Beginning with the 3-point Gauss rule, formulae using 7, 15, 31, 63, 127 and finally 255 points are derived. Each new formula contains all the points of the earlier formulae so that no function evaluations are wasted. Each integral is evaluated by applying these formulae successively until two results are obtained which differ by less than the specified absolute accuracy.

4 References

Patterson T N L (1968) On some Gauss and Lobatto based integration formulae Math. Comput. 22 877–881
Patterson T N L (1969) The optimum addition of points to quadrature formulae, errata Math. Comput. 23 892

5 Arguments

1: ya double Input
On entry: a, the lower limit of the integral.
2: yb double Input
On entry: b, the upper limit of the integral. It is not necessary that a<b.
3: phi1 function, supplied by the user External Function
phi1 must return the lower limit of the inner integral for a given value of y.
The specification of phi1 is:
double  phi1 (double y, Nag_Comm *comm)
1: y double Input
On entry: the value of y for which the lower limit must be evaluated.
2: comm Nag_Comm *
Pointer to structure of type Nag_Comm; the following members are relevant to phi1.
userdouble *
iuserInteger *
pPointer 
The type Pointer will be void *. Before calling d01dac you may allocate memory and initialize these pointers with various quantities for use by phi1 when called from d01dac (see Section 3.1.1 in the Introduction to the NAG Library CL Interface).
Note: phi1 should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by d01dac. If your code inadvertently does return any NaNs or infinities, d01dac is likely to produce unexpected results.
4: phi2 function, supplied by the user External Function
phi2 must return the upper limit of the inner integral for a given value of y.
The specification of phi2 is:
double  phi2 (double y, Nag_Comm *comm)
1: y double Input
On entry: the value of y for which the upper limit must be evaluated.
2: comm Nag_Comm *
Pointer to structure of type Nag_Comm; the following members are relevant to phi2.
userdouble *
iuserInteger *
pPointer 
The type Pointer will be void *. Before calling d01dac you may allocate memory and initialize these pointers with various quantities for use by phi2 when called from d01dac (see Section 3.1.1 in the Introduction to the NAG Library CL Interface).
Note: phi2 should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by d01dac. If your code inadvertently does return any NaNs or infinities, d01dac is likely to produce unexpected results.
5: f function, supplied by the user External Function
f must return the value of the integrand f at a given point.
The specification of f is:
double  f (double x, double y, Nag_Comm *comm)
1: x double Input
2: y double Input
On entry: the coordinates of the point x,y at which the integrand f must be evaluated.
3: comm Nag_Comm *
Pointer to structure of type Nag_Comm; the following members are relevant to f.
userdouble *
iuserInteger *
pPointer 
The type Pointer will be void *. Before calling d01dac you may allocate memory and initialize these pointers with various quantities for use by f when called from d01dac (see Section 3.1.1 in the Introduction to the NAG Library CL Interface).
Note: f should not return floating-point NaN (Not a Number) or infinity values, since these are not handled by d01dac. If your code inadvertently does return any NaNs or infinities, d01dac is likely to produce unexpected results.
6: absacc double Input
On entry: the absolute accuracy requested.
7: ans double * Output
On exit: the estimated value of the integral.
8: npts Integer * Output
On exit: the total number of function evaluations.
9: comm Nag_Comm *
The NAG communication argument (see Section 3.1.1 in the Introduction to the NAG Library CL Interface).
10: fail NagError * Input/Output
The NAG error argument (see Section 7 in the Introduction to the NAG Library CL Interface).

6 Error Indicators and Warnings

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_BAD_PARAM
On entry, argument value had an illegal value.
NE_CONVERGENCE
The outer integral has converged, but n of the inner integrals have not converged with 255 points: n=value. ans may still contain an approximate estimate of the integral, but its reliability will decrease as n increases.
The outer integral has not converged, and n of the inner integrals have not converged with 255 points: n=value. ans may still contain an approximate estimate of the integral, but its reliability will decrease as n increases.
The outer integral has not converged with 255 points. However, all the inner integrals have converged, and ans may still contain an approximate estimate of the integral.
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_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.

7 Accuracy

The absolute accuracy is specified by the variable absacc. If, on exit, fail.code= NE_NOERROR then the result is most likely correct to this accuracy. Even if fail.code= NE_CONVERGENCE on exit, it is still possible that the calculated result could differ from the true value by less than the given accuracy.

8 Parallelism and Performance

d01dac is threaded by NAG for parallel execution in multithreaded implementations of the NAG Library.
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.

9 Further Comments

The time taken by d01dac depends upon the complexity of the integrand and the accuracy requested.
With Patterson's method accidental convergence may occasionally occur, when two estimates of an integral agree to within the requested accuracy, but both estimates differ considerably from the true result. This could occur in either the outer integral or in one or more of the inner integrals.
If it occurs in the outer integral then apparent convergence is likely to be obtained with considerably fewer integrand evaluations than may be expected. If it occurs in an inner integral, the incorrect value could make the function Fy appear to be badly behaved, in which case a very large number of pivots may be needed for the overall evaluation of the integral. Thus both unexpectedly small and unexpectedly large numbers of integrand evaluations should be considered as indicating possible trouble. If accidental convergence is suspected, the integral may be recomputed, requesting better accuracy; if the new request is more stringent than the degree of accidental agreement (which is of course unknown), improved results should be obtained. This is only possible when the accidental agreement is not better than machine accuracy. It should be noted that the function requests the same accuracy for the inner integrals as for the outer integral. In practice it has been found that in the vast majority of cases this has proved to be adequate for the overall result of the double integral to be accurate to within the specified value.
The function is not well-suited to non-smooth integrands, i.e., integrands having some kind of analytic discontinuity (such as a discontinuous or infinite partial derivative of some low-order) in, on the boundary of, or near, the region of integration. Warning: such singularities may be induced by incautiously presenting an apparently smooth interval over the positive quadrant of the unit circle, R
I=Rx+ydx dy.  
This may be presented to d01dac as
I=01 dy 01-y2 x+ydx=01 121-y2+y1-y2 dy  
but here the outer integral has an induced square-root singularity stemming from the way the region has been presented to d01dac. This situation should be avoided by re-casting the problem. For the example given, the use of polar coordinates would avoid the difficulty:
I=01dr0π2r2cosυ+sinυdυ.  

10 Example

This example evaluates the integral discussed in Section 9, presenting it to d01dac first as
01 01-y2x+y dx dy  
and then as
010π2r2cosυ+sinυdυ dr.  
Note the difference in the number of function evaluations.

10.1 Program Text

Program Text (d01dace.c)

10.2 Program Data

None.

10.3 Program Results

Program Results (d01dace.r)