      SUBROUTINE AIRY(Z, NFUNC, ISCAL, AI, BI, AID, BID)                AIR   10
C P.J.PRINCE, MATHEMATICS DEPARTMENT, TEESSIDE POLYTECHNIC,
C MIDDLESBROUGH, CLEVELAND TS1 3BA, GREAT BRITAIN.
C JANUARY  9, 1975 .
C REFERENCES -
C (1) - ABRAMOWITZ,M. AND STEGUN,I.A. HANDBOOK OF
C       MATHEMATICAL FUNCTIONS. DOVER PUBLICATIONS INC.,
C       NEW YORK, 1965 PAGES 446,448-449,475-477 .
C (2) - FOX,L. AND PARKER,I.B. CHEBYSHEV POLYNOMIALS IN
C       NUMERICAL ANALYSIS. OXFORD UNIVERSITY PRESS,1968
C       PAGES 48-58,65-68 .
C (3) - BOND,GILLIAN AND PITTEWAY,M.L.V. ALGORITHM 301,
C       AIRY FUNCTION(S20). C.A.C.M. VOL. 10,NO. 5, MAY 1967
C THIS SUBROUTINE EVALUATES THE AIRY FUNCTIONS AND THEIR
C DERIVATIVES FOR ANY REAL ARGUMENT WITHIN COMPUTER
C CAPABILITY, BY MEANS OF CHEBYSHEV SERIES APPROXIMATIONS.
C Z          -   THE ARGUMENT FOR WHICH THE FUNCTIONS ARE
C                TO BE EVALUATED.
C AI,BI      -   THE AIRY FUNCTIONS.
C AID,BID    -   THEIR RESPECTIVE DERIVATIVES.
C NFUNC      -   INDICATES WHICH OF THE FUNCTIONS ARE TO BE
C                CALCULATED.
C ISCAL      -   INDICATES WHETHER OR NOT SCALING IS
C                REQUIRED.
C FOUR RANGES OF ARGUMENT Z ARE CONSIDERED -
C (A)  Z .LE. -7.0
C (B)  -7.0 .LT. Z .LE. 0.0
C (C)  0.0 .LT. Z .LT. 7.0
C (D)  Z .GE. 7.0
C THE SUBROUTINES COEF1, COEF2, COEF3 AND COEF4 WHICH ARE
C CALLED BY THIS SUBROUTINE CORRESPOND RESPECTIVELY TO
C THESE FOUR RANGES.
C THE FUNCTIONS CALCULATED ARE AS FOLLOWS -
C IF NFUNC IS NEGATIVE  AID,BID.
C IF NFUNC = 0  ALL FOUR.
C IF NFUNC IS POSITIVE  AI,BI.
C ISCAL INDICATES WHETHER OR NOT IN RANGE (D) THE FOLLOWING
C SCALING IS TO BE CARRIED OUT -
C (AI,AID) = (AI,AID)*EXP(ZETA), (BI,BID) = (BI,BID)*EXP(-ZETA)
C WHERE ZETA = 2.0/3.0*Z**1.5
C IF ISCAL = 0 THEN THERE IS NO SCALING OTHERWISE SCALING
C AS ABOVE.
C IN (A) THE FINAL ACCURACY IS HEAVILY DEPENDENT ON THE
C ACCURACY TO WHICH THE SINE AND COSINE OF
C ANG = 2.0/3.0*(-Z)**1.5+PI/4 CAN BE COMPUTED.
C IF ANGLM .LT. ANG .LE. ANGUP THEN SOME ACCURACY MAY BE
C LOST. A NON FATAL ERROR WARNING IS GIVEN.
C IF ANG .GT. ANGUP A NON FATAL ERROR WARNING IS GIVEN AND
C THE FOUR FUNCTIONS ARE ASSIGNED THE VALUE ZERO.
C IN (D) IF ISCAL = 0 OVERFLOW IN EXP WILL OCCUR IF
C Z .GE. ZLIM. IN THIS CASE A NON FATAL ERROR WARNING IS
C GIVEN AND THE FOLLOWING VALUES ARE ASSIGNED -
C AI = AID = 0.0
C BI = BID = EXP(ZLIM).
C IF ISCAL .NE. 0 OVERFLOW WILL OCCUR IF
C Z .GT. ZUP = ZMAX**(2.0/3.0) WHERE ZMAX IS THE MAXIMUM
C REPRESENTABLE NUMBER ON THE COMPUTER. IN THIS CASE A
C NON FATAL ERROR WARNING IS GIVEN AND THE FOUR FUNCTIONS
C ARE ASSIGNED THE VALUE ZERO.
C NOUT IS THE OUTPUT CHANNEL USED.
C THE MACHINE DEPENDENT CONSTANTS (VALUES BEING ASSIGNED BY
C APPROPRIATE DATA STATEMENTS) ARE -
C IN COEF1  -  ANGLM,ANGUP AND NOUT.
C IN COEF4  -  ZLIM,ZUP AND NOUT.
C FOR I.C.L. 1905E(11S FLOATING POINT ARITHMETIC) -
C ANGLM = 250.0, ANGUP = 1.0E10, NOUT = 2, ZLIM = 175.0,
C ZUP = 1.0E50, ZMAX = 5.6E76 .
      IF (Z) 10, 10, 40
   10 IF (Z+7.0) 20, 20, 30
   20 CALL COEF1(Z, NFUNC, AI, BI, AID, BID)
      RETURN
   30 CALL COEF2(Z, NFUNC, AI, BI, AID, BID)
      RETURN
   40 IF (Z-7.0) 50, 60, 60
   50 CALL COEF3(Z, NFUNC, AI, BI, AID, BID)
      RETURN
   60 CALL COEF4(Z, NFUNC, ISCAL, AI, BI, AID, BID)
      RETURN
      END
      SUBROUTINE COEF1(Z, NFUNC, AI, BI, AID, BID)                      COE   10
