
          S -- Approximations of Special Functions        Introduction -- S
                                     Chapter S
                        Approximations of Special Functions

          1. Scope of the Chapter

          This chapter is concerned with the provision of some commonly
          occurring physical and mathematical functions.

          2. Background to the Problems

          The majority of the routines in this chapter approximate real-
          valued functions of a single real argument, and the techniques
          involved are described in Section 2.1. In addition the chapter
          contains routines for elliptic integrals (see Section 2.2),
          Bessel and Airy functions of a complex argument (see Section 2.3)
          , and exponential of a complex argument.

          2.1. Functions of a Single Real Argument

          Most of the routines for functions of a single real argument have
          been based on truncated Chebyshev expansions. This method of
          approximation was adopted as a compromise between the conflicting
          requirements of efficiency and ease of implementation on many
          different machine ranges. For details of the reasons behind this
          choice and the production and testing procedures followed in
          constructing this chapter see Schonfelder [7].

          Basically if the function to be approximated is f(x), then for
          xis in  [a,b] an approximation of the form


                                          --'
                                f(x)=g(x) >  C T (t)
                                          --  r r
                                          r=0

                     --'
          is used, ( >  denotes, according to the usual convention, a
                     --
          summation in which the first term is halved), where g(x) is some
          suitable auxiliary function which extracts any singularities,
          asymptotes and, if possible, zeros of the function in the range
          in question and t=t(x) is a mapping of the general range [a,b] to
          the specific range [-1,+1] required by the Chebyshev polynomials,
          T (t). For a detailed description of the properties of the
           r
          Chebyshev polynomials see Clenshaw [5] and Fox and Parker [6].

          The essential property of these polynomials for the purposes of
          function approximation is that T (t) oscillates between +-1 and
                                          n
          it takes its extreme values n+1 times in the interval [-1,+1].
          Therefore, provided the coefficients C  decrease in magnitude
                                                r
          sufficiently rapidly the error made by truncating the Chebyshev
          expansion after n terms is approximately given by


                                    E(t)~=C T (t)
                                           n n

          That is the error oscillates between +-C  and takes its extreme
                                                  n
          value n+1 times in the interval in question. Now this is just the
          condition that the approximation be a mini-max representation,
          one which minimizes the maximum error. By suitable choice of the
          interval, [a,b], the auxiliary function, g(x), and the mapping of
          the independent variable, t(x), it is almost always possible to
          obtain a Chebyshev expansion with rapid convergence and hence
          truncations that provide near mini-max polynomial approximations
          to the required function. The difference between the true mini-
          max polynomial and the truncated Chebyshev expansion is seldom
          sufficiently great to be of significance.

          The evaluation of the Chebyshev expansions follows one of two
          methods. The first and most efficient, and hence most commonly
          used, works with the equivalent simple polynomial. The second
          method, which is used on the few occasions when the first method
          proves to be unstable, is based directly on the truncated
          Chebyshev series and uses backward recursion to evaluate the sum.
          For the first method, a suitably truncated Chebyshev expansion
          (truncation is chosen so that the error is less than the machine
          precision) is converted to the equivalent simple polynomial. That
          is we evaluate the set of coefficients b  such that
                                                  r

                                   n-1      n-1
                                   --    r  --'
                             y(t)= >  b t = >  C T (t).
                                   --  r    --  r r
                                   r=0      r=0

          The polynomial can then be evaluated by the efficient Horner's
          method of nested multiplications,

                     y(t)=(b +t(b +t(b +...t(b   +tb   )))...).
                            0    1    2       n-2   n-1

          This method of evaluation results in efficient routines but for
          some expansions there is considerable loss of accuracy due to
          cancellation effects. In these cases the second method is used.
          It is well known that if

                        b    =C
                         n-1   n-1

                        b    =2tb   +C
                         n-2     n-1  n-2

                        b  =2tb   -b   +C ,  j=n-3,n-4,...,0
                         j     j+1  j+2  j

          then

                                --'         1
                                >  C T (t)= -(b -b )
                                --  r r     2  0  2
                                r=0

          and this is always stable. This method is most efficiently
          implemented by using three variables cyclically and explicitly
          constructing the recursion.

          That is,

                        (alpha) = C
                                   n-1
                        (beta) = 2t(alpha)+C
                                            n-2
                        (gamma) = 2t(beta)-(alpha)+C
                                                    n-3
                        (alpha) = 2t(gamma)-(beta)+C
                                                    n-4
                        (beta) = 2t(alpha)-(gamma)+C
                                                    n-5
                          ...
                          ...
                        (alpha) = 2t(gamma)-(beta)+C   (say)
                                                    2
                        (beta) = 2t(alpha)-(gamma)+C
                                                    1
                                                1
                        y(t) = t(beta)-(alpha)+ -C
                                                2 0

          The auxiliary functions used are normally functions compounded of
          simple polynomial (usually linear) factors extracting zeros, and
          the primary compiler-provided functions, sin, cos, ln, exp, sqrt,
          which extract singularities and/or asymptotes or in some cases
          basic oscillatory behaviour, leaving a smooth well-behaved
          function to be approximated by the Chebyshev expansion which can
          therefore be rapidly convergent.

          The mappings of [a,b] to [-1,+1] used, range from simple linear
          mappings to the case when b is infinite and considerable
          improvement in convergence can be obtained by use of a bilinear
          form of mapping. Another common form of mapping is used when the
          function is even, that is it involves only even powers in its
          expansion. In this case an approximation over the whole interval
                                                    (x)2
          [-a,a] can be provided using a mapping t=2(-) -1. This embodies
                                                    (a)
          the evenness property but the expansion in t involves all powers
          and hence removes the necessity of working with an expansion with
          half its coefficients zero.

          For many of the routines an analysis of the error in principle is
          given, viz, if E and (nabla) are the absolute errors in function
          and argument and (epsilon) and (delta) are the corresponding
          relative errors, then

                                  E~=|f'(x)|(nabla)

                                 E~=|xf'(x)|(delta)

                                        | xf'(x)|
                             (epsilon)~=| ------|(delta)
                                        |  f(x) |

          If we ignore errors that arise in the argument of the function by
          propagation of data errors etc and consider only those errors
          that result from the fact that a real number is being represented
          in the computer in floating-point form with finite precision,
          then (delta) is bounded and this bound is independent of the
          magnitude of x; e.g. on an 11-digit machine

                                               -11
                                  |(delta)|<=10   .

          (This of course implies that the absolute error (nabla)=x(delta)
          is also bounded but the bound is now dependent on x). However
          because of this the last two relations above are probably of more
          interest. If possible the relative error propagation is
          discussed; that is the behaviour of the error amplification
          factor |xf'(x)/f(x)| is described, but in some cases, such as
          near zeros of the function which cannot be extracted explicitly,
          absolute error in the result is the quantity of significance and
          here the factor |xf'(x)| is described. In general, testing of the
          functions has shown that their error behaviour follows fairly
          well these theoretical error behaviours. In regions, where the
          error amplification factors are less than or of the order of one,
          the errors are slightly larger than the above predictions. The
          errors are here limited largely by the finite precision of
          arithmetic in the machine but (epsilon) is normally no more than
          a few times greater than the bound on (delta). In regions where
          the amplification factors are large, order of ten or greater, the
          theoretical analysis gives a good measure of the accuracy
          obtainable.

          It should be noted that the definitions and notations used for
          the functions in this chapter are all taken from Abramowitz and
          Stegun [1]. Users are strongly recommended to consult this book
          for details before using the routines in this chapter.

          2.2. Approximations to Elliptic Integrals

          The functions provided here are symmetrised variants of the
          classic elliptic integrals. These alternative definitions have
          been suggested by Carlson (see [2], [3] and [4]) and he also
          developed the basic algorithms used in this chapter.

          The standard integral of the first kind is represented by


                                     infty
                                   1 /            dt
                        R (x,y,z)= - |     -----------------
                         F         2 /       
                                     0     \/(t+x)(t+y)(t+z)

          where x,y,z>=0 and at most one may be equal to zero.

                                     1
          The normalisation factor,  -, is chosen so as to make
                                     2

                                                

                                  R (x,x,x)=1/\/x.
                                   F

          If any two of the variables are equal, R  degenerates into the
                                                  F
          second function


                                             infty
                                           1 /         dt
                        R (x,y)=R (x,y,y)= - |     ----------
                         C       F         2 /       
                                             0     \/t+x(t+y)

          where the argument restrictions are now x>=0 and y/=0.

          This function is related to the logarithm or inverse hyperbolic
          functions if 0<y<x, and to the inverse circular functions if
          0<=x<=y.

          The integrals of the second kind are defined by

                                    infty
                                  3 /             dt
                       R (x,y,z)= - |     -------------------
                        D         2 /        
                                    0       /               3
                                          \/ (t+x)(t+y)(t+z)

          with z>0, x>=0 and y>=0 but only one of x or y may be zero.

          The function is a degenerate special case of the integral of the
          third kind

                                   infty
                                 3 /                  dt
                R (x,y,z,(rho))= - |     ----------------------------
                 J               2 /     (                 )
                                   0     (\/(t+x)(t+y)(t+z))(t+(rho))

          with (rho)/=0, x,y,z>=0 with at most one equality holding. Thus
          R (x,y,z)=R (x,y,z,z). The normalisation of both these functions
           D         J
          is chosen so that

                                                       

                           R (x,x,x)=R (x,x,x,x)=1/(x\/x)
                            D         J

          The algorithms used for all these functions are based on
          duplication theorems. These allow a recursion system to be
          established which constructs a new set of arguments from the old
          using a combination of arithmetic and geometric means. The value
          of the function at the original arguments can then be simply
          related to the value at the new arguments. These recursive
          reductions are used until the arguments differ from the mean by
          an amount small enough for a Taylor series about the mean to give
          sufficient accuracy when retaining terms of order less than six.
          Each step of the recurrences reduces the difference from the mean
          by a factor of four, and as the truncation error is of order six,
                                               -n
          the truncation error goes like (4096)  , where n is the number of
          iterations.

          The above forms can be related to the more traditional canonical
          forms (see Abramowitz and Stegun [1], 17.2).

                           2               2               2
          If we write q=cos (phi),r=1-m.sin (phi),s=1+n.sin (phi), where
                    1
          0<(phi)<= -(pi), we have: the elliptic integral of the first
                    2
          kind:

                        sin(phi)      -1/2      1-/2
                        /           2         2
            F((phi)|m)= |       (1-t )   (1-mt )   dt=sin(phi).R (q,r,1);
                        /                                       F
                        0

          the elliptic integral of the second kind:

                                 sin(phi)      -1/2      -1/2
                                 /           2         2
                   E((phi)|m) =  |       (1-t )   (1-mt )  dt
                                 /
                                 0
                                                    1     3
                              = sin(phi).R (q,r,1)- -m.sin (phi).R (q,r,1)
                                          F         3             D

          the elliptic integral of the third kind:

                                 sin(phi)      -1/2      -1/2
                                 /           2         2         2 -1
              (Pi)(n;(phi)|m) =  |       (1-t )   (1-mt )   (1+nt )  dt
                                 /
                                 0
                                                    1     3
                              =sin(phi).R (q,r,1)- -n.sin (phi).R (q,r,1,s)
                                         F         3             J

          Also the complete elliptic integral of the first kind:

                      (pi)/2
                      /             2       -1/2
                K(m)= |     (1-m.sin (theta))   d(theta)=R (0,1-m,1);
                      /                                   F
                      0

          the complete elliptic integral of the second kind:


                (pi)/2
                /         2        1/2                     1
          E(m)= | (1-m.sin (theta))  d(theta)=R (0,1-m,1)- -mR (0,1-m,1).
                /                              F           3  D
                0


          2.3. Bessel and Airy Functions of a Complex Argument

          The routines for Bessel and Airy functions of a real argument are
          based on Chebyshev expansions, as described in Section 2.1. The
          routines for functions of a complex argument, however, use
          different methods. These routines relate all functions to the
          modified Bessel functions I    (z) and K    (z) computed in the
                                     (nu)         (nu)
          right-half complex plane, including their analytic continuations.
          I     and K     are computed by different methods according to
           (nu)      (nu)
          the values of zand (nu). The methods include power series,
          asymptotic expansions and Wronskian evaluations. The relations
          between functions are based on well known formulae (see
          Abramowitz and Stegun [1]).

          2.4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Carlson B C (1977) Special Functions of Applied Mathematics.
                Academic Press.

          [3]   Carlson B C (1965) On Computing Elliptic Integrals and
                Functions. J Math Phys. 44 36--51.

          [4]   Carlson B C (1977) Elliptic Integrals of the First Kind.
                SIAM J Math Anal. 8 231--242.

          [5]   Clenshaw C W (1962) Mathematical Tables. Chebyshev Series
                for Mathematical Functions. HMSO.

          [6]   Fox L and Parker I B (1968) Chebyshev Polynomials in
                Numerical Analysis. Oxford University Press.

          [7]   Schonfelder J L (1976 ) The Production of Special Function
                Routines for a Multi-Machine Library. Software Practice and
                Experience. 6(1)

          3. Recommendations on Choice and Use of Routines

          3.1. Elliptic Integrals

          IMPORTANT ADVICE: users who encounter elliptic integrals in the
          course of their work are strongly recommended to look at
          transforming their analysis directly to one of the Carlson forms,
          rather than the traditional canonical Legendre forms. In general,
          the extra symmetry of the Carlson forms is likely to simplify the
          analysis, and these symmetric forms are much more stable to
          calculate.

          The routine S21BAF for R  is largely included as an auxiliary to
                                  C
          the other routines for elliptic integrals. This integral
          essentially calculates elementary functions, e.g.


                                        (( 1+x)2  )
                            lnx=(x-1).R (( ---) ,x),x>0;
                                       C((  2 )   )

                                            2
                            arcsinx=x.R (1-x ,1),|x|<=1;
                                       C

                                              2
                             arcsinhx=x.R (1+x ,1),  etc
                                         C

          In general this method of calculating these elementary functions
          is not recommended as there are usually much more efficient
          specific routines available in the Library. However, S21BAF may
          be used, for example, to compute lnx/(x-1) when x is close to 1,
          without the loss of significant figures that occurs when lnx and
          x-1 are computed separately.

          3.2. Bessel and Airy Functions

          For computing the Bessel functions J    (x), Y    (x), I    (x)
                                              (nu)      (nu)      (nu)
          and K    (x) where x is real and (nu)=0 or 1, special routines
               (nu)
          are provided, which are much faster than the more general
          routines that allow a complex argument and arbitrary real (nu)>=0
          functions and their derivatives Ai(x), Bi(x), Ai'(x), Bi'(x) for
          a real argument which are much faster than the routines for
          complex arguments.

          3.3. Index

          Airy function, Ai, real argument                           S17AGF
          Airy function, Ai', real argument                          S17AJF
          Airy function, Ai or Ai', complex argument, optionally     S17DGF
          scaled
          Airy function, Bi, real argument                           S17AHF
          Airy function, Bi', real argument                          S17AKF
          Airy function, Bi or Bi', complex argument, optionally     S17DHF
          scaled
          Bessel function, J , real argument                         S17AEF
                            0
          Bessel function, J , real argument                         S17AFF
                            1
          Bessel function, J    , complex argument, optionally       S17DEF
                            (nu)
          scaled
          Bessel function, Y , real argument                         S17ACF
                            0
          Bessel function, Y , real argument                         S17ADF
                            1
          Bessel function, Y    , complex argument, optionally       S17DCF
                            (nu)
          scaled
          Complement of the Error function                           S15ADF
          Cosine Integral                                            S13ACF
          Elliptic integral, symmetrised, degenerate of 1st kind,    S21BAF
          R
           C
          Elliptic integral, symmetrised, of 1st kind, R             S21BBF
                                                        F
          Elliptic integral, symmetrised, of 2nd kind, R             S21BCF
                                                        D
          Elliptic integral, symmetrised, of 3rd kind, R             S21BDF
                                                        J
          Erf, real argument                                         S15AEF
          Erfc, real argument                                        S15ADF
          Error function                                             S15AEF
          Exponential, complex                                       S01EAF
          Exponential Integral                                       S13AAF
          Fresnel Integral, C                                        S20ADF
          Fresnel Integral, S                                        S20ACF
          Gamma function                                             S14AAF
          Gamma function, incomplete                                 S14BAF
          Generalized Factorial function                             S14AAF
                           (1)      (2)
          Hankel function H     or H    , complex argument,          S17DLF
                           (nu)     (nu)
          optionally scaled
          Incomplete Gamma function                                  S14BAF
          Jacobian elliptic functions, sn, cn, dn                    S21CAF
          Kelvin function, bei x                                     S19ABF
          Kelvin function, ber x                                     S19AAF
          Kelvin function, kei x                                     S19ADF
          Kelvin function, ker x                                     S19ACF
          Logarithm of Gamma function                                S14ABF
          Modified Bessel function, I , real argument                S18AEF
                                     0
          Modified Bessel function, I , real argument                S18AFF
                                     1
          Modified Bessel function, I    , complex argument,         S18DEF
                                     (nu)
          optionally scaled
          Modified Bessel function, K , real argument                S18ACF
                                     0
          Modified Bessel function, K , real argument                S18ADF
                                     1
          Modified Bessel function, K    , complex argument,         S18DCF
                                     (nu)
          optionally scaled
          Sine integral                                              S13ADF


          S -- Approximations of Special Functions            Contents -- S
          Chapter S

          Approximations of Special Functions

                                        z
          S01EAF  Complex exponential, e

          S13AAF  Exponential integral E (x)
                                        1

          S13ACF  Cosine integral Ci(x)

          S13ADF  Sine integral Si(x)

          S14AAF  Gamma function

          S14ABF  Log Gamma function

          S14BAF  Incomplete gamma functions P(a,x) and Q(a,x)

          S15ADF  Complement of error function erfc x

          S15AEF  Error function erf x

          S17ACF  Bessel function Y (x)
                                   0

          S17ADF  Bessel function Y (x)
                                   1

          S17AEF  Bessel function J (x)
                                   0

          S17AFF  Bessel function J (x)
                                   1

          S17AGF  Airy function Ai(x)

          S17AHF  Airy function Bi(x)

          S17AJF  Airy function Ai'(x)

          S17AKF  Airy function Bi'(x)

          S17DCF  Bessel functions Y      (z), real a>=0, complex z,
                                    (nu)+a
                  (nu)=0,1,2,...

          S17DEF  Bessel functions J      (z), real a>=0, complex z,
                                    (nu)+a
                  (nu)=0,1,2,...

          S17DGF  Airy functions Ai(z) and Ai'(z), complex z

          S17DHF  Airy functions Bi(z) and Bi'(z), complex z

                                    (j)
          S17DLF  Hankel functions H      (z), j=1,2, real a>=0, complex z,
                                    (nu)+a
                  (nu)=0,1,2,...

          S18ACF  Modified Bessel function K (x)
                                            0

          S18ADF  Modified Bessel function K (x)
                                            1

          S18AEF  Modified Bessel function I (x)
                                            0

          S18AFF  Modified Bessel function I (x)
                                            1

          S18DCF  Modified Bessel functions K      (z), real a>=0, complex
                                             (nu)+a
                  z, (nu)=0,1,2,...

          S18DEF  Modified Bessel functions I      (z), real a>=0, complex
                                             (nu)+a
                  z, (nu)=0,1,2,...

          S19AAF  Kelvin function ber x

          S19ABF  Kelvin function bei x

          S19ACF  Kelvin function ker x

          S19ADF  Kelvin function kei x

          S20ACF  Fresnel integral S(x)

          S20ADF  Fresnel integral C(x)

          S21BAF  Degenerate symmetrised elliptic integral of 1st kind
                  R (x,y)
                   C

          S21BBF  Symmetrised elliptic integral of 1st kind R (x,y,z)
                                                             F

          S21BCF  Symmetrised elliptic integral of 2nd kind R (x,y,z)
                                                             D

          S21BDF  Symmetrised elliptic integral of 3rd kind R (x,y,z,r)
                                                             J
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S01 -- Approximations of Special Functions                 S01EAF
                  S01EAF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

                                                     z
          S01EAF evaluates the exponential function e , for complex z.

          2. Specification

                 COMPLEX(KIND(1.0D0)) FUNCTION S01EAF (Z, IFAIL)
                 INTEGER                               IFAIL
                 COMPLEX(KIND(1.0D0))                  Z

          3. Description

                                                           z
          This routine evaluates the exponential function e , taking care
          to avoid machine overflow, and giving a warning if the result
          cannot be computed to more than half precision. The function is
                        z  x
          evaluated as e =e (cosy+isiny), where x and y are the real and
          imaginary parts respectively of z.

          Since cosy and siny are less than or equal to 1 in magnitude, it
                            x                        x         x
          is possible that e  may overflow although e cosy or e siny does
                                                               x+ln|cosy|
          not. In this case the alternative formula sign(cosy)e
          is used for the real part of the result, and
                     x+ln|siny|
          sign(siny)e           for the imaginary part. If either part of
          the result still overflows, a warning is returned through
          parameter IFAIL.

          If Im z is too large, precision may be lost in the evaluation of
          siny and cosy. Again, a warning is returned through IFAIL.

          4. References

          None.

          5. Parameters

           1:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument z of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               The real part of the result overflows, and is set to the
               largest safe number with the correct sign. The imaginary
               part of the result is meaningful.

          IFAIL= 2
               The imaginary part of the result overflows, and is set to
               the largest safe number with the correct sign. The real part
               of the result is meaningful.

          IFAIL= 3
               Both real and imaginary parts of the result overflow, and
               are set to the largest safe number with the correct signs.

          IFAIL= 4
               The computed result is accurate to less than half precision,
               due to the size of Im z.

          IFAIL= 5
               The computed result has no precision, due to the size of Im
               z, and is set to zero.

          7. Accuracy

          Accuracy is limited in general only by the accuracy of the
          Fortran intrinsic functions in the computation of siny, cosy and
           x
          e , where x=Re z, y=Im z. As y gets larger, precision will
          probably be lost due to argument reduction in the evaluation of
          the sine and cosine functions, until the warning error IFAIL = 4
                                           

          occurs when y gets larger than \/1/(epsilon), where (epsilon) is
          the machine precision. Note that on some machines, the intrinsic
          functions SIN and COS will not operate on arguments larger than
                  

          about \/1/(epsilon), and so IFAIL can never return as 4.

          In the comparatively rare event that the result is computed by
                                  x+ln|cosy|                x+ln|siny|
          the formulae sign(cosy)e           and sign(siny)e          , a
          further small loss of accuracy may be expected due to rounding
          errors in the logarithmic function.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument z from a file,
          evaluates the function at each value of z and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S13 -- Approximations of Special Functions                 S13AAF
                  S13AAF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S13AAF returns the value of the exponential integral E (x), via
                                                                1
          the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S13AAF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          The routine calculates an approximate value for

                                     infty
                                     /     e-u
                              E (x)= |     -  du , x>0.
                               1     /     u
                                     x

          For 0<x<=4, the approximation is based on the Chebyshev expansion

                                   --                        1
                   E (x)=y(t)-lnx= > 'a T (t)-lnx , where t= -x-1.
                    1              --  r r                   2
                                   r

          For x>4,

                                   -x       -x
                                  e        e   --'
                           E (x)= ---y(t)= --- >  a T (t),
                            1      x        x  --  r r
                                               r

                                                     11.25-x
                        where  t=-1.0+14.5/(x+3.25)= -------.
                                                     3.25+x

          In both cases, -1<=t<=+1.

          To guard against producing underflows, if x>x   the result is set
                                                       hi
          directly to zero. For the value x   see the Users' Note for your
                                           hi
          implementation.

          4. References

          [1]   Abramowitz M and Stegun I A (1965) Handbook of Mathematical
                Functions. Dover Publications. Ch. 26.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               Before entry, IFAIL must be assigned a value. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               Unless the routine detects an error (see Section 6), IFAIL
               contains 0 on exit.

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               The routine has been called with an argument less than or
               equal to zero for which the function is not defined. The
               result returned is zero.

          7. Accuracy

          If (delta) and (epsilon) are the relative errors in argument and
          result respectively, then in principle,

                                         |   -x         |
                                         |  e           |
                            |(epsilon)|~=| -----*(delta)|
                                         | E (x)        |
                                         |  1           |

          so the relative error in the argument is amplified in the result
                                -x
          by at least a factor e  /E (x). The equality should hold if
                                    1
          (delta) is greater than the machine precision ((delta) due to
          data errors etc) but if (delta) is simply a result of round-off
          in the machine representation, it is possible that an extra
          figure may be lost in internal calculation and round-off.

          The behaviour of this amplification factor is shown in Figure 1.


                                     Figure 1
                   Please see figure in printed Reference Manual

          It should be noted that, for small x, the amplification factor
          tends to zero and eventually the error in the result will be
          limited by machine precision.

          For large x,

                             (epsilon)~x(delta)=(Delta),

          the absolute error in the argument.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S13 -- Approximations of Special Functions                 S13ACF
                  S13ACF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S13ACF returns the value of the cosine integral

                                            x
                                            / cosu-1
                         Ci(x)=(gamma)+lnx+ | ------du,  x>0
                                            /   u
                                            0

          via the routine name, where (gamma) denotes Euler's constant.

          2. Specification

                 DOUBLE PRECISION FUNCTION S13ACF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          The routine calculates an approximate value for Ci(x).

          For 0<x<=16 it is based on the Chebyshev expansion

                                   --'              ( x )2
                        Ci(x)=lnx+ >   a T (t) , t=2( --) -1.
                                   --   r r         ( 16)
                                   r=0

          For 16<x<x   where the value of x   is given in the Users' Note
                    hi                     hi
          for your implementation,

                                     f(x)sinx  g(x)cosx
                              Ci(x)= --------- --------
                                        x          2
                                                  x

                      --'                   --'             ( 16)2
          where f(x)= >   f T (t) and g(x)= >   g T (t), t=2( --) -1.
                      --   r r              --   r r        ( x )
                      r=0                   r=0

          For x>=x  , Ci(x)=0 to within the accuracy possible (see Section
                  hi
          7).

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               The routine has been called with an argument less than or
               equal to zero for which the function is not defined. The
               result returned is zero.

          7. Accuracy

          If E and (epsilon) are the absolute and relative errors in the
          result and (delta) is the relative error in the argument then in
          principle these are related by

                                                     | (delta)cosx|
                 |E|~=|(delta)cosx| and |(epsilon)|~=| -----------|.
                                                     |    Ci(x)   |

          That is accuracy will be limited by machine precision near the
          origin and near the zeros of cosx, but near the zeros of Ci(x)
          only absolute accuracy can be maintained.

          The behaviour of this amplification is shown in Figure 1.


                                     Figure 1
                   Please see figure in printed Reference Manual

                                        sinx
          For large values of x, Ci(x)~ ---- therefore
                                         x
          (epsilon)~(delta)xcotx and since (delta) is limited by the finite
          precision of the machine it becomes impossible to return results
          which have any relative accuracy. That is, when x>=1/(delta) we
          have that |Ci(x)|<=1/x~E and hence is not significantly different
          from zero.

          Hence x   is chosen such that for values of x>=x  , Ci(x) in
                 hi                                       hi
          principle would have values less than the machine precision and
          so is essentially zero.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S13 -- Approximations of Special Functions                 S13ADF
                  S13ADF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S13ADF returns the value of the sine integral

                                         x
                                         / sinu
                                  Si(x)= | ----du,
                                         /  u
                                         0

          via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S13ADF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          The routine calculates an approximate value for Si(x).

          For |x|<=16.0 it is based on the Chebyshev expansion

                                 --'              ( x )2
                         Si(x)=x >   a T (t) , t=2( --) -1.
                                 --   r r         ( 16)
                                 r=0

          For 16<|x|<x  , where x   is an implementation dependent number,
                      hi         hi

                                   { (pi)  f(x)cosx  g(x)sinx}
                      Si(x)=sign(x){ ----- --------- --------}
                                   {  2       x          2   }
                                   {                    x    }

                      --'                   --'             ( 16)2
          where f(x)= >   f T (t) and g(x)= >   g T (t), t=2( --) -1.
                      --   r r              --   r r        ( x )
                      r=0                   r=0

                               1
          For |x|>=x  , Si(x)= -(pi)signx to within machine precision.
                    hi         2

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          There are no failure exits from this routine. The parameter IFAIL
          has been included for consistency with other routines in this
          chapter.

          7. Accuracy

          If (delta) and (epsilon) are the relative errors in the argument
          and result, respectively, then in principle

                                         | (delta)sinx|
                            |(epsilon)|~=| -----------|.
                                         |    Si(x)   |

          The equality may hold if (delta) is greater than the machine
          precision ((delta) due to data errors etc) but if (delta) is
          simply due to round-off in the machine representation, then since
          the factor relating (delta) to (epsilon) is always less than one,
          the accuracy will be limited by machine precision.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S14 -- Approximations of Special Functions                 S14AAF
                  S14AAF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S14AAF returns the value of the Gamma function (Gamma)(x), via
          the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S14AAF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Gamma function
          (Gamma)(x). The routine is based on the Chebyshev expansion:

                               --'
                 (Gamma)(1+u)= >   a T (t) , where 0<=u<1 , t=2u-1,
                               --   r r
                               r=0

          and uses the property (Gamma)(1+x)=x(Gamma)(x). If x=N+1+u where
          N is integral and 0<=u<1 then it follows that:

               for N>0  (Gamma)(x)=(x-1)(x-2)...(x-N)(Gamma)(1+u),

               for N=0  (Gamma)(x)=(Gamma)(1+u),

                                        (Gamma)(1+u)
               for N<0  (Gamma)(x)= ---------------------.
                                    x(x+1)(x+2)...(x-N-1)

          There are four possible failures for this routine:

               (i) if x is too large, there is a danger of overflow since
               (Gamma)(x) could become too large to be represented in the
               machine;

               (ii) if x is too large and negative, there is a danger of
               underflow;

               (iii) if x is equal to a negative integer, (Gamma)(x) would
               overflow since it has poles at such points;

               (iv) if x is too near zero, there is again the danger of
                                                                    1
               overflow on some machines. For small x, (Gamma)(x)~= -, and
                                                                    x
               on some machines there exists a range of non-zero but small
               values of x for which 1/x is larger than the greatest
               representable value.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X must
               not be a negative integer.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               The argument is too large. On soft failure the routine
               returns the approximate value of (Gamma)(x) at the nearest
               valid argument.

          IFAIL= 2
               The argument is too large and negative. On soft failure the
               routine returns zero.

          IFAIL= 3
               The argument is too close to zero. On soft failure the
               routine returns the approximate value of (Gamma)(x) at the
               nearest valid argument.

          IFAIL= 4
               The argument is a negative integer, at which value
               (Gamma)(x) is infinite. On soft failure the routine returns
               a large positive value.

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and the result respectively. If (delta) is somewhat larger than
          the machine precision (i.e., is due to data errors etc), then
          (epsilon) and (delta) are approximately related by:

                            (epsilon)~=|x(Psi)(x)|(delta)

          (provided (epsilon) is also greater than the representation
                                                         (Gamma)'(x)
          error). Here (Psi)(x) is the digamma function  -----------.
                                                         (Gamma)(x)
          Figure 1 shows the behaviour of the error amplification factor
          |x(Psi)(x)|.


                                     Figure 1
                   Please see figure in printed Reference Manual

          If (delta) is of the same order as machine precision, then
          rounding errors could make (epsilon) slightly larger than the
          above relation predicts.

          There is clearly a severe, but unavoidable, loss of accuracy for
          arguments close to the poles of (Gamma)(x) at negative integers.
          However relative accuracy is preserved near the pole at x=0 right
          up to the point of failure arising from the danger of overflow.

          Also accuracy will necessarily be lost as x becomes large since
          in this region

                               (epsilon)~=(delta)xlnx.

          However since (Gamma)(x) increases rapidly with x, the routine
          must fail due to the danger of overflow before this loss of
          accuracy is too great. (e.g. for x=20, the amplification factor
          ~= 60.)

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S14 -- Approximations of Special Functions                 S14ABF
                  S14ABF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S14ABF returns a value for the logarithm of the Gamma function,
          ln(Gamma)(x), via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S14ABF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to ln(Gamma)(x). It is
          based on two Chebyshev expansions.

          For 0<x<=x     , ln(Gamma)(x)=-lnx to within machine accuracy.
                    small

          For x     <x<=15.0, the recursive relation
               small
          (Gamma)(1+x)=x(Gamma)(x) is used to reduce the calculation to one
          involving (Gamma)(1+u), 0<=u<1 which is evaluated as:

                                       --'
                         (Gamma)(1+u)= >   a T (t),  t=2u-1.
                                       --   r r
                                       r=0

          Once (Gamma)(x) has been calculated, the required result is
          produced by taking the logarithm.

          For 15.0<x<=x   ,
                       big

                                       1        1
                      ln(Gamma)(x)=(x- -)lnx-x+ -ln2(pi)+y(x)/x
                                       2        2
                                           2
                      --'             ( 15)
          where y(x)= >   b T (t), t=2( --) -1.
                      --   r r        ( x )
                      r=0

          For x   <x<=x     the term y(x)/x is negligible and so its
               big     vbig
          calculation is omitted.

          For x>x     there is a danger of setting overflow so the routine
                 vbig
          must fail.

          For x<=0.0 the function is not defined and the routine fails.

          Note: x      is calculated so that if x<x     , (Gamma)(x)=1/x to
                 small                             small
          within machine accuracy. x    is calculated so that if x>x   ,
                                    big                             big

                                          1        1
                         ln(Gamma)(x)=(x- -)lnx-x+ -ln2(pi)
                                          2        2

          to within machine accuracy. x     is calculated so that
                                       vbig
          ln(Gamma)(x    ) is close to the value returned by X02ALF(*).
                     vbig

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X <= 0.0, the function is undefined. On soft failure, the
               routine returns zero.

          IFAIL= 2
               X is too large, the function would overflow. On soft
               failure, the routine returns the value of the function at
               the largest permissible argument.

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and result respectively, and E be the absolute error in the
          result.

          If (delta) is somewhat larger than the relative machine
          precision, then

                                                  |  x*(Psi)(x) |
            E~=|x*(Psi)(x)|(delta) and (epsilon)~=| ------------|(delta)
                                                  | ln(Gamma)(x)|

                                                  (Gamma)'(x)
          where (Psi)(x) is the digamma function  -----------. Figure 1 and
                                                  (Gamma)(x)
          Figure 2 show the behaviour of these error amplification factors.


                                     Figure 1
                   Please see figure in printed Reference Manual

                                     Figure 2
                   Please see figure in printed Reference Manual

          These show that relative error can be controlled, since except
          near x=1 or 2 relative error is attenuated by the function or at
          least is not greatly amplified.

                                  (    1 )
          For large x, (epsilon)~=(1+ ---)(delta) and for small x,
                                  (   lnx)
                       1
          (epsilon)~= ---(delta).
                      lnx

          The function ln(Gamma)(x) has zeros at x=1 and 2 and hence
          relative accuracy is not maintainable near those points. However
          absolute accuracy can still be provided near those zeros as is
          shown above.

          If however, (delta) is of the order of the machine precision,
          then rounding errors in the routine's internal arithmetic may
          result in errors which are slightly larger than those predicted
          by the equalities. It should be noted that even in areas where
          strong attenuation of errors is predicted the relative precision
          is bounded by the effective machine precision.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S14 -- Approximations of Special Functions                 S14BAF
                  S14BAF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S14BAF computes values for the incomplete gamma functions P(a,x)
          and Q(a,x).

          2. Specification

                 SUBROUTINE S14BAF (A, X, TOL, P, Q, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION A, X, TOL, P, Q

          3. Description

          This subroutine evaluates the incomplete gamma functions in the
          normalised form

                                              x
                                       1      / a-1 -t
                           P(a,x)= ---------- |t   e  dt,
                                   (Gamma)(a) /
                                              0

                                            infty
                                     1      /     a-1 -t
                         Q(a,x)= ---------- |    t   e  dt,
                                 (Gamma)(a) /
                                            x

          with x>=0 and a>0, to a user-specified accuracy. With this
          normalisation, P(a,x)+Q(a,x)=1.

          Several methods are used to evaluate the functions depending on
          the arguments a and x, the methods including Taylor expansion for
          P(a,x), Legendre's continued fraction for Q(a,x), and power
          series for Q(a,x). When both a and x are large, and a~=x, the
          uniform asymptotic expansion of Temme [3] is employed for greater
          efficiency - specifically, this expansion is used when a>=20 and
          0.7a<=x<=1.4a.

          Once either of P or Q is computed, the other is obtained by
          subtraction from 1. In order to avoid loss of relative precision
          in this subtraction, the smaller of P and Q is computed first.

          This routine is derived from subroutine GAM in Gautschi [2].

          4. References

          [1]   Gautschi W (1979) A Computational Procedure for Incomplete
                Gamma Functions. ACM Trans. Math. Softw. 5 466--481.

          [2]   Gautschi W (1979) Algorithm 542: Incomplete Gamma Functions.
                ACM Trans. Math. Softw. 5 482--489.

          [3]   Temme N M (1987) On the Computation of the Incomplete Gamma
                Functions for Large Values of the Parameters. Algorithms for
                Approximation. (ed J C Mason and M G Cox) Oxford University
                Press.

          5. Parameters

           1:  A -- DOUBLE PRECISION                                  Input
               On entry: the argument a of the functions. Constraint: A >
               0.0.

           2:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the functions. Constraint: X >=
               0.0.

           3:  TOL -- DOUBLE PRECISION                                Input
               On entry: the relative accuracy required by the user in the
               results. If S14BAF is entered with TOL greater than 1.0 or
               less than machine precision, then the value of machine
               precision is used instead.

           4:  P -- DOUBLE PRECISION                                 Output

           5:  Q -- DOUBLE PRECISION                                 Output
               On exit: the values of the functions P(a,x) and Q(a,x)
               respectively.

           6:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               On entry A <= 0.0.

          IFAIL= 2
               On entry X < 0.0.

          IFAIL= 3
               Convergence of the Taylor series or Legendre continued
               fraction fails within 600 iterations. This error is
               extremely unlikely to occur; if it does, contact NAG.

          7. Accuracy

          There are rare occasions when the relative accuracy attained is
          somewhat less than that specified by parameter TOL. However, the
          error should never exceed more than one or two decimal places.
          Note also that there is a limit of 18 decimal places on the
          achievable accuracy, because constants in the routine are given
          to this precision.

          8. Further Comments

          The time taken for a call of S14BAF depends on the precision
          requested through TOL, and also varies slightly with the input
          arguments a and x.

          9. Example

          The example program reads values of the argument a and x from a
          file, evaluates the function and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S15 -- Approximations of Special Functions                 S15ADF
                  S15ADF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S15ADF returns the value of the complementary error function,
          erfcx, via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S15ADF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          The routine calculates an approximate value for the complement of
          the error function

                                                2
                                        infty -u
                                   2    /
                         erfc x= ------ |    e   du=1-erf x.
                                        /
                                 \/(pi) x

          For x>=0, it is based on the Chebyshev expansion

                                            2
                                          -x
                                  erfc x=e   y(x),

                      --'
          where y(x)= >   a T (t) and t=(x-3.75)/(x+3.75), -1<=t<=+1.
                      --   r r
                      r=0

          For x>=x  , where there is a danger of setting underflow, the
                  hi
          result is returned as zero.

                               2
                             -x
          For x<0, erfc x=2-e   y(|x|).

          For x<x   <0, the result is returned as 2.0 which is correct to
                 low
          within machine precision. The values of x   and x    are given in
                                                   hi      low
          the Users' Note for your implementation.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          There are no failure exits from this routine. The parameter IFAIL
          has been included for consistency with other routines in this
          chapter.

          7. Accuracy

          If (delta) and (epsilon) are relative errors in the argument and
          result, respectively, then in principle

                                     |         2          |
                                     |       -x           |
                                     |    2xe             |
                        |(epsilon)|~=| ------------(delta)|.
                                     |                    |

                                     | \/(pi)erfc x       |

          That is, the relative error in the argument, x, is amplified by a
                          2
                        -x
                     2xe
          factor  ------------ in the result.
                    

                  \/(pi)erfc x

          The behaviour of this factor is shown in Figure 1.


                                     Figure 1

                   Please see figure in printed Reference Manual

                                                                     2x
          It should be noted that near x=0 this factor behaves as  ------
                                                                     

                                                                   \/(pi)
          and hence the accuracy is largely determined by the machine
          precision. Also for large negative x, where the factor is
                2
              -x
            xe
          ~ ------, accuracy is mainly limited by machine precision.
              

            \/(pi)
                                                               2
          However, for large positive x, the factor becomes ~2x  and to an
          extent relative accuracy is necessarily lost. The absolute
          accuracy E is given by

                                           2
                                         -x
                                      2xe
                                  E~= ------(delta)
                                        

                                      \/(pi)

          so absolute accuracy is guaranteed for all x.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S15 -- Approximations of Special Functions                 S15AEF
                  S15AEF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S15AEF returns the value of the error function erfx, via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S15AEF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          Evaluates the error function,

                                   2
                               x -t
                          2    /
               erf x =  ------ |e   dt.
                               /
                        \/(pi) 0

          For |x|<=2,
                          --'                   1 2
                erf x = x >   a T (t), where t= -x -1.
                          --   r r              2
                          r=0

          For 2<|x|<x  ,
                     hi
                             {        2               }
                             {      -x                }
                             {     e       --         }           x-7
                erf x = signx{1- --------- >  'b T (t)}, where t= ---.
                             {             --   r r   }           x+3
                             {   |x|\/(pi) r=0        }

          For |x|>=x  ,
                    hi
                erf x =  signx.

          x   is the value above which erf x=+-1 within machine precision.
           hi
          Its value is given in the Users' Note for your implementation.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          There are no failure exits from this routine. The parameter IFAIL
          has been included for consistency with other routines in this
          chapter.

          7. Accuracy

          On a machine with approximately 11 significant figures the
          routine agrees with available tables to 10 figures and
          consistency checking with S15ADF of the relation

                                  erf x+erfc x=1.0

          shows errors in at worst the 11th figure.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17ACF
                  S17ACF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17ACF returns the value of the Bessel Function Y (x), via the
                                                           0
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17ACF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Bessel Function of
          the second kind Y (x).
                           0

          Note: Y (x) is undefined for x<=0 and the routine will fail for
                 0
          such arguments.

          The routine is based on four Chebyshev expansions:

          For 0<x<=8,
                                                                   2
                      2      --'          --'                  ( x)
              Y (x)= ----lnx >   a T (t)+ >   b T (t), with t=2( -) -1,
               0     (pi)    --   r r     --   r r             ( 8)
                             r=0          r=0

          For x>8,

                          

                         /   2  {        (   (pi))         (   (pi))}
                Y (x)=  /  -----{P (x)sin(x- ----)+Q (x)cos(x- ----)}
                 0    \/   (pi)x{ 0      (    4  )  0      (    4  )}

                       --'
          where P (x)= >   c T (t),
                 0     --   r r
                       r=0
                                                2
                     8 --'                  ( 8)
          and Q (x)= - >   d T (t), with t=2( -) -1.
               0     x --   r r             ( x)
                       r=0

                                    2  (  ( x)        )
          For x near zero, Y (x)~= ----(ln( -)+(gamma)), where (gamma)
                            0      (pi)(  ( 2)        )
          denotes Euler's constant. This approximation is used when x is
          sufficiently small for the result to be correct to machine
          precision.

          For very large x, it becomes impossible to provide results with
          any reasonable accuracy (see Section 7), hence the routine fails.
          Such arguments contain insufficient information to determine the
                                                                 

                                                                / 2
          phase of oscillation of Y (x); only the amplitude,   /  -, can be
                                   0                         \/   x
          determined and this is returned on soft failure. The range for
          which this occurs is roughly related to the machine precision:
          the routine will fail if x>~1/machine precision (see the Users'
          Note for your implementation for details).

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Clenshaw C W (1962) Mathematical Tables. Chebyshev Series
                for Mathematical Functions. HMSO.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large. On soft failure the routine returns the
               amplitude of the Y  oscillation, \/2/(pi)x.
                                 0

          IFAIL= 2
               X <= 0.0, Y  is undefined. On soft failure the routine
                          0
               returns zero.

          7. Accuracy

          Let (delta) be the relative error in the argument and E be the
          absolute error in the result. (Since Y (x) oscillates about zero,
                                                0
          absolute error and not relative error is significant, except for
          very small x.)

          If (delta) is somewhat larger than the machine representation
          error (e.g. if (delta) is due to data errors etc), then E and
          (delta) are approximately related by

                                 E~=|xY (x)|(delta)
                                       1

          (provided E is also within machine bounds). Figure 1 displays the
          behaviour of the amplification factor |xY (x)|.
                                                   1


                                     Figure 1
                   Please see figure in printed Reference Manual

          However, if (delta) is of the same order as the machine
          representation errors, then rounding errors could make E slightly
          larger than the above relation predicts.

          For very small x, the errors are essentially independent of
          (delta) and the routine should provide relative accuracy bounded
          by the machine precision.

          For very large x, the above relation ceases to apply. In this
                                                                   

                            /   2     (   (pi))                   /   2
          region, Y (x)~=  /  -----sin(x- ----). The amplitude   /  -----
                   0     \/   (pi)x   (    4  )                /   (pi)x
          can be calculated with reasonable accuracy for all x, but
             (   (pi))               (pi)
          sin(x- ----) cannot. If x- ---- is written as 2N(pi)+(theta)
             (    4  )                4
                                                              (   (pi))
          where N is an integer and 0<=(theta)<2(pi), then sin(x- ----) is
                                                              (    4  )
                                                   -1
          determined by (theta) only. If x>~(delta)  , (theta) cannot be
          determined with any accuracy at all. Thus if x is greater than,
          or of the order of the inverse of machine precision, it is
          impossible to calculate the phase of Y (x) and the routine must
                                                0
          fail.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17ADF
                  S17ADF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17ADF returns the value of the Bessel Function Y (x), via the
                                                           1
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17ADF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Bessel Function of
          the second kind Y (x).
                           1

          Note: Y (x) is undefined for x<=0 and the routine will fail for
                 1
          such arguments.

          The routine is based on four Chebyshev expansions:

          For 0<x<=8,

                        2      x --'           2     x --'
                Y (x)= ----lnx - >   a T (t)- ----x+ - >   b T (t) , with t
                 1     (pi)    8 --   r r     (pi)   8 --   r r
                                 r=0                   r=0
                           2
                       ( x)
                     =2( -) -1;
                       ( 8)


          For x>8,
                            

                           /   2  {        (    (pi))         (    (pi))}
                  Y (x)=  /  -----{P (x)sin(x-3 ----)+Q (x)cos(x-3 ----)}
                   1    \/   (pi)x{ 1      (     4  )  1      (     4  )}

                             --'
                where P (x)= >   c T (t),
                       1     --   r r
                             r=0
                                                      2
                           8 --'                  ( 8)
                and Q (x)= - >   d T (t), with t=2( -) -1.
                     1     x --   r r             ( x)
                             r=0

                                      2
          For x near zero, Y (x)~=- -----. This approximation is used when
                            1       (pi)x
          x is sufficiently small for the result to be correct to machine
          precision. For extremely small x, there is a danger of overflow
                             2
          in calculating - ----- and for such arguments the routine will
                           (pi)x
          fail.

          For very large x, it becomes impossible to provide results with
          any reasonable accuracy (see Section 7), hence the routine fails.
          Such arguments contain insufficient information to determine the
                                                                 

                                                                /   2
          phase of oscillation of Y (x), only the amplitude,   /  -----,
                                   1                         \/   (pi)x
          can be determined and this is returned on soft failure. The range
          for which this occurs is roughly related to machine precision;
          the routine will fail if x>~1/machine precision (see the Users'
          Note for your implementation for details).

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Clenshaw C W (1962) Mathematical Tables. Chebyshev Series
                for Mathematical Functions. HMSO.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large. On soft failure the routine returns the
                                                   

                                                  /   2
               amplitude of the Y  oscillation,  /  -----.
                                 1             \/   (pi)x

          IFAIL= 2
               X <= 0.0, Y  is undefined. On soft failure the routine
                          1
               returns zero.

          IFAIL= 3
               X is too close to zero, there is a danger of overflow. On
               soft failure, the routine returns the value of Y (x) at the
                                                               1
               smallest valid argument.

          7. Accuracy

          Let (delta) be the relative error in the argument and E be the
          absolute error in the result. (Since Y (x) oscillates about zero,
                                                1
          absolute error and not relative error is significant, except for
          very small x.)

          If (delta) is somewhat larger than the machine precision (e.g. if
          (delta) is due to data errors etc), then E and (delta) are
          approximately related by:

                              E~=|xY (x)-Y (x)|(delta)
                                    0     1

          (provided E is also within machine bounds). Figure 1 displays the
          behaviour of the amplification factor |xY (x)-Y (x)|.
                                                   0     1


                                     Figure 1
                   Please see figure in printed Reference Manual

          However, if (delta) is of the same order as machine precision,
          then rounding errors could make E slightly larger than the above
          relation predicts.

          For very small x, absolute error becomes large, but the relative
          error in the result is of the same order as (delta).

          For very large x, the above relation ceases to apply. In this
                          2(pi)   (   3(pi))                 2(pi)
          region, Y (x)~= -----sin(x- -----). The amplitude  ----- can be
                   1        x     (     4  )                   x
                                                                (   3(pi))
          calculated with reasonable accuracy for all x, but sin(x- -----)
                                                                (     4  )
                        3(pi)
          cannot. If x- ----- is written as 2N(pi)+(theta) where N is an
                          4
                                                (   3(pi))
          integer and 0<=(theta)<2(pi), then sin(x- -----) is determined by
                                                (     4  )
                                    -1
          (theta) only. If x>(delta)  , (theta) cannot be determined with
          any accuracy at all. Thus if x is greater than, or of the order
          of, the inverse of the machine precision, it is impossible to
          calculate the phase of Y (x) and the routine must fail.
                                  1

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17AEF
                  S17AEF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17AEF returns the value of the Bessel Function J (x), via the
                                                           0
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17AEF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Bessel Function of
          the first kind J (x).
                          0

          Note: J (-x)=J (x), so the approximation need only consider x>=0.
                 0      0

          The routine is based on three Chebyshev expansions:

          For 0<x<=8,                           2
                       --'                  ( x)
                J (x)= >   a T (t), with t=2( -) -1.
                 0     --   r r             ( 8)
                       r=0

          For x>8,
                          

                         /   2  {        (   (pi))         (   (pi))}
                J (x)=  /  -----{P (x)cos(x- ----)-Q (x)sin(x- ----)}
                 0    \/   (pi)x{ 0      (    4  )  0      (    4  )}

                               --'
                where P (x) =  >   b T (t),
                       0       --   r r
                               r=0
                                                        2
                             8 --'                  ( 8)
                and Q (x) =  - >   c T (t), with t=2( -) -1.
                     0       x --   r r             ( x)
                               r=0

          For x near zero, J (x)~=1. This approximation is used when x is
                            0
          sufficiently small for the result to be correct to machine
          precision.

          For very large x, it becomes impossible to provide results with
          any reasonable accuracy (see Section 7), hence the routine fails.
          Such arguments contain insufficient information to determine the
                                                                 

                                                                /    2
          phase of oscillation of J (x); only the amplitude,   /  -------,
                                   0                         \/   (pi)|x|
          can be determined and this is returned on soft failure. The range
          for which this occurs is roughly related to the machine
          precision; the routine will fail if |x|>~1/machine precision (see
          the Users' Note for your implementation).

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Clenshaw C W (1962) Mathematical Tables. Chebyshev Series
                for Mathematical Functions. HMSO.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large. On soft failure the routine returns the
                                                     

                                                    /    2
               amplitude of the J  oscillation,    /  -------.
                                 0               \/   (pi)|x|

          7. Accuracy

          Let (delta) be the relative error in the argument and E be the
          absolute error in the result. (Since J (x) oscillates about zero,
                                                0
          absolute error and not relative error is significant.)

          If (delta) is somewhat larger than the machine precision (e.g. if
          (delta) is due to data errors etc), then E and (delta) are
          approximately related by:

                                 E~=|xJ (x)|(delta)
                                       1

          (provided E is also within machine bounds). Figure 1 displays the
          behaviour of the amplification factor |xJ (x)|.
                                                   1


                                     Figure 1
                   Please see figure in printed Reference Manual

          However, if (delta) is of the same order as machine precision,
          then rounding errors could make E slightly larger than the above
          relation predicts.

          For very large x, the above relation ceases to apply. In this
                             

                            /    2      (   (pi))
          region, J (x)~=  /  -------cos(x- ----). The amplitude
                   0     \/   (pi)|x|   (    4  )
              

             /    2
            /  ------- can be calculated with reasonable accuracy for all x
          \/   (pi)|x|
                 (   (pi))               (pi)
          but cos(x- ----) cannot. If x- ---- is written as
                 (    4  )                4
          2N(pi)+(theta) where N is an integer and 0 <= (theta) < 2(pi),
                  (   (pi))                                             -1
          then cos(x- ----) is determined by (theta) only. If x>~(delta)  ,
                  (    4  )
          (theta) cannot be determined with any accuracy at all. Thus if x
          is greater than, or of the order of, the inverse of the machine
          precision, it is impossible to calculate the phase of J (x) and
                                                                 0
          the routine must fail.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17AFF
                  S17AFF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17AFF returns the value of the Bessel Function J (x), via the
                                                           1
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17AFF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Bessel Function of
          the first kind J (x).
                          1

          Note: J (-x)=-J (x), so the approximation need only consider x>=0
                 1       1

          The routine is based on three Chebyshev expansions:

          For 0<x<=8,                              2
                       x --'                   ( x)
                J (x)= - >   a T (t) , with t=2( -) -1.
                 1     8 --   r r              ( 8)
                         r=0

          For x>8,
                          

                         /  2   {        (   3(pi))         (   3(pi))}
                J (x)=  /  ----x{P (x)cos(x- -----)-Q (x)sin(x- -----)}
                 1    \/   (pi) { 1      (     4  )  1      (     4  )}

                            --'
                whereP (x)= >   b T (t),
                      1     --   r r
                            r=0
                                                      2
                           8 --'                  ( 8)
                and Q (x)= - >   c T (t), with t=2( -) -1.
                     1     x --   r r             ( x)
                             r=0
                                   x
          For x near zero, J (x)~= -. This approximation is used when x is
                            1      2
          sufficiently small for the result to be correct to machine
          precision.

          For very large x, it becomes impossible to provide results with
          any reasonable accuracy (see Section 7), hence the routine fails.
          Such arguments contain insufficient information to determine the
                                                                 

                                                                /    2
          phase of oscillation of J (x); only the amplitude,   /  -------,
                                   1                         \/   (pi)|x|
          can be determined and this is returned on soft failure. The range
          for which this occurs is roughly related to the machine
          precision; the routine will fail if |x|>~1/machine precision (see
          the Users' Note for your implementation for details).

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Clenshaw C W (1962) Mathematical Tables. Chebyshev Series
                for Mathematical Functions. HMSO.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large. On soft failure the routine returns the
                                                     

                                                    /    2
               amplitude of the J  oscillation,    /  -------.
                                 1               \/   (pi)|x|

          7. Accuracy


          Let (delta) be the relative error in the argument and E be the
          absolute error in the result. (Since J (x) oscillates about zero,
                                                1
          absolute error and not relative error is significant.)

          If (delta) is somewhat larger than machine precision (e.g. if
          (delta) is due to data errors etc), then E and (delta) are
          approximately related by:

                              E~=|xJ (x)-J (x)|(delta)
                                    0     1

          (provided E is also within machine bounds). Figure 1 displays the
          behaviour of the amplification factor |xJ (x)-J (x)|.
                                                   0     1


                                     Figure 1
                   Please see figure in printed Reference Manual

          However, if (delta) is of the same order as machine precision,
          then rounding errors could make E slightly larger than the above
          relation predicts.

          For very large x, the above relation ceases to apply. In this
                             

                            /    2      (   3(pi))
          region, J (x)~=  /  -------cos(x- -----). The amplitude
                   1     \/   (pi)|x|   (     4  )
              

             /    2
            /  ------- can be calculated with reasonable accuracy for all x
          \/   (pi)|x|
                 (   3(pi))               3(pi)
          but cos(x- -----) cannot. If x- ----- is written as
                 (     4  )                 4
          2N(pi)+(theta) where N is an integer and 0<=(theta)<2(pi), then
             (   3(pi))                                             -1
          cos(x- -----) is determined by (theta) only. If x>~(delta)  ,
             (     4  )
          (theta) cannot be determined with any accuracy at all. Thus if x
          is greater than, or of the order of, machine precision, it is
          impossible to calculate the phase of J (x) and the routine must
                                                1
          fail.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17AGF
                  S17AGF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17AGF returns a value for the Airy function, Ai(x), via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17AGF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Airy function,
          Ai(x). It is based on a number of Chebyshev expansions:

          For x<-5,

                                     a(t)sinz-b(t)cosz
                              Ai(x)= -----------------
                                              1/4
                                          (-x)

                             

                   (pi)  2  /  3
          where z= ----+ -\/ -x , and a(t) and b(t) are expansions in the
                    4    3
                           3
                       ( 5)
          variable t=-2( -) -1.
                       ( x)

          For -5<=x<=0,

                                  Ai(x)=f(t)-xg(t),
                                                  3
                                              ( x)
          where f and g are expansions in t=-2( -) -1.
                                              ( 5)

          For 0<x<4.5,

                                         -3x/2
                                  Ai(x)=e     y(t),

          where y is an expansion in t=4x/9-1.

          For 4.5<=x<9,

                                         -5x/2
                                  Ai(x)=e     u(t),

          where u is an expansion in t=4x/9-3.

          For x>=9,

                                           -z
                                          e  v(t)
                                   Ai(x)= -------,
                                            1/4
                                           x

                       

                   2  / 3                             ( 18)
          where z= -\/ x  and v is an expansion in t=2( --)-1.
                   3                                  ( z )

          For |x|< the machine precision, the result is set directly to
          Ai(0). This both saves time and guards against underflow in
          intermediate calculations.

          For large negative arguments, it becomes impossible to calculate
          the phase of the oscillatory function with any precision and so
                                                                2/3
                                                   (     3     )
          the routine must fail. This occurs if x<-( ----------)   , where
                                                   ( 2(epsilon))
          (epsilon) is the machine precision.

          For large positive arguments, where Ai decays in an essentially
          exponential manner, there is a danger of underflow so the routine
          must fail.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.
               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large and positive. On soft failure, the routine
               returns zero.

          IFAIL= 2
               X is too large and negative. On soft failure, the routine
               returns zero.

          7. Accuracy

          For negative arguments the function is oscillatory and hence
          absolute error is the appropriate measure. In the positive region
          the function is essentially exponential-like and here relative
          error is appropriate. The absolute error, E, and the relative
          error, (epsilon), are related in principle to the relative error
          in the argument, (delta), by

                                                 | xAi'(x)|
                 E~=|xAi'(x)|(delta), (epsilon)~=| -------|(delta).
                                                 |  Ai(x) |

          In practice, approximate equality is the best that can be
          expected. When (delta), (epsilon) or E is of the order of the
          machine precision, the errors in the result will be somewhat
          larger.

          For small x, errors are strongly damped by the function and hence
          will be bounded by the machine precision.

          For moderate negative x, the error behaviour is oscillatory but
          the amplitude of the error grows like

                                                     5/4
                                      (    E   )  |x|
                            amplitude ( -------)~ ------.
                                      ( (delta))    
                                                  \/(pi)

                                                                    

                                                                2  /   3
          However the phase error will be growing roughly like  -\/ |x|
                                                                3
          and hence all accuracy will be lost for large negative arguments
          due to the impossibility of calculating sin and cos to any
                           

                       2  /   3     1
          accuracy if  -\/ |x| > -------.
                       3         (delta)

          For large positive arguments, the relative error amplification is
          considerable:

                                                

                                   (epsilon)   / 3
                                   ---------~\/ x .
                                    (delta)

          This means a loss of roughly two decimal places accuracy for
          arguments in the region of 20. However very large arguments are
          not possible due to the danger of setting underflow and so the
          errors are limited in practice.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17AHF
                  S17AHF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17AHF returns a value of the Airy function, Bi(x), via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17AHF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Airy function
          Bi(x). It is based on a number of Chebyshev expansions.

          For x<-5,

                                     a(t)cosz+b(t)sinz
                              Bi(x)= -----------------,
                                              1/4
                                          (-x)

                             

                   (pi)  2  /  3
          where z= ----+ -\/ -x  and a(t) and b(t) are expansions in the
                    4    3
                           3
                       ( 5)
          variable t=-2( -) -1.
                       ( x)

          For -5<=x<=0,

                                       

                               Bi(x)=\/3(f(t)+xg(t)),
                                                  3
                                              ( x)
          where f and g are expansions in t=-2( -) -1.
                                              ( 5)

          For 0<x<4.5,

                                         11x/8
                                  Bi(x)=e     y(t),

          where y is an expansion in t=4x/9-1.

          For 4.5<=x<=9,

                                         5x/2
                                  Bi(x)=e    v(t),

          where v is an expansion in t=4x/9-3.

          For x>=9,

                                           z
                                          e u(t)
                                   Bi(x)= ------,
                                            1/4
                                           x

                       

                   2  / 3                             ( 18)
          where z= -\/ x  and u is an expansion in t=2( --)-1.
                   3                                  ( z )

          For |x|< the machine precision, the result is set directly to
          Bi(0). This both saves time and avoids possible intermediate
          underflows.

          For large negative arguments, it becomes impossible to calculate
          the phase of the oscillating function with any accuracy so the
                                                            2/3
                                               (     3     )
          routine must fail. This occurs if x<-( ----------)   , where
                                               ( 2(epsilon))
          (epsilon) is the machine precision.

          For large positive arguments, there is a danger of causing
          overflow since Bi grows in an essentially exponential manner, so
          the routine must fail.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large and positive. On soft failure, the routine
               returns zero.

          IFAIL= 2
               X is too large and negative. On soft failure, the routine
               returns zero.

          7. Accuracy

          For negative arguments the function is oscillatory and hence
          absolute error is the appropriate measure. In the positive region
          the function is essentially exponential-like and here relative
          error is appropriate. The absolute error, E, and the relative
          error, (epsilon), are related in principle to the relative error
          in the argument, (delta), by

                                                 | xBi'(x)|
                 E~=|xBi'(x)|(delta), (epsilon)~=| -------|(delta).
                                                 |  Bi(x) |

          In practice, approximate equality is the best that can be
          expected. When (delta), (epsilon) or E is of the order of the
          machine precision, the errors in the result will be somewhat
          larger.

          For small x, errors are strongly damped and hence will be bounded
          essentially by the machine precision.

          For moderate to large negative x, the error behaviour is clearly
          oscillatory but the amplitude of the error grows like amplitude
                         5/4
          (    E   )  |x|
          ( -------)~ ------.
          ( (delta))    
                      \/(pi)

                                                                  

                                                              2  /   3
          However the phase error will be growing roughly as  -\/ |x|  and
                                                              3
          hence all accuracy will be lost for large negative arguments.

          This is due to the impossibility of calculating sin and cos to
                               

                           2  /   3     1
          any accuracy if  -\/ |x| > -------.
                           3         (delta)

          For large positive arguments, the relative error amplification is
          considerable:

                                                

                                   (epsilon)   / 3
                                   ---------~\/ x .
                                    (delta)

          This means a loss of roughly two decimal places accuracy for
          arguments in the region of 20. However very large arguments are
          not possible due to the danger of causing overflow and errors are
          therefore limited in practice.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17AJF
                  S17AJF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17AJF returns a value of the derivative of the Airy function
          Ai(x), via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17AJF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the derivative of the
          Airy function Ai(x). It is based on a number of Chebyshev
          expansions.

          For x<-5,

                                4   [           b(t)     ]
                         Ai'(x)=\/-x[a(t)cosz+ ------sinz],
                                    [          (zeta)    ]

                                            

                   (pi)                 2  /  3
          where z= ----+(zeta), (zeta)= -\/ -x  and a(t) and b(t) are
                    4                   3
                                         3
                                     ( 5)
          expansions in variable t=-2( -) -1.
                                     ( x)

          For -5<=x<=0,

                                         2
                                 Ai'(x)=x f(t)-g(t),
                                                  3
                                              ( x)
          where f and g are expansions in t=-2( -) -1.
                                              ( 5)

          For 0<x<4.5,

                                         -11x/8
                                 Ai'(x)=e      y(t),

                                           ( x)
          where y(t) is an expansion in t=4( -)-1.
                                           ( 9)

          For 4.5<=x<9,

                                         -5x/2
                                 Ai'(x)=e     v(t),

                                           ( x)
          where v(t) is an expansion in t=4( -)-3.
                                           ( 9)

          For x>=9,

                                        4    -z
                                 Ai'(x)=\/-xe  u(t),


                   2  / 3                                ( 18)
          where z= -\/ x  and u(t) is an expansion in t=2( --)-1.
                   3                                     ( z )

          For |x|< the square of the machine precision, the result is set
          directly to Ai'(0). This both saves time and avoids possible
          intermediate underflows.

          For large negative arguments, it becomes impossible to calculate
          a result for the oscillating function with any accuracy and so
                                                                4/7
                                                    (          )
                                                    (  \/(pi)  )
          the routine must fail. This occurs for x<-( ---------)   , where
                                                    ( (epsilon))
          (epsilon) is the machine precision.

          For large positive arguments, where Ai' decays in an essentially
          exponential manner, there is a danger of underflow so the routine
          must fail.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large and positive. On soft failure, the routine
               returns zero.

          IFAIL= 2
               X is too large and negative. On soft failure, the routine
               returns zero.

          7. Accuracy

          For negative arguments the function is oscillatory and hence
          absolute error is the appropriate measure. In the positive region
          the function is essentially exponential in character and here
          relative error is needed. The absolute error, E, and the relative
          error, (epsilon), are related in principle to the relative error
          in the argument, (delta), by

                                                  |  2     |
                     2                            | x Ai(x)|
                E~=|x Ai(x)|(delta)    (epsilon)~=| -------|(delta).
                                                  | Ai'(x) |

          In practice, approximate equality is the best that can be
          expected. When (delta), (epsilon) or E is of the order of the
          machine precision, the errors in the result will be somewhat
          larger.

          For small x, positive or negative, errors are strongly attenuated
          by the function and hence will be roughly bounded by the machine
          precision.

          For moderate to large negative x, the error, like the function,
          is oscillatory; however the amplitude of the error grows like

                                          7/4
                                       |x|
                                       ------.

                                       \/(pi)


          Therefore it becomes impossible to calculate the function with
                                    

                             7/4  \/(pi)
          any accuracy if |x|   > -------.
                                  (delta)

          For large positive x, the relative error amplification is
          considerable:

                                                

                                  (epsilon)    / 3
                                  ---------~=\/ x .
                                   (delta)

          However, very large arguments are not possible due to the danger
          of underflow. Thus in practice error amplification is limited.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17AKF
                  S17AKF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17AKF returns a value for the derivative of the Airy function
          Bi(x), via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S17AKF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine calculates an approximate value for the derivative
          of the Airy function Bi(x). It is based on a number of Chebyshev
          expansions.

          For x<-5,

                                4   [            b(t)     ]
                         Bi'(x)=\/-x[-a(t)sinz+ ------cosz],
                                    [           (zeta)    ]

                                           

                   (pi)                2  /  3
          where z= ----+(zeta),(zeta)= -\/ -x  and a(t) and b(t) are
                    4                  3
                                             3
                                         ( 5)
          expansions in the variable t=-2( -) -1.
                                         ( x)

          For -5<=x<=0,

                                          2
                              Bi'(x)=\/3(x f(t)+g(t)),
                                                  3
                                              ( x)
          where f and g are expansions in t=-2( -) -1.
                                              ( 5)

          For 0<x<4.5,

                                          3x/2
                                  Bi'(x)=e    y(t),

          where y(t) is an expansion in t=4x/9-1.

          For 4.5<=x<9,

                                         21x/8
                                 Bi'(x)=e     u(t),

          where u(t) is an expansion in t=4x/9-3.

          For x>=9,

                                         4   z
                                  Bi'(x)=\/xe v(t),

                       

                   2  / 3                                ( 18)
          where z= -\/ x  and v(t) is an expansion in t=2( --)-1.
                   3                                     ( z )

          For |x|< the square of the machine precision, the result is set
          directly to Bi'(0). This saves time and avoids possible
          underflows in calculation.

          For large negative arguments, it becomes impossible to calculate
          a result for the oscillating function with any accuracy so the
                                                            4/7
                                                (          )
                                                (  \/(pi)  )
          routine must fail. This occurs for x<-( ---------)   , where
                                                ( (epsilon))
          (epsilon) is the machine precision.

          For large positive arguments, where Bi' grows in an essentially
          exponential manner, there is a danger of overflow so the routine
          must fail.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.
               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large and positive. On soft failure the routine
               returns zero.

          IFAIL= 2
               X is too large and negative. On soft failure the routine
               returns zero.

          7. Accuracy

          For negative arguments the function is oscillatory and hence
          absolute error is appropriate. In the positive region the
          function has essentially exponential behaviour and hence relative
          error is needed. The absolute error, E, and the relative error
          (epsilon), are related in principle to the relative error in the
          argument (delta), by

                                                  |  2     |
                     2                            | x Bi(x)|
                E~=|x Bi(x)|(delta)    (epsilon)~=| -------|(delta).
                                                  | Bi'(x) |

          In practice, approximate equality is the best that can be
          expected. When (delta), (epsilon) or E is of the order of the
          machine precision, the errors in the result will be somewhat
          larger.

          For small x, positive or negative, errors are strongly attenuated
          by the function and hence will effectively be bounded by the
          machine precision.

          For moderate to large negative x, the error is, like the
          function, oscillatory. However, the amplitude of the absolute
                               7/4
                            |x|
          error grows like  ------. Therefore it becomes impossible to
                              

                            \/(pi)
                                                                

                                                         7/4  \/(pi)
          calculate the function with any accuracy if |x|   > -------.
                                                              (delta)

          For large positive x, the relative error amplification is
                                      

                         (epsilon)   / 3
          considerable:  ---------~\/ x . However, very large arguments are
                          (delta)
          not possible due to the danger of overflow. Thus in practice the
          actual amplification that occurs is limited.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17DCF
                  S17DCF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17DCF returns a sequence of values for the Bessel functions
          Y      (z) for complex z, non-negative (nu) and n=0,1,...,N-1,
           (nu)+n
          with an option for exponential scaling.

          2. Specification

                 SUBROUTINE S17DCF (FNU, Z, N, SCALE, CY, NZ, CWRK, IFAIL)
                 INTEGER              N, NZ, IFAIL
                 DOUBLE PRECISION     FNU
                 COMPLEX(KIND(1.0D0)) Z, CY(N), CWRK(N)
                 CHARACTER*1          SCALE

          3. Description

          This subroutine evaluates a sequence of values for the Bessel
          function Y    (z), where z is complex, -(pi) < arg z <= (pi), and
                    (nu)
          (nu) is the real, non-negative order. The N-member sequence is
          generated for orders (nu), (nu)+1,...,(nu)+N-1. Optionally, the
                                            -|Im z|
          sequence is scaled by the factor e       .

          Note: although the routine may not be called with (nu) less than
          zero, for negative orders the formula
          Y     (z)=Y    (z)cos((pi)(nu))+J    (z)sin((pi)(nu)) may be used
           -(nu)     (nu)                  (nu)
          (for the Bessel function J    (z), see S17DEF).
                                    (nu)

          The routine is derived from the routine CBESY in Amos [2]. It is
                                           (1)      (2)
                                          H    (z)-H    (z)
                                           (nu)     (nu)            (1)
          based on the relation Y    (z)= -----------------, where H    (z)
                                 (nu)            2i                 (nu)
               (2)
          and H    (z) are the Hankel functions of the first and second
               (nu)
          kinds respectively (see S17DLF).

          When N is greater than 1, extra values of Y    (z) are computed
                                                     (nu)
          using recurrence relations.

          For very large |z| or ((nu)+N-1), argument reduction will cause
          total loss of accuracy, and so no computation is performed. For
          slightly smaller |z| or ((nu)+N-1), the computation is performed
          but results are accurate to less than half of machine precision.
          If |z| is very small, near the machine underflow threshold, or
          ((nu)+N-1) is too large, there is a risk of overflow and so no
          computation is performed. In all the above cases, a warning is
          given by the routine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Amos D E (1986) Algorithm 644: A Portable Package for Bessel
                Functions of a Complex Argument and Nonnegative Order. ACM
                Trans. Math. Softw. 12 265--273.

          5. Parameters

           1:  FNU -- DOUBLE PRECISION                                Input
               On entry: the order, (nu), of the first member of the
               sequence of functions. Constraint: FNU >= 0.0.

           2:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument, z, of the functions. Constraint: Z
               /= (0.0, 0.0).

           3:  N -- INTEGER                                           Input
               On entry: the number, N, of members required in the sequence
               Y    (z), Y      (z),...,Y        (z). Constraint: N >= 1.
                (nu)      (nu)+1         (nu)+N-1

           4:  SCALE -- CHARACTER*1                                   Input
               On entry: the scaling option.

               If SCALE = 'U', the results are returned unscaled.

               If SCALE = 'S', the results are returned scaled by the
                       -|Imz|
               factor e      . Constraint: SCALE = 'U' or 'S'.

           5:  CY(N) -- COMPLEX(KIND(1.0D)) array                    Output
               On exit: the N required function values: CY(i) contains
               Y        (z), for i=1,2,...,N.
                (nu)+i-1

           6:  NZ -- INTEGER                                         Output
               On exit: the number of components of CY that are set to zero
               due to underflow. The positions of such components in the
               array CY are arbitrary.

           7:  CWRK(N) -- COMPLEX(KIND(1.0D)) array               Workspace

           8:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry FNU < 0.0,

               or       Z = (0.0, 0.0),

               or       N < 1,

               or       SCALE /= 'U' or 'S'.

          IFAIL= 2
               No computation has been performed due to the likelihood of
               overflow, because ABS(Z) is less than a machine-dependent
               threshold value (given in the Users' Note for your
               implementation).

          IFAIL= 3
               No computation has been performed due to the likelihood of
               overflow, because FNU + N - 1 is too large - how large
               depends on Z as well as the overflow threshold of the
               machine.

          IFAIL= 4
               The computation has been performed, but the errors due to
               argument reduction in elementary functions make it likely
               that the results returned by S17DCF are accurate to less
               than half of machine precision. This error exit may occur if
               either ABS(Z) or FNU + N - 1 is greater than a machine-
               dependent threshold value (given in the Users' Note for
               your implementation).

          IFAIL= 5
               No computation has been performed because the errors due to
               argument reduction in elementary functions mean that all
               precision in results returned by S17DCF would be lost. This
               error exit may occur if either ABS(Z) or FNU + N - 1 is
               greater than a machine-dependent threshold value (given in
               the Users' Note for your implementation).

          IFAIL= 6
               No results are returned because the algorithm termination
               condition has not been met. This may occur because the
               parameters supplied to S17DCF would have caused overflow or
               underflow.

          7. Accuracy

          All constants in subroutine S17DCF are given to approximately 18
          digits of precision. Calling the number of digits of precision in
          the floating-point arithmetic being used t, then clearly the
          maximum number of correct digits in the results obtained is
          limited by p=min(t,18). Because of errors in argument reduction
          when computing elementary functions inside S17DCF, the actual
          number of correct digits is limited, in general, by p-s, where
          s~max(1,|log  |z||,|log  (nu)|) represents the number of digits
                      10         10
          lost due to the argument reduction. Thus the larger the values of
          |z| and (nu), the less the precision in the result. If S17DCF is
          called with N>1, then computation of function values via
          recurrence may lead to some further small loss of accuracy.

          If function values which should nominally be identical are
          computed by calls to S17DCF with different base values of (nu)
          and different N, the computed values may not agree exactly.
          Empirical tests with modest values of (nu) and z have shown that
          the discrepancy is limited to the least significant 3-4 digits of
          precision.

          8. Further Comments

          The time taken by the routine for a call of S17DCF is
          approximately proportional to the value of N, plus a constant. In
          general it is much cheaper to call S17DCF with N greater than 1,
          rather than to make N separate calls to S17DCF.

          Paradoxically, for some values of z and (nu), it is cheaper to
          call S17DCF with a larger value of N than is required, and then
          discard the extra function values returned. However, it is not
          possible to state the precise circumstances in which this is
          likely to occur. It is due to the fact that the base value used
          to start recurrence may be calculated in different regions for
          different N, and the costs in each region may differ greatly.

          Note that if the function required is Y (x) or Y (x), i.e., (nu)
                                                 0        1
          = 0.0 or 1.0, where x is real and positive, and only a single
          unscaled function value is required, then it may be much cheaper
          to call S17ACF or S17ADF respectively.

          9. Example

          The example program prints a caption and then proceeds to read
          sets of data from the input data stream. The first datum is a
          value for the order FNU, the second is a complex value for the
          argument, Z, and the third is a value for the parameter SCALE.
          The program calls the routine with N = 2 to evaluate the function
          for orders FNU and FNU + 1, and it prints the results. The
          process is repeated until the end of the input data stream is
          encountered.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17DEF
                  S17DEF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17DEF returns a sequence of values for the Bessel functions
          J      (z) for complex z, non-negative (nu) and n=0,1,...,N-1,
           (nu)+n
          with an option for exponential scaling.

          2. Specification

                 SUBROUTINE S17DEF (FNU, Z, N, SCALE, CY, NZ, IFAIL)
                 INTEGER              N, NZ, IFAIL
                 DOUBLE PRECISION     FNU
                 COMPLEX(KIND(1.0D0)) Z, CY(N)
                 CHARACTER*1          SCALE

          3. Description

          This subroutine evaluates a sequence of values for the Bessel
          function J    (z), where z is complex, -(pi) < arg z <= (pi), and
                    (nu)
          (nu) is the real, non-negative order. The N-member sequence is
          generated for orders (nu), (nu)+1,...,(nu)+N-1. Optionally, the
                                            -|Im z|
          sequence is scaled by the factor e       .

          Note: although the routine may not be called with (nu) less than
          zero, for negative orders the formula
          J     (z)=J    (z)cos((pi)(nu))-Y    (z)sin((pi)(nu)) may be used
           -(nu)     (nu)                  (nu)
          (for the Bessel function Y    (z), see S17DCF).
                                    (nu)

          The routine is derived from the routine CBESJ in Amos [2]. It is
                                           (nu)(pi)i/2
          based on the relations J    (z)=e           I    (-iz), Im z>=0.0
                                  (nu)                 (nu)
                        -(nu)(pi)i/2
          and J    (z)=e            I    (iz), Im z<0.0.
               (nu)                  (nu)

          The Bessel function I    (z) is computed using a variety of
                               (nu)
          techniques depending on the region under consideration.

          When N is greater than 1, extra values of J    (z) are computed
                                                     (nu)
          using recurrence relations.

          For very large |z| or ((nu)+N-1), argument reduction will cause
          total loss of accuracy, and so no computation is performed. For
          slightly smaller |z| or ((nu)+N-1), the computation is performed
          but results are accurate to less than half of machine precision.
          If Im z is large, there is a risk of overflow and so no
          computation is performed. In all the above cases, a warning is
          given by the routine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Amos D E (1986) Algorithm 644: A Portable Package for Bessel
                Functions of a Complex Argument and Nonnegative Order. ACM
                Trans. Math. Softw. 12 265--273.

          5. Parameters

           1:  FNU -- DOUBLE PRECISION                                Input
               On entry: the order, (nu), of the first member of the
               sequence of functions. Constraint: FNU >= 0.0.

           2:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument z of the functions.

           3:  N -- INTEGER                                           Input
               On entry: the number, N, of members required in the sequence
               J    (z),J      (z),...,J        (z). Constraint: N >= 1.
                (nu)     (nu)+1         (nu)+N-1

           4:  SCALE -- CHARACTER*1                                   Input
               On entry: the scaling option.
                    If SCALE = 'U', the results are returned unscaled.

                    If SCALE = 'S', the results are returned scaled by the
                            -|Imz|
                    factor e      .
               Constraint: SCALE = 'U' or 'S'.

           5:  CY(N) -- COMPLEX(KIND(1.0D)) array                    Output
               On exit: the N required function values: CY(i) contains
               J        (z), for i=1,2,...,N.
                (nu)+i-1

           6:  NZ -- INTEGER                                         Output
               On exit: the number of components of CY that are set to zero
               due to underflow. If NZ > 0, then elements CY(N-NZ+1), CY(N-
               NZ+2),...,CY(N) are set to zero.

           7:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry FNU < 0.0,

               or       N < 1,

               or       SCALE /= 'U' or 'S'.

          IFAIL= 2
               No computation has been performed due to the likelihood of
               overflow, because Im Z is larger than a machine-dependent
               threshold value (given in the Users' Note for your
               implementation). This error exit can only occur when SCALE =
               'U'.

          IFAIL= 3
               The computation has been performed, but the errors due to
               argument reduction in elementary functions make it likely
               that the results returned by S17DEF are accurate to less
               than half of machine precision. This error exit may occur if
               either ABS(Z) or FNU + N - 1 is greater than a machine-
               dependent threshold value (given in the Users' Note for
               your implementation).

          IFAIL= 4
               No computation has been performed because the errors due to
               argument reduction in elementary functions mean that all
               precision in results returned by S17DEF would be lost. This
               error exit may occur when either ABS(Z) or FNU + N - 1 is
               greater than a machine-dependent threshold value (given in
               the Users' Note for your implementation).

          IFAIL= 5
               No results are returned because the algorithm termination
               condition has not been met. This may occur because the
               parameters supplied to S17DEF would have caused overflow or
               underflow.

          7. Accuracy

          All constants in subroutine S17DEF are given to approximately 18
          digits of precision. Calling the number of digits of precision in
          the floating-point arithmetic being used t, then clearly the
          maximum number of correct digits in the results obtained is
          limited by p=min(t,18). Because of errors in argument reduction
          when computing elementary functions inside S17DEF, the actual
          number of correct digits is limited, in general, by p-s, where
          s~max(1,|log  |(|z|),|log  (nu)|) represents the number of digits
                      10           10
          lost due to the argument reduction. Thus the larger the values of
          |z| and (nu), the less the precision in the result. If S17DEF is
          called with N>1, then computation of function values via
          recurrence may lead to some further small loss of accuracy.

          If function values which should nominally be identical are
          computed by calls to S17DEF with different base values of (nu)
          and different N, the computed values may not agree exactly.
          Empirical tests with modest values of (nu) and z have shown that
          the discrepancy is limited to the least significant 3-4 digits of
          precision.

          8. Further Comments

          The time taken by the routine for a call of S17DEF is
          approximately proportional to the value of N, plus a constant. In
          general it is much cheaper to call S17DEF with N greater than 1,
          rather than to make N separate calls to S17DEF.

          Paradoxically, for some values of z and (nu), it is cheaper to
          call S17DEF with a larger value of N than is required, and then
          discard the extra function values returned. However, it is not
          possible to state the precise circumstances in which this is
          likely to occur. It is due to the fact that the base value used
          to start recurrence may be calculated in different regions for
          different N, and the costs in each region may differ greatly.

          Note that if the function required is J (x) or J (x), i.e., (nu)
                                                 0        1
          = 0.0 or 1.0, where x is real and positive, and only a single
          unscaled function value is required, then it may be much cheaper
          to call S17AEF or S17AFF respectively.

          9. Example

          The example program prints a caption and then proceeds to read
          sets of data from the input data stream. The first datum is a
          value for the order FNU, the second is a complex value for the
          argument, Z, and the third is a value for the parameter SCALE.

          The program calls the routine with N = 2 to evaluate the function
          for orders FNU and FNU + 1, and it prints the results. The
          process is repeated until the end of the input data stream is
          encountered.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17DGF
                  S17DGF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17DGF returns the value of the Airy function Ai(z) or its
          derivative Ai'(z) for complex z, with an option for exponential
          scaling.

          2. Specification

                 SUBROUTINE S17DGF (DERIV, Z, SCALE, AI, NZ, IFAIL)
                 INTEGER              NZ, IFAIL
                 COMPLEX(KIND(1.0D0)) Z, AI
                 CHARACTER*1          DERIV, SCALE

          3. Description

          This subroutine returns a value for the Airy function Ai(z) or
          its derivative Ai'(z), where z is complex, -(pi) < arg z <= (pi).
                                                             

                                                         2z\/z/3
          Optionally, the value is scaled by the factor e       .

          The routine is derived from the routine CAIRY in Amos [2]. It is
                                          

                                        \/zK   (w)              -zK   (w)
                                            1/3                    2/3
          based on the relations Ai(z)= ----------, and Ai'(z)= ---------,
                                                                       

                                         (pi)\/3                 (pi)/3
                                                                

          where K     is the modified Bessel function and w=2z\/z/3.
                 (nu)

          For very large |z|, argument reduction will cause total loss of
          accuracy, and so no computation is performed. For slightly
          smaller |z|, the computation is performed but results are
          accurate to less than half of machine precision. If Re w is too
          large, and the unscaled function is required, there is a risk of
          overflow and so no computation is performed. In all the above
          cases, a warning is given by the routine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Amos D E (1986) Algorithm 644: A Portable Package for Bessel
                Functions of a Complex Argument and Nonnegative Order. ACM
                Trans. Math. Softw. 12 265--273.

          5. Parameters

           1:  DERIV -- CHARACTER*1                                   Input
               On entry: specifies whether the function or its derivative
               is required.
                    If DERIV = 'F', Ai(z) is returned.

                    If DERIV = 'D', Ai'(z) is returned.
               Constraint: DERIV = 'F' or 'D'.

           2:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument z of the function.

           3:  SCALE -- CHARACTER*1                                   Input
               On entry: the scaling option.

               If SCALE = 'U', the result is returned unscaled.

               If SCALE = 'S', the result is returned scaled by the factor
                    

                2z\/z/3
               e       . Constraint: SCALE = 'U' or 'S'.

           4:  AI -- COMPLEX(KIND(1.0D0))                            Output
               On exit: the required function or derivative value.

           5:  NZ -- INTEGER                                         Output
               On exit: NZ indicates whether or not AI is set to zero due
               to underflow. This can only occur when SCALE = 'U'.

               If NZ = 0, AI is not set to zero.

               If NZ = 1, AI is set to zero.

           6:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry DERIV /= 'F' or 'D'.

               or       SCALE /= 'U' or 'S'.

          IFAIL= 2
               No computation has been performed due to the likelihood of
                                                                

               overflow, because Re w is too large, where w=2Z\/Z/3 -- how
               large depends on Z and the overflow threshold of the
               machine. This error exit can only occur when SCALE = 'U'.

          IFAIL= 3
               The computation has been performed, but the errors due to
               argument reduction in elementary functions make it likely
               that the result returned by S17DGF is accurate to less than
               half of machine precision. This error exit may occur if ABS
               (Z) is greater than a machine-dependent threshold value
               (given in the Users' Note for your implementation).

          IFAIL= 4
               No computation has been performed because the errors due to
               argument reduction in elementary functions mean that all
               precision in the result returned by S17DGF would be lost.
               This error exit may occur if ABS(Z) is greater than a
               machine-dependent threshold value (given in the Users' Note
               for your implementation).

          IFAIL= 5
               No result is returned because the algorithm termination
               condition has not been met. This may occur because the
               parameters supplied to S17DGF would have caused overflow or
               underflow.

          7. Accuracy

          All constants in subroutine S17DGF are given to approximately 18
          digits of precision. Calling the number of digits of precision in
          the floating-point arithmetic being used t, then clearly the
          maximum number of correct digits in the results obtained is
          limited by p=min(t,18). Because of errors in argument reduction
          when computing elementary functions inside S17DGF, the actual
          number of correct digits is limited, in general, by p-s, where
          s~max(1,|log  |z||) represents the number of digits lost due to
                      10
          the argument reduction. Thus the larger the value of |z|, the
          less the precision in the result.

          Empirical tests with modest values of z, checking relations
          between Airy functions Ai(z), Ai'(z), Bi(z) and Bi'(z), have
          shown errors limited to the least significant 3-4 digits of
          precision.

          8. Further Comments

          Note that if the function is required to operate on a real
          argument only, then it may be much cheaper to call S17AGF or
          S17AJF.

          9. Example

          The example program prints a caption and then proceeds to read
          sets of data from the input data stream. The first datum is a
          value for the parameter DERIV, the second is a complex value for
          the argument, Z, and the third is a value for the parameter
          SCALE. The program calls the routine and prints the results. The
          process is repeated until the end of the input data stream is
          encountered.


          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17DHF
                  S17DHF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17DHF returns the value of the Airy function Bi(z) or its
          derivative Bi'(z) for complex z, with an option for exponential
          scaling.

          2. Specification

                 SUBROUTINE S17DHF (DERIV, Z, SCALE, BI, IFAIL)
                 INTEGER              IFAIL
                 COMPLEX(KIND(1.0D0)) Z, BI
                 CHARACTER*1          DERIV, SCALE

          3. Description

          This subroutine returns a value for the Airy function Bi(z) or
          its derivative Bi'(z), where z is complex, -(pi) < argz <= (pi).
                                                                  

                                                         |Re (2z\/z/3)|
          Optionally, the value is scaled by the factor e              .

          The routine is derived from the routine CBIRY in Amos [2]. It is
                                          

                                        \/z
          based on the relations Bi(z)= ---(I    (w)+I   (w)), and
                                             -1/3     1/3
                                        \/3
                   z
          Bi'(z)= ---(I    (w)+I   (w)), where I     is the modified Bessel
                       -2/3     2/3             (nu)
                  \/3
                             

          function and w=2z\/z/3.

          For very large |z|, argument reduction will cause total loss of
          accuracy, and so no computation is performed. For slightly
          smaller |z|, the computation is performed but results are
          accurate to less than half of machine precision. If Re  z is too
          large, and the unscaled function is required, there is a risk of
          overflow and so no computation is performed. In all the above
          cases, a warning is given by the routine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Hammersley J M and Handscomb D C (1967) Monte-Carlo Methods.
                Methuen.

          5. Parameters

           1:  DERIV -- CHARACTER*1                                   Input
               On entry: specifies whether the function or its derivative
               is required.
                    If DERIV = 'F', Bi(z) is returned.

                    If DERIV = 'D', Bi'(z) is returned.
               Constraint: DERIV = 'F' or 'D'.

           2:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument z of the function.

           3:  SCALE -- CHARACTER*1                                   Input
               On entry: the scaling option.
                    If SCALE = 'U', the result is returned unscaled.

                    If SCALE = 'S', the result is returned scaled by the
                                    

                            |Re(2z\/z/3)|
                    factor e             .
               Constraint: SCALE = 'U' or 'S'.

           4:  BI -- COMPLEX(KIND(1.0D0))                            Output
               On exit: the required function or derivative value.

           5:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry DERIV /= 'F' or 'D'.

               or       SCALE /= 'U' or 'S'.

          IFAIL= 2
               No computation has been performed due to the likelihood of
               overflow, because real(Z) is too large - how large depends
               on the overflow threshold of the machine. This error exit
               can only occur when SCALE = 'U'.

          IFAIL= 3
               The computation has been performed, but the errors due to
               argument reduction in elementary functions make it likely
               that the result returned by S17DHF is accurate to less than
               half of machine precision. This error exit may occur if ABS
               (Z) is greater than a machine-dependent threshold value
               (given in the Users' Note for your implementation).

          IFAIL= 4
               No computation has been performed because the errors due to
               argument reduction in elementary functions mean that all
               precision in the result returned by S17DHF would be lost.
               This error exit may occur if ABS(Z) is greater than a
               machine-dependent threshold value (given in the Users' Note
               for your implementation).

          IFAIL= 5
               No result is returned because the algorithm termination
               condition has not been met. This may occur because the
               parameters supplied to S17DHF would have caused overflow or
               underflow.

          7. Accuracy

          All constants in subroutine S17DHF are given to approximately 18
          digits of precision. Calling the number of digits of precision in
          the floating-point arithmetic being used t, then clearly the
          maximum number of correct digits in the results obtained is
          limited by p=min(t,18). Because of errors in argument reduction
          when computing elementary functions inside S17DHF, the actual
          number of correct digits is limited, in general, by p-s, where
          s~max(1,|log  |z||) represents the number of digits lost due to
                      10
          the argument reduction. Thus the larger the value of |z|, the
          less the precision in the result.

          Empirical tests with modest values of z, checking relations
          between Airy functions Ai(z), Ai'(z), Bi(z) and Bi'(z), have
          shown errors limited to the least significant 3-4 digits of
          precision.

          8. Further Comments

          Note that if the function is required to operate on a real
          argument only, then it may be much cheaper to call S17AHF or
          S17AKF.

          9. Example

          The example program prints a caption and then proceeds to read
          sets of data from the input data stream. The first datum is a
          value for the parameter DERIV, the second is a complex value for
          the argument, Z, and the third is a value for the parameter
          SCALE. The program calls the routine and prints the results. The
          process is repeated until the end of the input data stream is
          encountered.


          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S17 -- Approximations of Special Functions                 S17DLF
                  S17DLF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S17DLF returns a sequence of values for the Hankel functions
           (1)           (2)
          H      (z) or H      (z) for complex z, non-negative (nu) and
           (nu)+n        (nu)+n
          n=0,1,...,N-1, with an option for exponential scaling.

          2. Specification

                 SUBROUTINE S17DLF (M, FNU, Z, N, SCALE, CY, NZ, IFAIL)
                 INTEGER              M, N, NZ, IFAIL
                 DOUBLE PRECISION     FNU
                 COMPLEX(KIND(1.0D0)) Z, CY(N)
                 CHARACTER*1          SCALE

          3. Description

          This subroutine evaluates a sequence of values for the Hankel
                    (1)         (2)
          function H    (z) or H    (z), where z is complex, -(pi) < argz
                    (nu)        (nu)
          <= (pi), and (nu) is the real, non-negative order. The N-member
          sequence is generated for orders (nu), (nu)+1,...,(nu)+N-1.
                                                            -iz
          Optionally, the sequence is scaled by the factor e    if the
                       (1)                       iz
          function is H    (z) or by the factor e   if the function is
                       (nu)
           (2)
          H    (z).
           (nu)

          Note: although the routine may not be called with (nu) less than
          zero, for negative orders the formulae
           (1)       (nu)(pi)i (1)           (2)       -(nu)(pi)i (2)
          H     (z)=e         H    (z), and H     (z)=e          H    (z)
           -(nu)               (nu)          -(nu)                (nu)
          may be used.

          The routine is derived from the routine CBESH in Amos [2]. It is
          based on the relation

                            (m)      1 -p(nu)        -p
                           H    (z)= -e      K    (ze  ),
                            (nu)     p        (nu)

                    (pi)                 (pi)
          where p=i ---- if m=1 and p=-i ---- if m=2, and the Bessel
                     2                    2
          function K    (z) is computed in the right half-plane only.
                    (nu)
          Continuation of K    (z) to the left half-plane is computed in
                           (nu)
          terms of the Bessel function I    (z). These functions are
                                        (nu)
          evaluated using a variety of different techniques, depending on
          the region under consideration.

                                                     (m)
          When N is greater than 1, extra values of H    (z) are computed
                                                     (nu)
          using recurrence relations.

          For very large |z| or ((nu)+N-1), argument reduction will cause
          total loss of accuracy, and so no computation is performed. For
          slightly smaller |z| or ((nu)+N-1), the computation is performed
          but results are accurate to less than half of machine precision.
          If |z| is very small, near the machine underflow threshold, or
          ((nu)+N-1) is too large, there is a risk of overflow and so no
          computation is performed. In all the above cases, a warning is
          given by the routine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Amos D E (1986) Algorithm 644: A Portable Package for Bessel
                Functions of a Complex Argument and Nonnegative Order. ACM
                Trans. Math. Softw. 12 265--273.

          5. Parameters

           1:  M -- INTEGER                                           Input
               On entry: the kind of functions required.
                                                 (1)
                    If M = 1, the functions are H    (z).
                                                 (nu)

                                                 (2)
                    If M = 2, the functions are H    (z).
                                                 (nu)
               Constraint: M = 1 or 2.

           2:  FNU -- DOUBLE PRECISION                                Input
               On entry: the order, (nu), of the first member of the
               sequence of functions. Constraint: FNU >= 0.0.

           3:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument z of the functions. Constraint: Z /=
               (0.0, 0.0).

           4:  N -- INTEGER                                           Input
               On entry: the number, N, of members required in the sequence
                (M)    (M)          (M)
               H    , H      ,..., H        . Constraint: N >= 1.
                (nu)   (nu)+1       (nu)+N-1

           5:  SCALE -- CHARACTER*1                                   Input
               On entry: the scaling option.
                    If SCALE = 'U', the results are returned unscaled.

                    If SCALE = 'S', the results are returned scaled by the
                            -iz                               iz
                    factor e    when M = 1, or by the factor e   when M =
                    2.
               Constraint: SCALE = 'U' or 'S'.

           6:  CY(N) -- COMPLEX(KIND(1.0D)) array                    Output
               On exit: the N required function values: CY(i) contains
                (M)
               H        , for i=1,2,...,N.
                (nu)+i-1

           7:  NZ -- INTEGER                                         Output
               On exit: the number of components of CY that are set to zero
               due to underflow. If NZ > 0, then if Imz>0.0 and M = 1, or
               Imz<0.0 and M = 2, elements CY(1), CY(2),...,CY(NZ) are set
               to zero. In the complementary half-planes, NZ simply states
               the number of underflows, and not which elements they are.

           8:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry M /= 1 and M /= 2,

               or       FNU < 0.0,

               or       Z = (0.0, 0.0),

               or       N < 1,

               or       SCALE /= 'U' or 'S'.

          IFAIL= 2
               No computation has been performed due to the likelihood of
               overflow, because ABS(Z) is less than a machine-dependent
               threshold value (given in the Users' Note for your
               implementation).

          IFAIL= 3
               No computation has been performed due to the likelihood of
               overflow, because FNU + N - 1 is too large - how large
               depends on Z and the overflow threshold of the machine.

          IFAIL= 4
               The computation has been performed, but the errors due to
               argument reduction in elementary functions make it likely
               that the results returned by S17DLF are accurate to less
               than half of machine precision. This error exit may occur if
               either ABS(Z) or FNU + N - 1 is greater than a machine-
               dependent threshold value (given in the Users' Note for
               your implementation).

          IFAIL= 5
               No computation has been performed because the errors due to
               argument reduction in elementary functions mean that all
               precision in results returned by S17DLF would be lost. This
               error exit may occur when either of ABS(Z) or FNU + N - 1 is
               greater than a machine-dependent threshold value (given in
               the Users' Note for your implementation).

          IFAIL= 6
               No results are returned because the algorithm termination
               condition has not been met. This may occur because the
               parameters supplied to S17DLF would have caused overflow or
               underflow.

          7. Accuracy

          All constants in subroutine S17DLF are given to approximately 18
          digits of precision. Calling the number of digits of precision in
          the floating-point arithmetic being used t, then clearly the
          maximum number of correct digits in the results obtained is
          limited by p=min(t,18). Because of errors in argument reduction
          when computing elementary functions inside S17DLF, the actual
          number of correct digits is limited, in general, by p-s, where
          s~max(1,|log  |z||,|log  (nu)|) represents the number of digits
                      10         10
          lost due to the argument reduction. Thus the larger the values of
          |z| and (nu), the less the precision in the result. If S17DLF is
          called with N>1, then computation of function values via
          recurrence may lead to some further small loss of accuracy.

          If function values which should nominally be identical are
          computed by calls to S17DLF with different base values of (nu)
          and different N, the computed values may not agree exactly.
          Empirical tests with modest values of (nu) and z have shown that
          the discrepancy is limited to the least significant 3-4 digits of
          precision.

          8. Further Comments

          The time taken by the routine for a call of S17DLF is
          approximately proportional to the value of N, plus a constant. In
          general it is much cheaper to call S17DLF with N greater than 1,
          rather than to make N separate calls to S17DLF.

          Paradoxically, for some values of z and (nu), it is cheaper to
          call S17DLF with a larger value of N than is required, and then
          discard the extra function values returned. However, it is not
          possible to state the precise circumstances in which this is
          likely to occur. It is due to the fact that the base value used
          to start recurrence may be calculated in different regions for
          different N, and the costs in each region may differ greatly.

          9. Example

          The example program prints a caption and then proceeds to read
          sets of data from the input data stream. The first datum is a
          value for the kind of function, M, the second is a value for the
          order FNU, the third is a complex value for the argument, Z, and
          the fourth is a value for the parameter SCALE. The program calls
          the routine with N = 2 to evaluate the function for orders FNU
          and FNU + 1, and it prints the results. The process is repeated
          until the end of the input data stream is encountered.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S18 -- Approximations of Special Functions                 S18ACF
                  S18ACF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S18ACF returns the value of the modified Bessel Function K (x),
                                                                    0
          via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S18ACF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the modified Bessel
          Function of the second kind K (x).
                                       0

          Note: K (x) is undefined for x<=0 and the routine will fail for
                 0
          such arguments.

          The routine is based on five Chebyshev expansions:

          For 0<x<=1,

                           --'          --'                     2
                K (x)=-lnx >   a T (t)+ >   b T (t) , where t=2x -1;
                 0         --   r r     --   r r
                           r=0          r=0

          For 1<x<=2,

                               -x --'
                        K (x)=e   >   c T (t) , where t=2x-3;
                         0        --   r r
                                  r=0

          For 2<x<=4,

                               -x --'
                        K (x)=e   >   d T (t) , where t=x-3;
                         0        --   r r
                                  r=0
          For x>4,

                               -x
                              e   --'                    9-x
                       K (x)= --- >   e T (t) , where t= ---.
                        0         --   r r               1+x
                              \/x r=0

                                             ( x)
          For x near zero, K (x)~=-(gamma)-ln( -), where (gamma) denotes
                            0                ( 2)
          Euler's constant. This approximation is used when x is
          sufficiently small for the result to be correct to machine
          precision.

          For large x, where there is a danger of underflow due to the
          smallness of K , the result is set exactly to zero.
                        0

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X <= 0.0, K  is undefined. On soft failure the routine
                          0
               returns zero.

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and result respectively.

          If (delta) is somewhat larger than the machine precision (i.e.,
          if (delta) is due to data errors etc), then (epsilon) and (delta)
          are approximately related by:

                                       | xK (x)|
                                       |   1   |
                            (epsilon)~=| ------|(delta).
                                       | K (x) |
                                       |  0    |

          Figure 1 shows the behaviour of the error amplification factor

                                     | xK (x)|
                                     |   1   |
                                     | ------|.
                                     | K (x) |
                                     |  0    |

                                     Figure 1
                   Please see figure in printed Reference Manual

          However, if (delta) is of the same order as machine precision,
          then rounding errors could make (epsilon) slightly larger than
          the above relation predicts.

                                                                 |  1 |
          For small x, the amplification factor is approximately | ---|,
                                                                 | lnx|
          which implies strong attenuation of the error, but in general
          (epsilon) can never be less than the machine precision.

          For large x, (epsilon)~=x(delta) and we have strong amplification
          of the relative error. Eventually K , which is asymptotically
                                             0
                     -x
                    e
          given by  ---, becomes so small that it cannot be calculated
                      

                    \/x
          without underflow and hence the routine will return zero. Note
          that for large x the errors will be dominated by those of the
          Fortran intrinsic function EXP.

          8. Further Comments

          For details of the time taken by the routine see the appropriate
          the Users' Note for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S18 -- Approximations of Special Functions                 S18ADF
                  S18ADF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S18ADF returns the value of the modified Bessel Function K (x),
                                                                    1
          via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S18ADF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the modified Bessel
          Function of the second kind K (x).
                                       1

          Note: K (x) is undefined for x<=0 and the routine will fail for
                 1
          such arguments.

          The routine is based on five Chebyshev expansions:

          For 0<x<=1,

                     1      --'           --'                     2
              K (x)= -+xlnx >   a T (t)-x >   b T (t) , where t=2x -1;
               1     x      --   r r      --   r r
                            r=0           r=0

          For 1<x<=2,

                               -x --'
                        K (x)=e   >   c T (t) , where t=2x-3;
                         1        --   r r
                                  r=0

          For 2<x<=4,

                               -x --'
                        K (x)=e   >   d T (t) , where t=x-3;
                         1        --   r r
                                  r=0

          For x>4,

                               -x
                              e   --'                    9-x
                       K (x)= --- >   e T (t) , where t= ---.
                        1         --   r r               1+x
                              \/x r=0

                                   1
          For x near zero, K (x)~= -. This approximation is used when x is
                            1      x
          sufficiently small for the result to be correct to machine
          precision. For very small x on some machines, it is impossible to
                     1
          calculate  - without overflow and the routine must fail.
                     x

          For large x, where there is a danger of underflow due to the
          smallness of K , the result is set exactly to zero.
                        1

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X <= 0.0, K  is undefined. On soft failure the routine
                          1
               returns zero.

          IFAIL= 2
               X is too small, there is a danger of overflow. On soft
               failure the routine returns approximately the largest
               representable value.

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and result respectively.

          If (delta) is somewhat larger than the machine precision (i.e.,
          if (delta) is due to data errors etc), then (epsilon) and (delta)
          are approximately related by:

                                    | xK (x)-K (x)|
                                    |   0     1   |
                         (epsilon)~=| ------------|(delta).
                                    |    K (x)    |
                                    |     1       |

          Figure 1 shows the behaviour of the error amplification factor

                                  | xK (x)-K (x)|
                                  |   0     1   |
                                  | ------------|.
                                  |    K (x)    |
                                  |     1       |

                                     Figure 1
                   Please see figure in printed Reference Manual

          However if (delta) is of the same order as the machine precision,
          then rounding errors could make (epsilon) slightly larger than
          the above relation predicts.

          For small x, (epsilon)~=(delta) and there is no amplification of
          errors.

          For large x, (epsilon)~=x(delta) and we have strong amplification
          of the relative error. Eventually K , which is asymptotically
                                             1
                     -x
                    e
          given by  ---, becomes so small that it cannot be calculated
                      

                    \/x
          without underflow and hence the routine will return zero. Note
          that for large x the errors will be dominated by those of the
          Fortran intrinsic function EXP.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S18 -- Approximations of Special Functions                 S18AEF
                  S18AEF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S18AEF returns the value of the modified Bessel Function I (x),
                                                                    0
          via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S18AEF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the modified Bessel
          Function of the first kind I (x).
                                      0

          Note: I (-x)=I (x), so the approximation need only consider x>=0.
                 0      0

          The routine is based on three Chebyshev expansions:

          For 0<x<=4,

                              x --'                    ( x)
                       I (x)=e  >   a T (t) , where t=2( -)-1;
                        0       --   r r               ( 4)
                                r=0

          For 4<x<=12,

                               x --'                    x-8
                        I (x)=e  >   b T (t) , where t= ---;
                         0       --   r r                4
                                 r=0

          For x>12,

                             x
                            e   --'                    ( 12)
                     I (x)= --- >   c T (t) , where t=2( --)-1.
                      0         --   r r               ( x )
                            \/x r=0

          For small x, I (x)~=1. This approximation is used when x is
                        0
          sufficiently small for the result to be correct to machine
          precision.

          For large x, the routine must fail because of the danger of
                                   x
          overflow in calculating e .

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large. On soft failure the routine returns the
               approximate value of I (x) at the nearest valid argument.
                                     0

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and result respectively.

          If (delta) is somewhat larger than the machine precision (i.e.,
          if (delta) is due to data errors etc), then (epsilon) and (delta)
          are approximately related by:

                                       | xI (x)|
                                       |   1   |
                            (epsilon)~=| ------|(delta).
                                       | I (x) |
                                       |  0    |

          Figure 1 shows the behaviour of the error amplification factor

                                     | xI (x)|
                                     |   1   |
                                     | ------|.
                                     | I (x) |
                                     |  0    |

                                     Figure 1
                   Please see figure in printed Reference Manual

          However if (delta) is of the same order as machine precision,
          then rounding errors could make (epsilon) slightly larger than
          the above relation predicts.

                                                                  2
                                                                 x
          For small x the amplification factor is approximately  --, which
                                                                 2
          implies strong attenuation of the error, but in general (epsilon)
          can never be less than the machine precision.

          For large x, (epsilon)~=x(delta) and we have strong amplification
          of errors. However the routine must fail for quite moderate
          values of x, because I (x) would overflow; hence in practice the
                                0
          loss of accuracy for large x is not excessive. Note that for
          large x the errors will be dominated by those of the Fortran
          intrinsic function EXP.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S18 -- Approximations of Special Functions                 S18AFF
                  S18AFF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S18AFF returns a value for the modified Bessel Function I (x),
                                                                   1
          via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S18AFF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the modified Bessel
          Function of the first kind I (x).
                                      1

          Note: I (-x)=-I (x), so the approximation need only consider x>=0
                 1       1

          The routine is based on three Chebyshev expansions:

          For 0<x<=4,

                               --'                    ( x)2
                       I (x)=x >   a T (t) , where t=2( -) -1;
                        1      --   r r               ( 4)
                               r=0

          For 4<x<=12,

                               x --'                    x-8
                        I (x)=e  >   b T (t) , where t= ---;
                         1       --   r r                4
                                 r=0

          For x>12,

                             x
                            e   --'                    ( 12)
                     I (x)= --- >   c T (t) , where t=2( --)-1.
                      1         --   r r               ( x )
                            \/x r=0

          For small x, I (x)~=x. This approximation is used when x is
                        1
          sufficiently small for the result to be correct to machine
          precision.

          For large x, the routine must fail because I (x) cannot be
                                                      1
          represented without overflow.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               X is too large. On soft failure the routine returns the
               approximate value of I (x) at the nearest valid argument.
                                     1

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and result respectively.

          If (delta) is somewhat larger than the machine precision (i.e.,
          if (delta) is due to data errors etc), then (epsilon) and (delta)
          are approximately related by:

                                    | xI (x)-I (x)|
                                    |   0     1   |
                         (epsilon)~=| ------------|(delta).
                                    |    I (x)    |
                                    |     1       |

          Figure 1 shows the behaviour of the error amplification factor

                                  | xI (x)-I (x)|
                                  |   0     1   |
                                  | ------------|,
                                  |    I (x)    |
                                  |     1       |

                                     Figure 1
                   Please see figure in printed Reference Manual

          However if (delta) is of the same order as machine precision,
          then rounding errors could make (epsilon) slightly larger than
          the above relation predicts.

          For small x, (epsilon)~=(delta) and there is no amplification of
          errors.

          For large x, (epsilon)~=x(delta) and we have strong amplification
          of errors. However the routine must fail for quite moderate
          values of x because I (x) would overflow; hence in practice the
                               1
          loss of accuracy for large x is not excessive. Note that for
          large x, the errors will be dominated by those of the Fortran
          intrinsic function EXP.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S18 -- Approximations of Special Functions                 S18DCF
                  S18DCF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S18DCF returns a sequence of values for the modified Bessel
          functions K      (z) for complex z, non-negative (nu) and
                     (nu)+n
          n=0,1,...,N-1, with an option for exponential scaling.

          2. Specification

                 SUBROUTINE S18DCF (FNU, Z, N, SCALE, CY, NZ, IFAIL)
                 INTEGER              N, NZ, IFAIL
                 DOUBLE PRECISION     FNU
                 COMPLEX(KIND(1.0D0)) Z, CY(N)
                 CHARACTER*1          SCALE

          3. Description

          This subroutine evaluates a sequence of values for the modified
          Bessel function K    (z), where z is complex, -(pi) < arg z <=
                           (nu)
          (pi), and (nu) is the real, non-negative order. The N-member
          sequence is generated for orders (nu), (nu)+1,...,(nu)+N-1.
                                                            z
          Optionally, the sequence is scaled by the factor e .

          The routine is derived from the routine CBESK in Amos [2].

          Note: although the routine may not be called with (nu) less than
          zero, for negative orders the formula K     (z)=K    (z) may be
                                                 -(nu)     (nu)
          used.

          When N is greater than 1, extra values of K    (z) are computed
                                                     (nu)
          using recurrence relations.

          For very large |z| or ((nu)+N-1), argument reduction will cause
          total loss of accuracy, and so no computation is performed. For
          slightly smaller |z| or ((nu)+N-1), the computation is performed
          but results are accurate to less than half of machine precision.
          If |z| is very small, near the machine underflow threshold, or
          ((nu)+N-1) is too large, there is a risk of overflow and so no
          computation is performed. In all the above cases, a warning is
          given by the routine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Amos D E (1986) Algorithm 644: A Portable Package for Bessel
                Functions of a Complex Argument and Nonnegative Order. ACM
                Trans. Math. Softw. 12 265--273.

          5. Parameters

           1:  FNU -- DOUBLE PRECISION                                Input
               On entry: the order, (nu), of the first member of the
               sequence of functions. Constraint: FNU >= 0.0.

           2:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument z of the functions. Constraint: Z /=
               (0.0, 0.0).

           3:  N -- INTEGER                                           Input
               On entry: the number, N, of members required in the sequence
               K    (z), K      (z),..., K        (z). Constraint: N >= 1.
                (nu)      (nu)+1          (nu)+N-1

           4:  SCALE -- CHARACTER*1                                   Input
               On entry: the scaling option.

               If SCALE = 'U', the results are returned unscaled.

               If SCALE = 'S', the results are returned scaled by the
                       z
               factor e . Constraint: SCALE = 'U' or 'S'.

           5:  CY(N) -- COMPLEX(KIND(1.0D)) array                    Output
               On exit: the N required function values: CY(i) contains
               K        (z), for i=1,2,...,N.
                (nu)+i-1

           6:  NZ -- INTEGER                                         Output
               On exit: the number of components of CY that are set to zero
               due to underflow. If NZ > 0 and Rez>=0.0, elements CY(1),CY
               (2),...,CY(NZ) are set to zero. If Rez<0.0, NZ simply states
               the number of underflows, and not which elements they are.

           7:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).


          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry FNU < 0.0,

               or       Z = (0.0, 0.0),

               or       N < 1,

               or       SCALE /= 'U' or 'S'.

          IFAIL= 2
               No computation has been performed due to the likelihood of
               overflow, because ABS(Z) is less than a machine-dependent
               threshold value (given in the Users' Note for your
               implementation).

          IFAIL= 3
               No computation has been performed due to the likelihood of
               overflow, because FNU + N - 1 is too large - how large
               depends on Z and the overflow threshold of the machine.

          IFAIL= 4
               The computation has been performed, but the errors due to
               argument reduction in elementary functions make it likely
               that the results returned by S18DCF are accurate to less
               than half of machine precision. This error exit may occur if
               either ABS(Z) or FNU + N - 1 is greater than a machine-
               dependent threshold value (given in the Users' Note for
               your implementation).

          IFAIL= 5
               No computation has been performed because the errors due to
               argument reduction in elementary functions mean that all
               precision in results returned by S18DCF would be lost. This
               error exit may occur when either ABS(Z) or FNU + N - 1 is
               greater than a machine-dependent threshold value (given in
               the Users' Note for your implementation).

          IFAIL= 6
               No results are returned because the algorithm termination
               condition has not been met. This may occur because the
               parameters supplied to S18DCF would have caused overflow or
               underflow.

          7. Accuracy


          All constants in subroutine S18DCF are given to approximately 18
          digits of precision. Calling the number of digits of precision in
          the floating-point arithmetic being used t, then clearly the
          maximum number of correct digits in the results obtained is
          limited by p=min(t,18). Because of errors in argument reduction
          when computing elementary functions inside S18DCF, the actual
          number of correct digits is limited, in general, by p-s, where
          s~max(1,|log  |z||,|log  (nu)|) represents the number of digits
                      10         10
          lost due to the argument reduction. Thus the larger the values of
          |z| and (nu), the less the precision in the result. If S18DCF is
          called with N>1, then computation of function values via
          recurrence may lead to some further small loss of accuracy.

          If function values which should nominally be identical are
          computed by calls to S18DCF with different base values of (nu)
          and different N, the computed values may not agree exactly.
          Empirical tests with modest values of (nu) and z have shown that
          the discrepancy is limited to the least significant 3-4 digits of
          precision.

          8. Further Comments

          The time taken by the routine for a call of S18DCF is
          approximately proportional to the value of N, plus a constant. In
          general it is much cheaper to call S18DCF with N greater than 1,
          rather than to make N separate calls to S18DCF.

          Paradoxically, for some values of z and (nu), it is cheaper to
          call S18DCF with a larger value of N than is required, and then
          discard the extra function values returned. However, it is not
          possible to state the precise circumstances in which this is
          likely to occur. It is due to the fact that the base value used
          to start recurrence may be calculated in different regions for
          different N, and the costs in each region may differ greatly.

          Note that if the function required is K (x) or K (x), i.e.,
                                                 0        1
          (nu)=0.0 or 1.0, where x is real and positive, and only a single
          function value is required, then it may be much cheaper to call
          S18ACF, S18ADF, S18CCF(*) or S18CDF(*), depending on whether a
          scaled result is required or not.

          9. Example

          The example program prints a caption and then proceeds to read
          sets of data from the input data stream. The first datum is a
          value for the order FNU, the second is a complex value for the
          argument, Z, and the third is a value for the parameter SCALE.
          The program calls the routine with N = 2 to evaluate the function
          for orders FNU and FNU + 1, and it prints the results. The
          process is repeated until the end of the input data stream is
          encountered.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S18 -- Approximations of Special Functions                 S18DEF
                  S18DEF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S18DEF returns a sequence of values for the modified Bessel
          functions I      (z) for complex z, non-negative (nu) and
                     (nu)+n
          n=0,1,...,N-1, with an option for exponential scaling.

          2. Specification

                 SUBROUTINE S18DEF (FNU, Z, N, SCALE, CY, NZ, IFAIL)
                 INTEGER              N, NZ, IFAIL
                 DOUBLE PRECISION     FNU
                 COMPLEX(KIND(1.0D0)) Z, CY(N)
                 CHARACTER*1          SCALE

          3. Description

          This subroutine evaluates a sequence of values for the modified
          Bessel function I    (z), where z is complex, -(pi) < argz <=
                           (nu)
          (pi), and (nu) is the real, non-negative order. The N-member
          sequence is generated for orders (nu), (nu)+1,...,(nu)+N-1.
                                                            -|Rez|
          Optionally, the sequence is scaled by the factor e      .

          The routine is derived from the routine CBESI in Amos [2].

          Note: although the routine may not be called with (nu) less than
          zero, for negative orders the formula
                               2
          I     (z)=I    (z)+ ----sin((pi)(nu))K    (z) may be used (for
           -(nu)     (nu)     (pi)              (nu)
          the Bessel function K    (z), see S18DCF).
                               (nu)

          When N is greater than 1, extra values of I    (z) are computed
                                                     (nu)
          using recurrence relations.

          For very large |z| or ((nu)+N-1), argument reduction will cause
          total loss of accuracy, and so no computation is performed. For
          slightly smaller |z| or ((nu)+N-1), the computation is performed
          but results are accurate to less than half of machine precision.
          If Re(z) is too large and the unscaled function is required,
          there is a risk of overflow and so no computation is performed.
          In all the above cases, a warning is given by the routine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Amos D E (1986) Algorithm 644: A Portable Package for Bessel
                Functions of a Complex Argument and Nonnegative Order. ACM
                Trans. Math. Softw. 12 265--273.

          5. Parameters

           1:  FNU -- DOUBLE PRECISION                                Input
               On entry: the order, (nu), of the first member of the
               sequence of functions. Constraint: FNU >= 0.0.

           2:  Z -- COMPLEX(KIND(1.0D0))                              Input
               On entry: the argument z of the functions.

           3:  N -- INTEGER                                           Input
               On entry: the number, N, of members required in the sequence
               I    (z),I      (z),...,I        (z). Constraint: N >= 1.
                (nu)     (nu)+1         (nu)+N-1

           4:  SCALE -- CHARACTER*1                                   Input
               On entry: the scaling option.
                    If SCALE = 'U', the results are returned unscaled.

                    If SCALE = 'S', the results are returned scaled by the
                            -|Rez|
                    factor e      .
               Constraint: SCALE = 'U' or 'S'.

           5:  CY(N) -- COMPLEX(KIND(1.0D)) array                    Output
               On exit: the N required function values: CY(i) contains
               I        (z), for i=1,2,...,N.
                (nu)+i-1

           6:  NZ -- INTEGER                                         Output
               On exit: the number of components of CY that are set to zero
               due to underflow.

               If NZ > 0, then elements CY(N-NZ+1),CY(N-NZ+2),...,CY(N) are
               set to zero.

           7:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry FNU < 0.0,

               or       N < 1,

               or       SCALE /= 'U' or 'S'.

          IFAIL= 2
               No computation has been performed due to the likelihood of
               overflow, because real(Z) is greater than a machine-
               dependent threshold value (given in the Users' Note for
               your implementation). This error exit can only occur when
               SCALE = 'U'.

          IFAIL= 3
               The computation has been performed, but the errors due to
               argument reduction in elementary functions make it likely
               that the results returned by S18DEF are accurate to less
               than half of machine precision. This error exit may occur
               when either ABS(Z) or FNU + N - 1 is greater than a machine-
               dependent threshold value (given in the Users' Note for
               your implementation).

          IFAIL= 4
               No computation has been performed because the errors due to
               argument reduction in elementary functions mean that all
               precision in results returned by S18DEF would be lost. This
               error exit may occur when either ABS(Z) or FNU + N - 1 is
               greater than a machine-dependent threshold value (given in
               the Users' Note for your implementation).

          IFAIL= 5
               No results are returned because the algorithm termination
               condition has not been met. This may occur because the
               parameters supplied to S18DEF would have caused overflow or
               underflow.

          7. Accuracy

          All constants in subroutine S18DEF are given to approximately 18
          digits of precision. Calling the number of digits of precision in
          the floating-point arithmetic being used t, then clearly the
          maximum number of correct digits in the results obtained is
          limited by p=min(t,18). Because of errors in argument reduction
          when computing elementary functions inside S18DEF, the actual
          number of correct digits is limited, in general, by p-s, where
          s~max(1,|log  |z||,|log  (nu)|) represents the number of digits
                      10         10
          lost due to the argument reduction. Thus the larger the values of
          |z| and (nu), the less the precision in the result. If S18DEF is
          called with N>1, then computation of function values via
          recurrence may lead to some further small loss of accuracy.

          If function values which should nominally be identical are
          computed by calls to S18DEF with different base values of (nu)
          and different N, the computed values may not agree exactly.
          Empirical tests with modest values of (nu) and z have shown that
          the discrepancy is limited to the least significant 3-4 digits of
          precision.

          8. Further Comments

          The time taken by the routine for a call of S18DEF is
          approximately proportional to the value of N, plus a constant. In
          general it is much cheaper to call S18DEF with N greater than 1,
          rather than to make N separate calls to S18DEF.

          Paradoxically, for some values of z and (nu), it is cheaper to
          call S18DEF with a larger value of N than is required, and then
          discard the extra function values returned. However, it is not
          possible to state the precise circumstances in which this is
          likely to occur. It is due to the fact that the base value used
          to start recurrence may be calculated in different regions for
          different N, and the costs in each region may differ greatly.

          Note that if the function required is I (x) or I (x), i.e.,
                                                 0        1
          (nu)=0.0 or 1.0, where x is real and positive, and only a single
          function value is required, then it may be much cheaper to call
          S18AEF, S18AFF, S18CEF(*) or S18CFF(*), depending on whether a
          scaled result is required or not.

          9. Example

          The example program prints a caption and then proceeds to read
          sets of data from the input data stream. The first datum is a
          value for the order FNU, the second is a complex value for the
          argument, Z, and the third is a value for the parameter SCALE.
          The program calls the routine with N = 2 to evaluate the function
          for orders FNU and FNU + 1, and it prints the results. The
          process is repeated until the end of the input data stream is
          encountered.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S19 -- Approximations of Special Functions                 S19AAF
                  S19AAF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S19AAF returns a value for the Kelvin function ber x via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S19AAF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Kelvin function
          berx.

          Note: ber(-x)=berx, so the approximation need only consider
          x>=0.0.

          The routine is based on several Chebyshev expansions:

          For 0<=x<=5,

                               --'                 ( x)4
                         berx= >   a T (t) with t=2( -) -1;
                               --   r r            ( 5)
                               r=0

          For x>5,

                            

                        x/\/2
                       e      [(   1    )            1              ]
                berx= --------[(1+ -a(t))cos(alpha)+ -b(t)sin(alpha)]
                              [(   x    )            x              ]
                      \/2(pi)x

                            

                       -x/\/2
                      e      [(   1    )           1             ]
                   + --------[(1+ -c(t))sin(beta)+ -d(t)cos(beta)]
                             [(   x    )           x             ]
                     \/2(pi)x

                          x   (pi)           x   (pi)
          where (alpha)= ---- ----, (beta)= ---+ ----,
                               8                  8
                         \/2                /2

          and a(t), b(t), c(t), and d(t) are expansions in the variable
             10
          t= ---1.
             x

          When x is sufficiently close to zero, the result is set directly
          to ber 0=1.0.

          For large x, there is a danger of the result being totally
          inaccurate, as the error amplification factor grows in an
          essentially exponential manner; therefore the routine must fail.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               On entry ABS(X) is too large for an accurate result to be
               returned. On soft failure, the routine returns zero.

          7. Accuracy

          Since the function is oscillatory, the absolute error rather than
          the relative error is important. Let E be the absolute error in
          the result and (delta) be the relative error in the argument. If
          (delta) is somewhat larger than the machine precision, then we
          have:

                               |  x              |
                            E~=| ---(ber x+bei x)|(delta)
                               |        1     1  |
                               | \/2             |

          (provided E is within machine bounds).

          For small x the error amplification is insignificant and thus the
          absolute error is effectively bounded by the machine precision.

          For medium and large x, the error behaviour is oscillatory and
                                                  

                                      /   x   x/\/2
          its amplitude grows like   /  -----e    . Therefore it is not
                                   \/   2(pi)

          possible to calculate the function with any accuracy when
                       

              x/\/2  /2(pi)
          \/xe     > -------. Note that this value of x is much smaller than
                     (delta)

          the minimum value of x for which the function overflows.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S19 -- Approximations of Special Functions                 S19ABF
                  S19ABF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S19ABF returns a value for the Kelvin function bei x via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S19ABF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Kelvin function
          beix.

          Note: bei(-x)=beix, so the approximation need only consider
          x>=0.0.

          The routine is based on several Chebyshev expansions:

          For 0<=x<=5,

                              2
                             x  --'                    ( x)4
                      bei x= -- >   a T (t),  with  t=2( -) -1;
                             4  --   r r               ( 5)
                                r=0

          For x>5,

                            

                        x/\/2
                       e      [(   1    )            1              ]
               bei x= --------[(1+ -a(t))sin(alpha)- -b(t)cos(alpha)]
                              [(   x    )            x              ]
                      \/2(pi)x

                            

                        x/\/2
                       e     [(   1    )           1             ]
                   + --------[(1+ -c(t))cos(beta)- -d(t)sin(beta)]
                             [(   x    )           x             ]
                     \/2(pi)x

                         x   (pi)          x   (pi)
          where(alpha)= ---- ----,(beta)= ---+ ----,
                              8                 8
                        \/2               /2

          and a(t), b(t), c(t), and d(t) are expansions in the variable
             10
          t= ---1.
             x

          When x is sufficiently close to zero, the result is computed as
                  2
                 x
          bei x= --. If this result would underflow, the result returned is
                 4
          beix=0.0.

          For large x, there is a danger of the result being totally
          inaccurate, as the error amplification factor grows in an
          essentially exponential manner; therefore the routine must fail.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               On entry ABS(X) is too large for an accurate result to be
               returned. On soft failure, the routine returns zero.

          7. Accuracy

          Since the function is oscillatory, the absolute error rather than
          the relative error is important. Let E be the absolute error in
          the function, and (delta) be the relative error in the argument.
          If (delta) is somewhat larger than the machine precision, then we
          have:

                              |  x               |
                           E~=| ---(-ber x+bei x)|(delta)
                              |         1     1  |
                              | \/2              |

          (provided E is within machine bounds).

          For small x the error amplification is insignificant and thus the
          absolute error is effectively bounded by the machine precision.

          For medium and large x, the error behaviour is oscillatory and
                                                 

                                      /   x   x\/2
          its amplitude grows like   /  -----e    . Therefore it is
                                   \/   2(pi)

          impossible to calculate the functions with any accuracy when
                  

              x/\/2 /2(pi)
          \/xe     > -------. Note that this value of x is much smaller than
                     (delta)

          the minimum value of x for which the function overflows.

          8. Further Comments

          For details of the time taken by the routine see the Users' Note
          for your implementation.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S19 -- Approximations of Special Functions                 S19ACF
                  S19ACF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S19ACF returns a value for the Kelvin function ker x, via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S19ACF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Kelvin function
          ker x.

          Note: for x<0 the function is undefined and at x=0 it is infinite
          so we need only consider x>0.

          The routine is based on several Chebyshev expansions:

          For 0<x<=1,

                                           (pi) 2
                          ker x=-f(t)logx+ ----x g(t)+y(t)
                                            16

                                                                       4
          where f(t), g(t) and y(t) are expansions in the variable t=2x -1;

          For 1<x<=3,

                                         (  11 )
                                ker x=exp(- --x)q(t)
                                         (  16 )

          where q(t) is an expansion in the variable t=x-2;

          For x>3,

                                  

                             -x/\/2
                      / (pi)       [(   1    )           1             ]
             ker x=  /  ----e      [(1+ -c(t))cos(beta)- -d(t)sin(beta)]
                   \/    2x        [(   x    )           x             ]


                         x   (pi)
          where (beta)= ---+ ----, and c(t) and d(t) are expansions in the
                              8
                        \/2
                      6
          variable t= --1.
                      x

          When x is sufficiently close to zero, the result is computed as

                                                            2
                                          ( x) (      3 2) x
                        ker x=-(gamma)-log( -)+((pi)- -x ) --
                                          ( 2) (      8  ) 16

          and when x is even closer to zero, simply as
                            ( x)
          ker x=-(gamma)-log( -).
                            ( 2)

                                                                       

                                                           / (pi) -x/\/2
          For large x, ker x is asymptotically given by   /  ----e      and
                                                        \/    2x

          this becomes so small that it cannot be computed without
          underflow and the routine fails.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X > 0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               On entry X is too large, the result underflows. On soft
               failure, the routine returns zero.

          IFAIL= 2
               On entry X <= 0, the function is undefined. On soft failure
               the routine returns zero.

          7. Accuracy

          Let E be the absolute error in the result, (epsilon) be the
          relative error in the result and (delta) be the relative error in
          the argument. If (delta) is somewhat larger than the machine
          precision, then we have:

                              |  x               |
                           E~=| ---(ker  x+kei x)|(delta),
                              |         1     1  |
                              | \/2              |

                                  |     ker  x+kei x|
                                  |  x      1     1 |
                       (epsilon)~=| --- ------------|(delta).
                                  |        ker x    |
                                  | \/2             |

          For very small x, the relative error amplification factor is
                                    1
          approximately given by  ------, which implies a strong
                                  |logx|
          attenuation of relative error. However, (epsilon) in general
          cannot be less than the machine precision.

          For small x, errors are damped by the function and hence are
          limited by the machine precision.

          For medium and large x, the error behaviour, like the function
          itself, is oscillatory, and hence only the absolute accuracy for
          the function can be maintained. For this range of x, the
                                                                      

                                                         / (pi)x -x/\/2
          amplitude of the absolute error decays like   /  -----e
                                                      \/     2

          which implies a strong attenuation of error. Eventually, ker x,
                                                           

                                               / (pi) -x/\/2
          which asymptotically behaves like   /  ----e     , becomes so
                                            \/    2x

          small that it cannot be calculated without causing underflow, and
          the routine returns zero. Note that for large x the errors are
          dominated by those of the Fortran intrinsic function EXP.

          8. Further Comments

          Underflow may occur for a few values of x close to the zeros of
          ker x, below the limit which causes a failure with IFAIL = 1.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S19 -- Approximations of Special Functions                 S19ADF
                  S19ADF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S19ADF returns a value for the Kelvin function keix via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S19ADF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Kelvin function
          keix.

          Note: for x<0 the function is undefined, so we need only consider
          x>=0.

          The routine is based on several Chebyshev expansions:

          For 0<=x<=1,

                                           2
                                (pi)      x
                         keix=- ----f(t)+ --[-g(t)logx+v(t)]
                                 4        4

                                                                       4
          where f(t), g(t) and v(t) are expansions in the variable t=2x -1;

          For 1<x<=3,

                                         (  9 )
                                 keix=exp(- -x)u(t)
                                         (  8 )

          where u(t) is an expansion in the variable t=x-2;

          For x>3,

                                  

                      / (pi) -x/\/2[(   1)               1             ]
              keix=  /  ----e      [(1+ -)c(t)sin(beta)+ -d(t)cos(beta)]
                   \/    2x        [(   x)               x             ]


                         x   (pi)
          where (beta)= ---+ ----, and c(t) and d(t) are expansions in the
                              8
                        \/2
                      6
          variable t= --1.
                      x

          For x<0, the function is undefined, and hence the routine fails
          and returns zero.

          When x is sufficiently close to zero, the result is computed as

                                                          2
                                (pi) (             ( x)) x
                         keix=- ----+(1-(gamma)-log( -)) --
                                 4   (             ( 2)) 4

          and when x is even closer to zero simply as

                                           (pi)
                                    keix=- ----.
                                            4

                                                                      

                                                          / (pi) -x/\/2
          For large x, keix is asymptotically given by   /  ----e       and
                                                       \/    2x

          this becomes so small that it cannot be computed without
          underflow and the routine fails.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function. Constraint: X >=
               0.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          IFAIL= 1
               On entry X is too large, the result underflows. On soft
               failure, the routine returns zero.

          IFAIL= 2
               On entry X < 0, the function is undefined. On soft failure
               the routine returns zero.

          7. Accuracy

          Let E be the absolute error in the result, and (delta) be the
          relative error in the argument. If (delta) is somewhat larger
          than the machine representation error, then we have:

                             |  x                |
                          E~=| ---(-ker  x+kei x)|(delta).
                             |          1     1  |
                             | \/2               |

          For small x, errors are attenuated by the function and hence are
          limited by the machine precision.

          For medium and large x, the error behaviour, like the function
          itself, is oscillatory and hence only absolute accuracy of the
          function can be maintained. For this range of x, the amplitude of
                                                         

                                            / (pi)x -x/\/2
          the absolute error decays like   /  -----e      , which implies a
                                         \/     2

          strong attenuation of error. Eventually, keix, which is
                                                 

                                     / (pi) -x/\/2
          asymptotically given by   /  ----e      , becomes so small that it
                                  \/    2x

          cannot be calculated without causing underflow and therefore the
          routine returns zero. Note that for large x, the errors are
          dominated by those of the Fortran intrinsic function EXP.

          8. Further Comments

          Underflow may occur for a few values of x close to the zeros of
          keix, below the limit which causes a failure with IFAIL = 1.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S20 -- Approximations of Special Functions                 S20ACF
                  S20ACF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S20ACF returns a value for the Fresnel Integral S(x), via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S20ACF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Fresnel Integral

                                     x
                                     /   ( (pi) 2)
                               S(x)= |sin( ----t )dt.
                                     /   (  2    )
                                     0

          Note: S(x)=-S(-x), so the approximation need only consider x>=0.0

          The routine is based on three Chebyshev expansions:

          For 0<x<=3,

                             3 --'                   ( x)4
                       S(x)=x  >   a T (t) , with t=2( -) -1;
                               --   r r              ( 3)
                               r=0

          For x>3,

                          1  f(x)   ( (pi) 2)  g(x)   ( (pi) 2)
                    S(x)= -- ----cos( ----x )- ----sin( ----x ),
                          2   x     (  2    )    3    (  2    )
                                                x

                        --'
          where f(x) =  >   b T (t),
                        --   r r
                        r=0

                      --'                  ( 3)4
          and g(x) =  >   c T (t), with t=2( -) -1.
                      --   r r             ( x)
                      r=0

                              (pi) 3
          For small x, S(x)~= ----x . This approximation is used when x is
                               6
          sufficiently small for the result to be correct to machine
          precision. For very small x, this approximation would underflow;
          the result is then set exactly to zero.

                               1                1
          For large x, f(x)~= ---- and g(x)~= -----. Therefore for
                              (pi)                2
                                              (pi)
                                       1                                 1
          moderately large x, when  ------- is negligible compared with  -,
                                        2 3                              2
                                    (pi) x
          the second term in the approximation for x>3 may be dropped. For
                                1                              1
          very large x, when  ----- becomes negligible, S(x)~= -. However
                              (pi)x                            2
          there will be considerable difficulties in calculating
             ( (pi) 2)
          cos( ----x ) accurately before this final limiting value can be
             (  2    )
                         ( (pi) 2)
          used. Since cos( ----x ) is periodic, its value is essentially
                         (  2    )
                                                2      2
          determined by the fractional part of x . If x =N+(theta) where N
                                                  ( (pi) 2)
          is an integer and 0<=(theta)<1, then cos( ----x ) depends on
                                                  (  2    )
          (theta) and on N modulo 4. By exploiting this fact, it is
          possible to retain significance in the calculation of
             ( (pi) 2)
          cos( ----x ) either all the way to the very large x limit, or at
             (  2    )
                                           x
          least until the integer part of  - is equal to the maximum
                                           2
          integer allowed on the machine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          There are no failure exits from this routine. The parameter IFAIL
          has been included for consistency with other routines in this
          chapter.

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and result respectively.

          If (delta) is somewhat larger than the machine precision (i.e.,
          if (delta) is due to data errors etc), then (epsilon) and (delta)
          are approximately related by:

                                    |     ( (pi) 2)|
                                    | xsin( ----x )|
                                    |     (  2    )|
                         (epsilon)~=| -------------|(delta).
                                    |     S(x)     |

          Figure 1 shows the behaviour of the error amplification factor

          |     ( (pi) 2)|
          | xsin( ----x )|
          |     (  2    )|
          | -------------|.
          |     S(x)     |


                                     Figure 1
                   Please see figure in printed Reference Manual

          However if (delta) is of the same order as the machine precision,
          then rounding errors could make (epsilon) slightly larger than
          the above relation predicts.

          For small x, (epsilon)~=3(delta) and hence there is only moderate
          amplification of relative error. Of course for very small x where
          the correct result would underflow and exact zero is returned,
          relative error-control is lost.

          For moderately large values of x,

                                    |     ( (pi) 2)|
                       |(epsilon)|~=|2xsin( ----x )||(delta)|
                                    |     (  2    )|

          and the result will be subject to increasingly large
          amplification of errors. However the above relation breaks down
                                             1
          for large values of x (i.e., when  -- is of the order of the
                                              2
                                             x
          machine precision in this region the relative error in the result
                                       2
          is essentially bounded by  -----).
                                     (pi)x

          Hence the effects of error amplification are limited and at worst
          the relative error loss should not exceed half the possible
          number of significant figures.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S20 -- Approximations of Special Functions                 S20ADF
                  S20ADF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S20ADF returns a value for the Fresnel Integral C(x), via the
          routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S20ADF (X, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X

          3. Description

          This routine evaluates an approximation to the Fresnel Integral

                                     x
                                     /   ( (pi) 2)
                               C(x)= |cos( ----t )dt.
                                     /   (  2    )
                                     0

          Note: C(x)=-C(-x), so the approximation need only consider x>=0.0

          The routine is based on three Chebyshev expansions:

          For 0<x<=3,

                               --'                   ( x)4
                        C(x)=x >   a T (t) , with t=2( -) -1;
                               --   r r              ( 3)
                               r=0

          For x>3,

                          1  f(x)   ( (pi) 2)  g(x)   ( (pi) 2)
                    C(x)= -+ ----sin( ----x )- ----cos( ----x ),
                          2   x     (  2    )    3    (  2    )
                                                x

                        --'
          where f(x) =  >   b T (t),
                        --   r r
                        r=0

                      --'                  ( 3)4
          and g(x) =  >   c T (t), with t=2( -) -1.
                      --   r r             ( x)
                      r=0

          For small x, C(x)~=x. This approximation is used when x is
          sufficiently small for the result to be correct to machine
          precision.

                               1                1
          For large x, f(x)~= ---- and g(x)~= -----. Therefore for
                              (pi)                2
                                              (pi)
                                       1                                 1
          moderately large x, when  ------- is negligible compared with  -,
                                        2 3                              2
                                    (pi) x
          the second term in the approximation for x>3 may be dropped. For
                                1                              1
          very large x, when  ----- becomes negligible, C(x)~= -. However
                              (pi)x                            2
          there will be considerable difficulties in calculating
             ( (pi) 2)
          sin( ----x ) accurately before this final limiting value can be
             (  2    )
                         ( (pi) 2)
          used. Since sin( ----x ) is periodic, its value is essentially
                         (  2    )
                                                2      2
          determined by the fractional part of x . If x =N+(theta), where N
                                                  ( (pi) 2)
          is an integer and 0<=(theta)<1, then sin( ----x ) depends on
                                                  (  2    )
          (theta) and on N modulo 4. By exploiting this fact, it is
          possible to retain some significance in the calculation of
             ( (pi) 2)
          sin( ----x ) either all the way to the very large x limit, or at
             (  2    )
                                           x
          least until the integer part of  - is equal to the maximum
                                           2
          integer allowed on the machine.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input
               On entry: the argument x of the function.

           2:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          There are no failure exits from this routine. The parameter IFAIL
          has been included for consistency with other routines in this
          chapter.

          7. Accuracy

          Let (delta) and (epsilon) be the relative errors in the argument
          and result respectively.

          If (delta) is somewhat larger than the machine precision (i.e if
          (delta) is due to data errors etc), then (epsilon) and (delta)
          are approximately related by:

                                    |     ( (pi) 2)|
                                    | xcos( ----x )|
                                    |     (  2    )|
                         (epsilon)~=| -------------|(delta).
                                    |     C(x)     |

          Figure 1 shows the behaviour of the error amplification factor

          |     ( (pi) 2)|
          | xcos( ----x )|
          |     (  2    )|
          | -------------|.
          |     C(x)     |


                                     Figure 1
                   Please see figure in printed Reference Manual

          However if (delta) is of the same order as the machine precision,
          then rounding errors could make (epsilon) slightly larger than
          the above relation predicts.

          For small x, (epsilon)~=(delta) and there is no amplification of
          relative error.

          For moderately large values of x,

                                    |     ( (pi) 2)|
                       |(epsilon)|~=|2xcos( ----x )||(delta)|
                                    |     (  2    )|

          and the result will be subject to increasingly large
          amplification of errors. However the above relation breaks down
                                             1
          for large values of x (i.e., when  -- is of the order of the
                                              2
                                             x
          machine precision); in this region the relative error in the
                                              2
          result is essentially bounded by  -----).
                                            (pi)x

          Hence the effects of error amplification are limited and at worst
          the relative error loss should not exceed half the possible
          number of significant figures.

          8. Further Comments

          None.

          9. Example

          The example program reads values of the argument x from a file,
          evaluates the function at each value of x and prints the results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S21 -- Approximations of Special Functions                 S21BAF
                  S21BAF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S21BAF returns a value of an elementary integral, which occurs as
          a degenerate case of an elliptic integral of the first kind, via
          the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S21BAF (X, Y, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X, Y

          3. Description

          This routine calculates an approximate value for the integral

                                        infty
                                      1 /         dt
                             R (x,y)= - |     ----------
                              C       2 /       
                                        0     \/t+x(t+y)

          where x>=0 and y/=0.

          This function, which is related to the logarithm or inverse
          hyperbolic functions for y<x and to inverse circular functions if
          x<y, arises as a degenerate form of the elliptic integral of the
          first kind. If y<0, the result computed is the Cauchy principal
          value of the integral.

          The basic algorithm, which is due to Carlson [2] and [3], is to
          reduce the arguments recursively towards their mean by the
          system:

              x =x,
               0

              y =y
               0

              (mu) =(x +2y )/3,
                  n   n   n

              S =(y -x )/3(mu)
               n   n  n       n

                               

              (lambda) =y +2  /x y
                      n  n  \/  n n

              x   =(x +(lambda) )/4,
               n+1   n         n

              y   =(y +(lambda) )/4.
               n+1   n         n

          The quantity |S | for n=0,1,2,3,... decreases with increasing n,
                         n
                             n
          eventually |S |~1/4 . For small enough S  the required function
                       n                          n
          value can be approximated by the first few terms of the Taylor
          series about the mean. That is

                              (     2   3    4    5)
                              (   3S   S   3S   9S )
                              (     n   n    n    n)    
                      R (x,y)=(1+ ---+ --+ ---+ ---)/  /(mu) .
                       C      (   10   7    8   22 ) \/     n

          The truncation error involved in using this approximation is
                           6
          bounded by 16|S | /(1-2|S |) and the recursive process is stopped
                         n         n
          when S  is small enough for this truncation error to be
                n
          negligible compared to the machine precision.

          Within the domain of definition, the function value is itself
          representable for all representable values of its arguments.
          However, for values of the arguments near the extremes the above
          algorithm must be modified so as to avoid causing underflows or
          overflows in intermediate steps. In extreme regions arguments are
          pre-scaled away from the extremes and compensating scaling of the
          result is done before returning to the calling program.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Carlson B C (1978) Computing Elliptic Integrals by
                Duplication. (Preprint) Department of Physics, Iowa State
                University.

          [3]   Carlson B C (1988) A Table of Elliptic Integrals of the
                Third Kind. Math. Comput. 51 267--280.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input

           2:  Y -- DOUBLE PRECISION                                  Input
               On entry: the arguments x and y of the function,
               respectively. Constraint: X >= 0.0 and Y /= 0.0.

           3:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry X < 0.0; the function is undefined.

          IFAIL= 2
               On entryY = 0.0; the function is undefined.

               On soft failure the routine returns zero.

          7. Accuracy

          In principle the routine is capable of producing full machine
          precision. However round-off errors in internal arithmetic will
          result in slight loss of accuracy. This loss should never be
          excessive as the algorithm does not involve any significant
          amplification of round-off error. It is reasonable to assume that
          the result is accurate to within a small multiple of the machine
          precision.

          8. Further Comments

          Users should consult the Chapter Introduction which shows the
          relationship of this function to the classical definitions of the
          elliptic integrals.

          9. Example

          This example program simply generates a small set of non-extreme
          arguments which are used with the routine to produce the table of
          low accuracy results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S21 -- Approximations of Special Functions                 S21BBF
                  S21BBF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S21BBF returns a value of the symmetrised elliptic integral of
          the first kind, via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S21BBF (X, Y, Z, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X, Y, Z

          3. Description

          This routine calculates an approximation to the integral

                                     infty
                                   1 /            dt
                        R (x,y,z)= - |     -----------------
                         F         2 /       
                                     0     \/(t+x)(t+y)(t+z)

          where x, y, z>=0 and at most one is zero.

          The basic algorithm, which is due to Carlson [2] and [3], is to
          reduce the arguments recursively towards their mean by the rule:

               x =min(x,y,z),z =max(x,y,z),
                0             0

               y = remaining third intermediate value argument.
                0

          (This ordering, which is possible because of the symmetry of the
          function, is done for technical reasons related to the avoidance
          of overflow and underflow.)

              (mu) =   (x +y +3z )/3
                  n      n  n   n

              X    =   (1-x )/(mu)
               n           n      n

              Y    =   (1-y )/(mu)
               n           n      n

              Z    =   (1-z )/(mu)
               n           n      n

                                           

              (lambda) =  /x y +  /y z +  /z x
                      n \/  n n /  n n /  n n

              x    =   (x +(lambda) )/4
               n+1       n         n

              y    =   (y +(lambda) )/4
               n+1       n         n

              z    =   (z +(lambda) )/4
               n+1       n         n

          (epsilon) =max(|X |,|Y |,|Z |) and the function may be
                   n       n    n    n
          approximated adequately by a 5th order power series:

                                         (        2           )
                                         (   E   E   3E E   E )
                                    1    (    2   2    2 3   3)
                      R (x,y,z)= --------(1- --+ --- -----+ --)
                       F                 (   10  24   44    14)
                                   /(mu)
                                 \/     n

          where E =X Y +Y Z +Z X ,E =X Y Z .
                 2  n n  n n  n n  3  n n n

          The truncation error involved in using this approximation is
                              6
          bounded by (epsilon) /4(1-(epsilon) ) and the recursive process
                              n              n
          is stopped when this truncation error is negligible compared with
          the machine precision.

          Within the domain of definition, the function value is itself
          representable for all representable values of its arguments.
          However, for values of the arguments near the extremes the above
          algorithm must be modified so as to avoid causing underflows or
          overflows in intermediate steps. In extreme regions arguments are
          pre-scaled away from the extremes and compensating scaling of the
          result is done before returning to the calling program.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Carlson B C (1978) Computing Elliptic Integrals by
                Duplication. (Preprint) Department of Physics, Iowa State
                University.

          [3]   Carlson B C (1988) A Table of Elliptic Integrals of the
                Third Kind. Math. Comput. 51 267--280.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input

           2:  Y -- DOUBLE PRECISION                                  Input

           3:  Z -- DOUBLE PRECISION                                  Input
               On entry: the arguments x, y and z of the function.
               Constraint: X, Y, Z >= 0.0 and only one of X, Y and Z may be
               zero.

           4:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry one or more of X, Y and Z is negative; the function
               is undefined.

          IFAIL= 2
               On entry two or more of X, Y and Z are zero; the function is
               undefined.

               On soft failure, the routine returns zero.

          7. Accuracy

          In principle the routine is capable of producing full machine
          precision. However round-off errors in internal arithmetic will
          result in slight loss of accuracy. This loss should never be
          excessive as the algorithm does not involve any significant
          amplification of round-off error. It is reasonable to assume that
          the result is accurate to within a small multiple of the machine
          precision.

          8. Further Comments

          Users should consult the Chapter Introduction which shows the
          relationship of this function to the classical definitions of the
          elliptic integrals.

          If two arguments are equal, the function reduces to the
          elementary integral R , computed by S21BAF.
                               C

          9. Example

          This example program simply generates a small set of non-extreme
          arguments which are used with the routine to produce the table of
          low accuracy results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S21 -- Approximations of Special Functions                 S21BCF
                  S21BCF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S21BCF returns a value of the symmetrised elliptic integral of
          the second kind, via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S21BCF (X, Y, Z, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X, Y, Z

          3. Description

          This routine calculates an approximate value for the integral

                                    infty
                                  3 /             dt
                       R (x,y,z)= - |     -------------------
                        D         2 /        
                                    0       /               3
                                          \/ (t+x)(t+y)(t+z)

          where x, y>=0, at most one of x and y is zero, and z>0.

          The basic algorithm, which is due to Carlson [2] and [3], is to
          reduce the arguments recursively towards their mean by the rule:

              x    =   x
               0

              y    =   y
               0

              z    =   z
               0

              (mu) =   (x +y +3z )/5
                  n      n  n   n

              X    =   (1-x )/(mu)
               n           n      n

              Y    =   (1-y )/(mu)
               n           n      n

              Z    =   (1-z )/(mu)
               n           n      n

                                           

              (lambda) =  /x y +  /y z +  /z x
                       n\/  n n /  n n /  n n

              x    =   (x +(lambda) )/4
               n+1       n         n

              y    =   (y +(lambda) )/4
               n+1       n         n

              z    =   (z +(lambda) )/4
               n+1       n         n

          For n sufficiently large,

                                                       ( 1)n
                        (epsilon) =max(|X |,|Y |,|Z |)~( -)
                                 n       n    n    n   ( 4)

          and the function may be approximated adequately by a 5th order
                                   n-1          -m
                                   --          4
          power series R (x,y,z)=3 >   -------------------+
                        D          --                   
                                   m=0 (z +(lambda) )  /z
                                         m         n \/  m


               -n
              4     [   3 (2)  1 (3)  3   (2) 2  3  (4)  3  (2) (3)  3  (5)]
           ---------[1+ -S   + -S   + --(S   ) + --S   + --S   S   + --S   ]
                    [   7 n    3 n    22  n      11 n    13 n   n    13 n  ]
              /    3
             / (mu)
           \/      n

          where

                                 (m) ( m  m   m)
                                S   =(X +Y +3Z )/2m.
                                 n   ( n  n   n)

          The truncation error in this expansion is bounded by
                         6
               3(epsilon)
                         n
           ------------------- and the recursive process is terminated when
               

              /              3
             / (1-(epsilon) )
           \/              n
          this quantity is negligible compared with the machine precision.

          The routine may fail either because it has been called with
          arguments outside the domain of definition, or with arguments so
          extreme that there is an unavoidable danger of setting underflow
          or overflow.

                           -3/2
          Note: R (x,x,x)=x    , so there exists a region of extreme
                 D
          arguments for which the function value is not representable.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Carlson B C (1978) Computing Elliptic Integrals by
                Duplication. (Preprint) Department of Physics, Iowa State
                University.

          [3]   Carlson B C (1988) A Table of Elliptic Integrals of the
                Third Kind. Math. Comput. 51 267--280.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input

           2:  Y -- DOUBLE PRECISION                                  Input

           3:  Z -- DOUBLE PRECISION                                  Input
               On entry: the arguments x, y and z of the function.
               Constraint: X, Y >= 0.0, Z > 0.0 and only one of X and Y may
               be zero.

           4:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry either X or Y is negative, or both X and Y are
               zero; the function is undefined.

          IFAIL= 2
               On entry Z <= 0.0; the function is undefined.

          IFAIL= 3
               On entry either Z is too close to zero or both X and Y are
               too close to zero: there is a danger of setting overflow.

          IFAIL= 4
               On entry at least one of X, Y and Z is too large: there is a
               danger of setting underflow.

               On soft failure the routine returns zero.

          7. Accuracy

          In principle the routine is capable of producing full machine
          precision. However round-off errors in internal arithmetic will
          result in slight loss of accuracy. This loss should never be
          excessive as the algorithm does not involve any significant
          amplification of round-off error. It is reasonable to assume that
          the result is accurate to within a small multiple of the machine
          precision.

          8. Further Comments

          Users should consult the Chapter Introduction which shows the
          relationship of this function to the classical definitions of the
          elliptic integrals.

          9. Example

          This example program simply generates a small set of non-extreme
          arguments which are used with the routine to produce the table of
          low accuracy results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

          S21 -- Approximations of Special Functions                 S21BDF
                  S21BDF -- NAG Foundation Library Routine Document

          Note: Before using this routine, please read the Users' Note for
          your implementation to check implementation-dependent details.
          The symbol (*) after a NAG routine name denotes a routine that is
          not included in the Foundation Library.

          1. Purpose

          S21BDF returns a value of the symmetrised elliptic integral of
          the third kind, via the routine name.

          2. Specification

                 DOUBLE PRECISION FUNCTION S21BDF (X, Y, Z, R, IFAIL)
                 INTEGER          IFAIL
                 DOUBLE PRECISION X, Y, Z, R

          3. Description

          This routine calculates an approximation to the integral

                                    infty
                                  3 /                 dt
                 R (x,y,z,(rho))= - |     --------------------------
                  J               2 /                
                                    0     (t+(rho))\/(t+x)(t+y)(t+z)

          where x, y, z>=0, (rho)/=0 and at most one of x, y and z is zero.

          If p<0, the result computed is the Cauchy principal value of the
          integral.

          The basic algorithm, which is due to Carlson [2] and [3], is to
          reduce the arguments recursively towards their mean by the rule:

              x    =   x
               0

              y    =   y
               0

              z    =   z
               0

              (rho) =  (rho)
                   0

              (mu) =   (x +y +z +2(rho) )/5
                  n      n  n  n       n

              X    =   (1-x )/(mu)
               n           n      n

              Y    =   (1-y )/(mu)
               n           n      n

              Z    =   (1-z )/(mu)
               n           n      n

              P    =   (1-(rho) )/(mu)
               n               n      n

                                            

              (lambda) =   /x y +  /y z +  /z x
                        n\/  n n /  n n /  n n

              x    =   (x +(lambda) )/4
               n+1       n         n

              y    =   (y +(lambda) )/4
               n+1       n         n

              z    =   (z +(lambda) )/4
               n+1       n         n

              (rho) =  ((rho) +(lambda) )/4
                   n+1       n         n
                                                            2
                       [                                   ]
              (alpha) =[(rho) (  /x +  /y +  /z )+  /x y z ]
                     n [     n \/  n /  n /  n  /  n n n]

                                               2
              (beta) = (rho) ((rho) +(lambda) )
                    n       n      n         n

          For n sufficiently large,

                                                            1
                       (epsilon) =max(|X |,|Y |,|Z |,|P |)~ --
                                n       n    n    n    n     n
                                                            4

          and the function may be approximated by a 5th order power series
                            n-1
                            --  -m
          R (x,y,z,(rho))=3 >  4  R ((alpha) ,(beta) )
           J                --     C        m       m
                            m=0


                -n
               4     [   3 (2)  1 (3)  3   (2) 2  3  (4)  3  (2) (3)  3  (5)]
          + ---------[1+ -S   + -S   + --(S   ) + --S   + --S   S   + --S   ]
                     [   7 n    3 n    22  n      11 n    13 n   n    13 n  ]
               /    3
              / (mu)
            \/      n

                 (m)     m  m  m   m
          where S    = (X +Y +Z +2P )/2m.
                 n       n  n  n   n

          The truncation error in this expansion is bounded by
                          

                    6    /              3
          3(epsilon) /  / (1-(epsilon) )  and the recursion process is
                    n \/              n
          terminated when this quantity is negligible compared with the
          machine precision. The routine may fail either because it has
          been called with arguments outside the domain of definition or
          with arguments so extreme that there is an unavoidable danger of
          setting underflow or overflow.

                               3
                             - -
                               2

          Note: R (x,x,x,x)=x   , so there exists a region of extreme
                 J
          arguments for which the function value is not representable.

          4. References

          [1]   Abramowitz M and Stegun I A (1968) Handbook of Mathematical
                Functions. Dover Publications.

          [2]   Carlson B C (1978) Computing Elliptic Integrals by
                Duplication. (Preprint) Department of Physics, Iowa State
                University.

          [3]   Carlson B C (1988) A Table of Elliptic Integrals of the
                Third Kind. Math. Comput. 51 267--280.

          5. Parameters

           1:  X -- DOUBLE PRECISION                                  Input

           2:  Y -- DOUBLE PRECISION                                  Input

           3:  Z -- DOUBLE PRECISION                                  Input

           4:  R -- DOUBLE PRECISION                                  Input
               On entry: the arguments x, y, z and (rho) of the function.
               Constraint: X, Y, Z >= 0.0, R /= 0.0 and at most one of X, Y
               and Z may be zero.

           5:  IFAIL -- INTEGER                                Input/Output
               On entry: IFAIL must be set to 0, -1 or 1. For users not
               familiar with this parameter (described in the Essential
               Introduction) the recommended value is 0.

               On exit: IFAIL = 0 unless the routine detects an error (see
               Section 6).

          6. Error Indicators and Warnings

          Errors detected by the routine:

          If on entry IFAIL = 0 or -1, explanatory error messages are
          output on the current error message unit (as defined by X04AAF).

          IFAIL= 1
               On entry at least one of X, Y and Z is negative, or at least
               two of them are zero; the function is undefined.

          IFAIL= 2
               On entry R = 0.0; the function is undefined.

          IFAIL= 3
               On entry either R is too close to zero, or any two of X, Y
               and Z are too close to zero; there is a danger of setting
               overflow.

          IFAIL= 4
               On entry at least one of X, Y, Z and R is too large; there
               is a danger of setting underflow.

          IFAIL= 5
               An error has occurred in a call to S21BAF. Any such
               occurrence should be reported to NAG.

               On soft failure, the routine returns zero.

          7. Accuracy

          In principle the routine is capable of producing full machine
          precision. However round-off errors in internal arithmetic will
          result in slight loss of accuracy. This loss should never be
          excessive as the algorithm does not involve any significant
          amplification of round-off error. It is reasonable to assume that
          the result is accurate to within a small multiple of the machine
          precision.

          8. Further Comments

          Users should consult the Chapter Introduction which shows the
          relationship of this function to the classical definitions of the
          elliptic integrals.

          If the argument R is equal to any of the other arguments, the
          function reduces to the integral R , computed by S21BCF.
                                            D

          9. Example

          This example program simply generates a small set of non-extreme
          arguments which are used with the routine to produce the table of
          low accuracy results.

          The example program is not reproduced here. The source code for
          all example programs is distributed with the NAG Foundation
          Library software and should be available on-line.