C THIS SUBROUTINE EVALUATES THE FOUR FUNCTIONS IN THE CASE
C WHEN Z .LE. -7.0 USING CHEBYSHEV SERIES APPROXIMATIONS TO
C THE CORRESPONDING ASYMPTOTIC EXPANSIONS.
      DIMENSION A(5), B(5), C(5), D(5)
      DATA A(1), A(2), A(3), A(4), A(5) /1.1282427601,
     * -0.6803534E-04,0.16687E-06,-0.128E-08,0.2E-10/
      DATA B(1), B(2), B(3), B(4), B(5) /0.7822108673E-01,
     * -0.6895649E-04,0.32857E-06,-0.370E-08,0.7E-10/
      DATA C(1), C(2), C(3), C(4), C(5) /1.1285404716,0.8046925E-04,
     * -0.18161E-06,0.135E-08,-0.2E-10/
      DATA D(1), D(2), D(3), D(4), D(5) /-0.10954855184,
     * 0.7713350E-04,-0.35168E-06,0.388E-08,-0.7E-10/
      DATA PI4 /0.78539816340/
      DATA ANGLM, ANGUP /250.0,1.0E10/
      DATA NOUT /2/
      X = -Z
      SX = SQRT(X)
      Y = X*SX
      ZETA = 0.66666666667*Y
      Z4 = SQRT(SX)
      ANG = ZETA + PI4
C TEST ARGUMENT SIZE FOR SIN AND COS.
      IF (ANGLM-ANG) 10, 40, 40
   10 IF (ANGUP-ANG) 20, 20, 30
   20 WRITE (NOUT,99999) Z, ANG
      AI = 0.0
      BI = 0.0
      AID = 0.0
      BID = 0.0
      RETURN
   30 WRITE (NOUT,99998) Z, ANG
   40 SN = SIN(ANG)
      CN = COS(ANG)
      ZETAI = 1.0/ZETA
      X = 7.0/X
      X = X*X*X
C ARGUMENT SCALED TO RANGE (0,1).
C EVALUATE THE RELEVANT SERIES.
      IF (NFUNC.LT.0) GO TO 50
      CALL CHEB(X, 5, A, FA)
      CALL CHEB(X, 5, B, FB)
      Z4I = 1.0/Z4
      FB = FB*ZETAI
      AI = Z4I*(SN*FA-CN*FB)
      BI = Z4I*(CN*FA+SN*FB)
      IF (NFUNC.GT.0) RETURN
   50 CALL CHEB(X, 5, C, FC)
      CALL CHEB(X, 5, D, FD)
      FD = FD*ZETAI
      AID = -Z4*(CN*FC+SN*FD)
      BID = Z4*(SN*FC-CN*FD)
      RETURN
99999 FORMAT (//38X, 3H***//5X, 28HANGLE OUTSIDE MACHINE RANGE,,
     * 38H THE FOUR FUNCTIONS HAVE BEEN ASSIGNED/5X, 11HTHE VALUE Z,
     * 4HERO.//5X, 4HZ = , E20.8, 10H  ANGLE = , E20.8//38X, 3H***//
     * )
99998 FORMAT (//38X, 3H***//5X, 25HSOME ACCURACY MAY BE LOST,
     * 16H IN SIN AND COS.//5X, 4HZ = , E20.8, 10H  ANGLE = ,
     * E20.8//38X, 3H***//)
      END
      SUBROUTINE COEF2(Z, NFUNC, AI, BI, AID, BID)                      COE   10
C THIS SUBROUTINE EVALUATES THE FOUR FUNCTIONS IN THE CASE
C WHEN -7.0 .LT. Z .LE. 0.0 USING CHEBYSHEV SERIES
C APPROXIMATIONS TO THE CORRESPONDING TAYLOR EXPANSIONS.
      DIMENSION A(17), B(16), C(16), D(17)
      DATA A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9),
     * A(10), A(11), A(12), A(13), A(14), A(15), A(16), A(17)
     * /0.11535880704,0.6542816649E-01,0.26091774326,0.21959346500,
     * 0.12476382168,-0.43476292594,0.28357718605,-0.9751797082E-01,
     * 0.2182551823E-01,-0.350454097E-02,0.42778312E-03,
     * -0.4127564E-04,0.323880E-05,-0.21123E-06,0.1165E-07,
     * -0.55E-09,0.2E-10/
      DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7), B(8), B(9),
     * B(10), B(11), B(12), B(13), B(14), B(15), B(16)
     * /0.10888288487,-0.17511655051,0.13887871101,-0.11469998998,
     * 0.22377807641,-0.18546243714,0.8063565186E-01,
     * -0.2208847864E-01,0.422444527E-02,-0.60131028E-03,
     * 0.6653890E-04,-0.590842E-05,0.43131E-06,-0.2638E-07,
     * 0.137E-08,-0.6E-10/
      DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9),
     * C(10), C(11), C(12), C(13), C(14), C(15), C(16)
     * /0.7571648463E-01,-0.10150232871,0.7800551669E-01,
     * -0.8324569361E-01,0.10105322731,-0.6578603344E-01,
     * 0.2500140353E-01,-0.625962704E-02,0.111945149E-02,
     * -0.15102718E-03,0.1598086E-04,-0.136545E-05,0.9636E-07,
     * -0.572E-08,0.29E-09,-0.1E-10/
      DATA D(1), D(2), D(3), D(4), D(5), D(6), D(7), D(8), D(9),
     * D(10), D(11), D(12), D(13), D(14), D(15), D(16), D(17)
     * /0.61603048107,0.85738069722,0.86345334421,0.80890228699,
     * -0.50565665369,-0.81829752697,0.77829538563,-0.31201242692,
     * 0.7677186198E-01,-0.1320520264E-01,0.170185698E-02,
     * -0.17177956E-03,0.1401068E-04,-0.94532E-06,0.5374E-07,
     * -0.261E-08,0.11E-09/
      DATA E1, E2, ROOT3 /0.35502805389,0.25881940379,1.7320508076/
      X = -0.29154518950E-02*Z*Z*Z
C ARGUMENT SCALED TO RANGE (0,1).
C EVALUATE THE RELEVANT SERIES.
      IF (NFUNC.LT.0) GO TO 10
      CALL CHEB(X, 17, A, FA)
      CALL CHEB(X, 16, B, FB)
      FA = E1*FA
      FB = E2*Z*FB
      AI = FA - FB
      BI = ROOT3*(FA+FB)
      IF (NFUNC.GT.0) RETURN
   10 CALL CHEB(X, 16, C, FC)
      CALL CHEB(X, 17, D, FD)
      FC = E1*Z*Z*FC
      FD = E2*FD
      AID = FC - FD
      BID = ROOT3*(FC+FD)
      RETURN
      END
      SUBROUTINE COEF3(Z, NFUNC, AI, BI, AID, BID)                      COE   10
C THIS SUBROUTINE EVALUATES THE FOUR FUNCTIONS IN THE CASE
C WHEN 0.0 .LT. Z .LT. 7.0 USING CHEBYSHEV SERIES
C APPROXIMATIONS TO THE CORRESPONDING WEIGHTED FUNCTIONS.
      DIMENSION A(20), B(25), C(22), D(24)
      DATA A(1), A(2), A(3), A(4), A(5), A(6), A(7), A(8), A(9),
     * A(10), A(11), A(12), A(13), A(14), A(15), A(16), A(17),
     * A(18), A(19), A(20) /1.2974695794,-0.20230907821,
     * -0.45786169516,0.12953331987,0.6983827954E-01,
     * -0.3005148746E-01,-0.493036334E-02,0.390425474E-02,
     * -0.1546539E-04,-0.32193999E-03,0.3812734E-04,0.1714935E-04,
     * -0.416096E-05,-0.50623E-06,0.26346E-06,-0.281E-08,
     * -0.1122E-07,0.120E-08,0.31E-09,-0.7E-10/
      DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7), B(8), B(9),
     * B(10), B(11), B(12), B(13), B(14), B(15), B(16), B(17),
     * B(18), B(19), B(20), B(21), B(22), B(23), B(24), B(25)
     * /0.47839902387,-0.6881732880E-01,0.20938146768,
     * -0.3988095886E-01,0.4758441683E-01,-0.812296149E-02,
     * 0.462845913E-02,0.70010098E-03,-0.75611274E-03,
     * 0.68958657E-03,-0.33621865E-03,0.14501668E-03,-0.4766359E-04,
     * 0.1251965E-04,-0.193012E-05,-0.19032E-06,0.29390E-06,
     * -0.13436E-06,0.4231E-07,-0.967E-08,0.135E-08,0.7E-10,
     * -0.12E-09,0.4E-10,-0.1E-10/
      DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9),
     * C(10), C(11), C(12), C(13), C(14), C(15), C(16), C(17),
     * C(18), C(19), C(20), C(21), C(22) /-2.2359158747,
     * -0.2638272392E-01,0.95151904332,-0.8383641182E-01,
     * -0.19401303219,0.3580664778E-01,0.2269348562E-01,
     * -0.671179820E-02,-0.152460473E-02,0.75474150E-03,
     * 0.3729934E-04,-0.5653536E-04,0.350796E-05,0.289418E-05,
     * -0.47423E-06,-0.9449E-07,0.3054E-07,0.109E-08,-0.130E-08,
     * 0.8E-10,0.4E-10,-0.1E-10/
      DATA D(1), D(2), D(3), D(4), D(5), D(6), D(7), D(8), D(9),
     * D(10), D(11), D(12), D(13), D(14), D(15), D(16), D(17),
     * D(18), D(19), D(20), D(21), D(22), D(23), D(24)
     * /0.71364662990,0.23777925892,0.28219009446,0.4912480040E-01,
     * 0.6741261353E-01,-0.406308553E-02,0.1544814895E-01,
     * -0.449172894E-02,0.322474426E-02,-0.105361380E-02,
     * 0.41311371E-03,-0.8536169E-04,0.655166E-05,0.960458E-05,
     * -0.641792E-05,0.280308E-05,-0.89454E-06,0.21392E-06,
     * -0.2958E-07,-0.309E-08,0.376E-08,-0.148E-08,0.39E-09,
     * -0.7E-10/
      X = 0.14285714286*Z
      EX = EXP(1.75*Z)
      EY = 1.0/EX
C ARGUMENT SCALED TO RANGE (0,1).
C EVALUATE THE RELEVANT SERIES.
      IF (NFUNC.LT.0) GO TO 10
      CALL CHEB(X, 20, A, AI)
      CALL CHEB(X, 25, B, BI)
C MULTIPLY BY APPROPRIATE WEIGHTING FACTORS.
      AI = AI*EY
      BI = BI*EX
      IF (NFUNC.GT.0) RETURN
   10 CALL CHEB(X, 22, C, AID)
      CALL CHEB(X, 24, D, BID)
C MULTIPLY BY APPROPRIATE WEIGHTING FACTORS.
      AID = AID*EY
      BID = BID*EX
      RETURN
      END
      SUBROUTINE COEF4(Z, NFUNC, ISCAL, AI, BI, AID, BID)               COE   10
C THIS SUBROUTINE EVALUATES THE FOUR FUNCTIONS (SCALED
C UNLESS ISCAL = 0) IN THE CASE WHEN Z .GE. 7.0 USING
C CHEBYSHEV SERIES APPROXIMATIONS TO THE CORRESPONDING
C ASYMPTOTIC EXPANSIONS.
      DIMENSION A(7), B(7), C(7), D(7)
      DATA A(1), A(2), A(3), A(4), A(5), A(6), A(7)
     * /0.56265126169,-0.76136219E-03,0.765252E-05,-0.14228E-06,
     * 0.380E-08,-0.13E-09,0.1E-10/
      DATA B(1), B(2), B(3), B(4), B(5), B(6), B(7)
     * /1.1316635302,0.166141673E-02,0.1968882E-04,0.47047E-06,
     * 0.1769E-07,0.94E-09,0.6E-10/
      DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7)
     * /0.56635357764,0.107273242E-02,-0.910034E-05,0.15998E-06,
     * -0.415E-08,0.14E-09,-0.1E-10/
      DATA D(1), D(2), D(3), D(4), D(5), D(6), D(7)
     * /1.1238058432,-0.230925296E-02,-0.2309457E-04,-0.52171E-06,
     * -0.1907E-07,-0.100E-08,-0.7E-10/
      DATA ZLIM, ZUP /175.0,1.0E50/
      DATA NOUT /2/
C TEST FOR OVERFLOW IN Z**1.5 .
      IF (ZUP-Z) 10, 20, 20
   10 WRITE (NOUT,99999) Z
      AI = 0.0
      BI = 0.0
      AID = 0.0
      BID = 0.0
      RETURN
   20 SZ = SQRT(Z)
      Y = Z*SZ
      Z4 = SQRT(SZ)
      IF (ISCAL) 30, 40, 30
   30 EX = 1.0
      EY = 1.0
      GO TO 70
   40 ZETA = 0.66666666667*Y
C TEST FOR OVERFLOW IN EXP
      IF (ZLIM-ZETA) 50, 60, 60
   50 WRITE (NOUT,99998) Z, ZETA
      AI = 0.0
      AID = 0.0
      BI = EXP(ZLIM)
      BID = BI
      RETURN
   60 EX = EXP(ZETA)
      EY = 1.0/EX
   70 X = 18.520259177/Y
C ARGUMENT SCALED TO RANGE (0,1).
C EVALUATE THE RELEVANT SERIES.
      IF (NFUNC.LT.0) GO TO 80
      CALL CHEB(X, 7, A, AI)
      CALL CHEB(X, 7, B, BI)
      Z4I = 1.0/Z4
      AI = Z4I*AI*EY
      BI = Z4I*BI*EX
      IF (NFUNC.GT.0) RETURN
   80 CALL CHEB(X, 7, C, AID)
      CALL CHEB(X, 7, D, BID)
      AID = -Z4*AID*EY
      BID = Z4*BID*EX
      RETURN
99999 FORMAT (//38X, 3H***//5X, 18HOVERFLOW IN Z**1.5//5X, 4HZ = ,
     * E20.8//5X, 41HTHE FOUR FUNCTIONS HAVE BEEN ASSIGNED THE,
     * 12H VALUE ZERO.//38X, 3H***//)
99998 FORMAT (//38X, 3H***//5X, 21HOVERFLOW IN EXP(ZETA)//5X,
     * 4HZ = , E20.8, 9H  ZETA = , E20.8//5X, 18HTHE FOLLOWING VALU,
     * 23HES HAVE BEEN ASSIGNED -//5X, 25HAI = AID = 0.0, BI = BID ,
     * 11H= EXP(ZLIM)//38X, 3H***//)
      END
      SUBROUTINE CHEB(X, N, A, F)                                       CHE   10
C THIS SUBROUTINE APPLIES THE RICE ALGORITHM TO THE SUM
C F(X) = SIGMA-PRIME (R=1 TO N) A(R)*TSTAR-SUB-(R-1)(X)
C WHERE THE TSTAR-SUB-R(X) ARE THE SHIFTED CHEBYSHEV
C POLYNOMIALS.
C X    -    THE ARGUMENT FOR WHICH THE SERIES IS TO BE
C           EVALUATED.  (0.0 .LE. X .LE. 1.0).
C N    -    THE NUMBER OF TERMS OF THE SERIES TO BE SUMMED.
C A(R) -    THE CHEBYSHEV COEFFICIENTS FOR THE SERIES.
C F    -    THE COMPUTED SUM OF THE SERIES.
      DIMENSION A(25)
      B = 0.0
      D = A(N)
      U = X + X - 1.0
      Y = U + U
      J = N - 1
      DO 10 I=3,N
        C = B
        B = D
        D = Y*B - C + A(J)
        J = J - 1
   10 CONTINUE
      F = U*D - B + 0.5*A(1)
      RETURN
      END
