changeset 3217:8b0cb8f79fdc

[project @ 1998-11-11 23:32:20 by jwe]
author jwe
date Wed, 11 Nov 1998 23:34:17 +0000
parents 60a89a69a70a
children 2c91af0db179
files libcruft/amos/Makefile.in libcruft/amos/README libcruft/amos/dgamln.f libcruft/amos/xzabs.f libcruft/amos/xzexp.f libcruft/amos/xzlog.f libcruft/amos/xzsqrt.f libcruft/amos/zacai.f libcruft/amos/zacon.f libcruft/amos/zairy.f libcruft/amos/zasyi.f libcruft/amos/zbesh.f libcruft/amos/zbesi.f libcruft/amos/zbesj.f libcruft/amos/zbesk.f libcruft/amos/zbesy.f libcruft/amos/zbinu.f libcruft/amos/zbiry.f libcruft/amos/zbknu.f libcruft/amos/zbuni.f libcruft/amos/zbunk.f libcruft/amos/zdiv.f libcruft/amos/zkscl.f libcruft/amos/zmlri.f libcruft/amos/zmlt.f libcruft/amos/zrati.f libcruft/amos/zs1s2.f libcruft/amos/zseri.f libcruft/amos/zshch.f libcruft/amos/zuchk.f libcruft/amos/zunhj.f libcruft/amos/zuni1.f libcruft/amos/zuni2.f libcruft/amos/zunik.f libcruft/amos/zunk1.f libcruft/amos/zunk2.f libcruft/amos/zuoik.f libcruft/amos/zwrsk.f libcruft/specfun/Makefile.in libcruft/specfun/ribesl.f libcruft/specfun/rjbesl.f libcruft/specfun/rkbesl.f libcruft/specfun/rybesl.f
diffstat 43 files changed, 7269 insertions(+), 1882 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/Makefile.in
@@ -0,0 +1,19 @@
+#
+# Makefile for octave's libcruft/amos directory
+#
+# John W. Eaton
+# jwe@bevo.che.wisc.edu
+# University of Wisconsin-Madison
+# Department of Chemical Engineering
+
+TOPDIR = ../..
+
+srcdir = @srcdir@
+top_srcdir = @top_srcdir@
+VPATH = @srcdir@
+
+EXTERNAL_DISTFILES = $(DISTFILES)
+
+include $(TOPDIR)/Makeconf
+
+include ../Makerules
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/README
@@ -0,0 +1,17 @@
+The files in this directory have been modified from those found on
+netlib by changing the following subroutine names
+
+  zabs --> xzabs
+  zexp --> xzexp
+  zlog --> xzlog
+  zsqrt --> xzsqrt
+
+to avoid conflicts with non-standard but commonly used Fortran
+intrinsic function names.
+
+John W. Eaton
+jwe@bevo.che.wisc.edu
+University of Wisconsin-Madison
+Department of Chemical Engineering
+
+Wed Nov 11 17:29:50 1998
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/dgamln.f
@@ -0,0 +1,189 @@
+      DOUBLE PRECISION FUNCTION DGAMLN(Z,IERR)
+C***BEGIN PROLOGUE  DGAMLN
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  830501   (YYMMDD)
+C***CATEGORY NO.  B5F
+C***KEYWORDS  GAMMA FUNCTION,LOGARITHM OF GAMMA FUNCTION
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE THE LOGARITHM OF THE GAMMA FUNCTION
+C***DESCRIPTION
+C
+C               **** A DOUBLE PRECISION ROUTINE ****
+C         DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR
+C         Z.GT.0.  THE ASYMPTOTIC EXPANSION IS USED TO GENERATE VALUES
+C         GREATER THAN ZMIN WHICH ARE ADJUSTED BY THE RECURSION
+C         G(Z+1)=Z*G(Z) FOR Z.LE.ZMIN.  THE FUNCTION WAS MADE AS
+C         PORTABLE AS POSSIBLE BY COMPUTIMG ZMIN FROM THE NUMBER OF BASE
+C         10 DIGITS IN A WORD, RLN=AMAX1(-ALOG10(R1MACH(4)),0.5E-18)
+C         LIMITED TO 18 DIGITS OF (RELATIVE) ACCURACY.
+C
+C         SINCE INTEGER ARGUMENTS ARE COMMON, A TABLE LOOK UP ON 100
+C         VALUES IS USED FOR SPEED OF EXECUTION.
+C
+C     DESCRIPTION OF ARGUMENTS
+C
+C         INPUT      Z IS D0UBLE PRECISION
+C           Z      - ARGUMENT, Z.GT.0.0D0
+C
+C         OUTPUT      DGAMLN IS DOUBLE PRECISION
+C           DGAMLN  - NATURAL LOG OF THE GAMMA FUNCTION AT Z.NE.0.0D0
+C           IERR    - ERROR FLAG
+C                     IERR=0, NORMAL RETURN, COMPUTATION COMPLETED
+C                     IERR=1, Z.LE.0.0D0,    NO COMPUTATION
+C
+C
+C***REFERENCES  COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
+C***ROUTINES CALLED  I1MACH,D1MACH
+C***END PROLOGUE  DGAMLN
+      DOUBLE PRECISION CF, CON, FLN, FZ, GLN, RLN, S, TLG, TRM, TST,
+     * T1, WDTOL, Z, ZDMY, ZINC, ZM, ZMIN, ZP, ZSQ, D1MACH
+      INTEGER I, IERR, I1M, K, MZ, NZ, I1MACH
+      DIMENSION CF(22), GLN(100)
+C           LNGAMMA(N), N=1,100
+      DATA GLN(1), GLN(2), GLN(3), GLN(4), GLN(5), GLN(6), GLN(7),
+     1     GLN(8), GLN(9), GLN(10), GLN(11), GLN(12), GLN(13), GLN(14),
+     2     GLN(15), GLN(16), GLN(17), GLN(18), GLN(19), GLN(20),
+     3     GLN(21), GLN(22)/
+     4     0.00000000000000000D+00,     0.00000000000000000D+00,
+     5     6.93147180559945309D-01,     1.79175946922805500D+00,
+     6     3.17805383034794562D+00,     4.78749174278204599D+00,
+     7     6.57925121201010100D+00,     8.52516136106541430D+00,
+     8     1.06046029027452502D+01,     1.28018274800814696D+01,
+     9     1.51044125730755153D+01,     1.75023078458738858D+01,
+     A     1.99872144956618861D+01,     2.25521638531234229D+01,
+     B     2.51912211827386815D+01,     2.78992713838408916D+01,
+     C     3.06718601060806728D+01,     3.35050734501368889D+01,
+     D     3.63954452080330536D+01,     3.93398841871994940D+01,
+     E     4.23356164607534850D+01,     4.53801388984769080D+01/
+      DATA GLN(23), GLN(24), GLN(25), GLN(26), GLN(27), GLN(28),
+     1     GLN(29), GLN(30), GLN(31), GLN(32), GLN(33), GLN(34),
+     2     GLN(35), GLN(36), GLN(37), GLN(38), GLN(39), GLN(40),
+     3     GLN(41), GLN(42), GLN(43), GLN(44)/
+     4     4.84711813518352239D+01,     5.16066755677643736D+01,
+     5     5.47847293981123192D+01,     5.80036052229805199D+01,
+     6     6.12617017610020020D+01,     6.45575386270063311D+01,
+     7     6.78897431371815350D+01,     7.12570389671680090D+01,
+     8     7.46582363488301644D+01,     7.80922235533153106D+01,
+     9     8.15579594561150372D+01,     8.50544670175815174D+01,
+     A     8.85808275421976788D+01,     9.21361756036870925D+01,
+     B     9.57196945421432025D+01,     9.93306124547874269D+01,
+     C     1.02968198614513813D+02,     1.06631760260643459D+02,
+     D     1.10320639714757395D+02,     1.14034211781461703D+02,
+     E     1.17771881399745072D+02,     1.21533081515438634D+02/
+      DATA GLN(45), GLN(46), GLN(47), GLN(48), GLN(49), GLN(50),
+     1     GLN(51), GLN(52), GLN(53), GLN(54), GLN(55), GLN(56),
+     2     GLN(57), GLN(58), GLN(59), GLN(60), GLN(61), GLN(62),
+     3     GLN(63), GLN(64), GLN(65), GLN(66)/
+     4     1.25317271149356895D+02,     1.29123933639127215D+02,
+     5     1.32952575035616310D+02,     1.36802722637326368D+02,
+     6     1.40673923648234259D+02,     1.44565743946344886D+02,
+     7     1.48477766951773032D+02,     1.52409592584497358D+02,
+     8     1.56360836303078785D+02,     1.60331128216630907D+02,
+     9     1.64320112263195181D+02,     1.68327445448427652D+02,
+     A     1.72352797139162802D+02,     1.76395848406997352D+02,
+     B     1.80456291417543771D+02,     1.84533828861449491D+02,
+     C     1.88628173423671591D+02,     1.92739047287844902D+02,
+     D     1.96866181672889994D+02,     2.01009316399281527D+02,
+     E     2.05168199482641199D+02,     2.09342586752536836D+02/
+      DATA GLN(67), GLN(68), GLN(69), GLN(70), GLN(71), GLN(72),
+     1     GLN(73), GLN(74), GLN(75), GLN(76), GLN(77), GLN(78),
+     2     GLN(79), GLN(80), GLN(81), GLN(82), GLN(83), GLN(84),
+     3     GLN(85), GLN(86), GLN(87), GLN(88)/
+     4     2.13532241494563261D+02,     2.17736934113954227D+02,
+     5     2.21956441819130334D+02,     2.26190548323727593D+02,
+     6     2.30439043565776952D+02,     2.34701723442818268D+02,
+     7     2.38978389561834323D+02,     2.43268849002982714D+02,
+     8     2.47572914096186884D+02,     2.51890402209723194D+02,
+     9     2.56221135550009525D+02,     2.60564940971863209D+02,
+     A     2.64921649798552801D+02,     2.69291097651019823D+02,
+     B     2.73673124285693704D+02,     2.78067573440366143D+02,
+     C     2.82474292687630396D+02,     2.86893133295426994D+02,
+     D     2.91323950094270308D+02,     2.95766601350760624D+02,
+     E     3.00220948647014132D+02,     3.04686856765668715D+02/
+      DATA GLN(89), GLN(90), GLN(91), GLN(92), GLN(93), GLN(94),
+     1     GLN(95), GLN(96), GLN(97), GLN(98), GLN(99), GLN(100)/
+     2     3.09164193580146922D+02,     3.13652829949879062D+02,
+     3     3.18152639620209327D+02,     3.22663499126726177D+02,
+     4     3.27185287703775217D+02,     3.31717887196928473D+02,
+     5     3.36261181979198477D+02,     3.40815058870799018D+02,
+     6     3.45379407062266854D+02,     3.49954118040770237D+02,
+     7     3.54539085519440809D+02,     3.59134205369575399D+02/
+C             COEFFICIENTS OF ASYMPTOTIC EXPANSION
+      DATA CF(1), CF(2), CF(3), CF(4), CF(5), CF(6), CF(7), CF(8),
+     1     CF(9), CF(10), CF(11), CF(12), CF(13), CF(14), CF(15),
+     2     CF(16), CF(17), CF(18), CF(19), CF(20), CF(21), CF(22)/
+     3     8.33333333333333333D-02,    -2.77777777777777778D-03,
+     4     7.93650793650793651D-04,    -5.95238095238095238D-04,
+     5     8.41750841750841751D-04,    -1.91752691752691753D-03,
+     6     6.41025641025641026D-03,    -2.95506535947712418D-02,
+     7     1.79644372368830573D-01,    -1.39243221690590112D+00,
+     8     1.34028640441683920D+01,    -1.56848284626002017D+02,
+     9     2.19310333333333333D+03,    -3.61087712537249894D+04,
+     A     6.91472268851313067D+05,    -1.52382215394074162D+07,
+     B     3.82900751391414141D+08,    -1.08822660357843911D+10,
+     C     3.47320283765002252D+11,    -1.23696021422692745D+13,
+     D     4.88788064793079335D+14,    -2.13203339609193739D+16/
+C
+C             LN(2*PI)
+      DATA CON                    /     1.83787706640934548D+00/
+C
+C***FIRST EXECUTABLE STATEMENT  DGAMLN
+      IERR=0
+      IF (Z.LE.0.0D0) GO TO 70
+      IF (Z.GT.101.0D0) GO TO 10
+      NZ = INT(SNGL(Z))
+      FZ = Z - FLOAT(NZ)
+      IF (FZ.GT.0.0D0) GO TO 10
+      IF (NZ.GT.100) GO TO 10
+      DGAMLN = GLN(NZ)
+      RETURN
+   10 CONTINUE
+      WDTOL = D1MACH(4)
+      WDTOL = DMAX1(WDTOL,0.5D-18)
+      I1M = I1MACH(14)
+      RLN = D1MACH(5)*FLOAT(I1M)
+      FLN = DMIN1(RLN,20.0D0)
+      FLN = DMAX1(FLN,3.0D0)
+      FLN = FLN - 3.0D0
+      ZM = 1.8000D0 + 0.3875D0*FLN
+      MZ = INT(SNGL(ZM)) + 1
+      ZMIN = FLOAT(MZ)
+      ZDMY = Z
+      ZINC = 0.0D0
+      IF (Z.GE.ZMIN) GO TO 20
+      ZINC = ZMIN - FLOAT(NZ)
+      ZDMY = Z + ZINC
+   20 CONTINUE
+      ZP = 1.0D0/ZDMY
+      T1 = CF(1)*ZP
+      S = T1
+      IF (ZP.LT.WDTOL) GO TO 40
+      ZSQ = ZP*ZP
+      TST = T1*WDTOL
+      DO 30 K=2,22
+        ZP = ZP*ZSQ
+        TRM = CF(K)*ZP
+        IF (DABS(TRM).LT.TST) GO TO 40
+        S = S + TRM
+   30 CONTINUE
+   40 CONTINUE
+      IF (ZINC.NE.0.0D0) GO TO 50
+      TLG = DLOG(Z)
+      DGAMLN = Z*(TLG-1.0D0) + 0.5D0*(CON-TLG) + S
+      RETURN
+   50 CONTINUE
+      ZP = 1.0D0
+      NZ = INT(SNGL(ZINC))
+      DO 60 I=1,NZ
+        ZP = ZP*(Z+FLOAT(I-1))
+   60 CONTINUE
+      TLG = DLOG(ZDMY)
+      DGAMLN = ZDMY*(TLG-1.0D0) - DLOG(ZP) + 0.5D0*(CON-TLG) + S
+      RETURN
+C
+C
+   70 CONTINUE
+      IERR=1
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/xzabs.f
@@ -0,0 +1,29 @@
+      DOUBLE PRECISION FUNCTION XZABS(ZR, ZI)
+C***BEGIN PROLOGUE  XZABS
+C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
+C
+C     XZABS COMPUTES THE ABSOLUTE VALUE OR MAGNITUDE OF A DOUBLE
+C     PRECISION COMPLEX VARIABLE CMPLX(ZR,ZI)
+C
+C***ROUTINES CALLED  (NONE)
+C***END PROLOGUE  XZABS
+      DOUBLE PRECISION ZR, ZI, U, V, Q, S
+      U = DABS(ZR)
+      V = DABS(ZI)
+      S = U + V
+C-----------------------------------------------------------------------
+C     S*1.0D0 MAKES AN UNNORMALIZED UNDERFLOW ON CDC MACHINES INTO A
+C     TRUE FLOATING ZERO
+C-----------------------------------------------------------------------
+      S = S*1.0D+0
+      IF (S.EQ.0.0D+0) GO TO 20
+      IF (U.GT.V) GO TO 10
+      Q = U/V
+      XZABS = V*DSQRT(1.D+0+Q*Q)
+      RETURN
+   10 Q = V/U
+      XZABS = U*DSQRT(1.D+0+Q*Q)
+      RETURN
+   20 XZABS = 0.0D+0
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/xzexp.f
@@ -0,0 +1,16 @@
+      SUBROUTINE XZEXP(AR, AI, BR, BI)
+C***BEGIN PROLOGUE  XZEXP
+C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
+C
+C     DOUBLE PRECISION COMPLEX EXPONENTIAL FUNCTION B=EXP(A)
+C
+C***ROUTINES CALLED  (NONE)
+C***END PROLOGUE  XZEXP
+      DOUBLE PRECISION AR, AI, BR, BI, ZM, CA, CB
+      ZM = DEXP(AR)
+      CA = ZM*DCOS(AI)
+      CB = ZM*DSIN(AI)
+      BR = CA
+      BI = CB
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/xzlog.f
@@ -0,0 +1,41 @@
+      SUBROUTINE XZLOG(AR, AI, BR, BI, IERR)
+C***BEGIN PROLOGUE  XZLOG
+C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
+C
+C     DOUBLE PRECISION COMPLEX LOGARITHM B=CLOG(A)
+C     IERR=0,NORMAL RETURN      IERR=1, Z=CMPLX(0.0,0.0)
+C***ROUTINES CALLED  XZABS
+C***END PROLOGUE  XZLOG
+      DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DHPI
+      DOUBLE PRECISION XZABS
+      DATA DPI , DHPI  / 3.141592653589793238462643383D+0,
+     1                   1.570796326794896619231321696D+0/
+C
+      IERR=0
+      IF (AR.EQ.0.0D+0) GO TO 10
+      IF (AI.EQ.0.0D+0) GO TO 20
+      DTHETA = DATAN(AI/AR)
+      IF (DTHETA.LE.0.0D+0) GO TO 40
+      IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
+      GO TO 50
+   10 IF (AI.EQ.0.0D+0) GO TO 60
+      BI = DHPI
+      BR = DLOG(DABS(AI))
+      IF (AI.LT.0.0D+0) BI = -BI
+      RETURN
+   20 IF (AR.GT.0.0D+0) GO TO 30
+      BR = DLOG(DABS(AR))
+      BI = DPI
+      RETURN
+   30 BR = DLOG(AR)
+      BI = 0.0D+0
+      RETURN
+   40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
+   50 ZM = XZABS(AR,AI)
+      BR = DLOG(ZM)
+      BI = DTHETA
+      RETURN
+   60 CONTINUE
+      IERR=1
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/xzsqrt.f
@@ -0,0 +1,44 @@
+      SUBROUTINE XZSQRT(AR, AI, BR, BI)
+C***BEGIN PROLOGUE  XZSQRT
+C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
+C
+C     DOUBLE PRECISION COMPLEX SQUARE ROOT, B=CSQRT(A)
+C
+C***ROUTINES CALLED  XZABS
+C***END PROLOGUE  XZSQRT
+      DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DRT
+      DOUBLE PRECISION XZABS
+      DATA DRT , DPI / 7.071067811865475244008443621D-1,
+     1                 3.141592653589793238462643383D+0/
+      ZM = XZABS(AR,AI)
+      ZM = DSQRT(ZM)
+      IF (AR.EQ.0.0D+0) GO TO 10
+      IF (AI.EQ.0.0D+0) GO TO 20
+      DTHETA = DATAN(AI/AR)
+      IF (DTHETA.LE.0.0D+0) GO TO 40
+      IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
+      GO TO 50
+   10 IF (AI.GT.0.0D+0) GO TO 60
+      IF (AI.LT.0.0D+0) GO TO 70
+      BR = 0.0D+0
+      BI = 0.0D+0
+      RETURN
+   20 IF (AR.GT.0.0D+0) GO TO 30
+      BR = 0.0D+0
+      BI = DSQRT(DABS(AR))
+      RETURN
+   30 BR = DSQRT(AR)
+      BI = 0.0D+0
+      RETURN
+   40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
+   50 DTHETA = DTHETA*0.5D+0
+      BR = ZM*DCOS(DTHETA)
+      BI = ZM*DSIN(DTHETA)
+      RETURN
+   60 BR = ZM*DRT
+      BI = ZM*DRT
+      RETURN
+   70 BR = ZM*DRT
+      BI = -ZM*DRT
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zacai.f
@@ -0,0 +1,99 @@
+      SUBROUTINE ZACAI(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, TOL,
+     * ELIM, ALIM)
+C***BEGIN PROLOGUE  ZACAI
+C***REFER TO  ZAIRY
+C
+C     ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA
+C
+C         K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
+C                 MP=PI*MR*CMPLX(0.0,1.0)
+C
+C     TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
+C     HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1.
+C     ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND
+C     RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON
+C     IS CALLED FROM ZAIRY.
+C
+C***ROUTINES CALLED  ZASYI,ZBKNU,ZMLRI,ZSERI,ZS1S2,D1MACH,XZABS
+C***END PROLOGUE  ZACAI
+C     COMPLEX CSGN,CSPN,C1,C2,Y,Z,ZN,CY
+      DOUBLE PRECISION ALIM, ARG, ASCLE, AZ, CSGNR, CSGNI, CSPNR,
+     * CSPNI, C1R, C1I, C2R, C2I, CYR, CYI, DFNU, ELIM, FMR, FNU, PI,
+     * RL, SGN, TOL, YY, YR, YI, ZR, ZI, ZNR, ZNI, D1MACH, XZABS
+      INTEGER INU, IUF, KODE, MR, N, NN, NW, NZ
+      DIMENSION YR(N), YI(N), CYR(2), CYI(2)
+      DATA PI / 3.14159265358979324D0 /
+      NZ = 0
+      ZNR = -ZR
+      ZNI = -ZI
+      AZ = XZABS(ZR,ZI)
+      NN = N
+      DFNU = FNU + DBLE(FLOAT(N-1))
+      IF (AZ.LE.2.0D0) GO TO 10
+      IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
+   10 CONTINUE
+C-----------------------------------------------------------------------
+C     POWER SERIES FOR THE I FUNCTION
+C-----------------------------------------------------------------------
+      CALL ZSERI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL, ELIM, ALIM)
+      GO TO 40
+   20 CONTINUE
+      IF (AZ.LT.RL) GO TO 30
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION
+C-----------------------------------------------------------------------
+      CALL ZASYI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, TOL, ELIM,
+     * ALIM)
+      IF (NW.LT.0) GO TO 80
+      GO TO 40
+   30 CONTINUE
+C-----------------------------------------------------------------------
+C     MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION
+C-----------------------------------------------------------------------
+      CALL ZMLRI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL)
+      IF(NW.LT.0) GO TO 80
+   40 CONTINUE
+C-----------------------------------------------------------------------
+C     ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
+C-----------------------------------------------------------------------
+      CALL ZBKNU(ZNR, ZNI, FNU, KODE, 1, CYR, CYI, NW, TOL, ELIM, ALIM)
+      IF (NW.NE.0) GO TO 80
+      FMR = DBLE(FLOAT(MR))
+      SGN = -DSIGN(PI,FMR)
+      CSGNR = 0.0D0
+      CSGNI = SGN
+      IF (KODE.EQ.1) GO TO 50
+      YY = -ZNI
+      CSGNR = -CSGNI*DSIN(YY)
+      CSGNI = CSGNI*DCOS(YY)
+   50 CONTINUE
+C-----------------------------------------------------------------------
+C     CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
+C     WHEN FNU IS LARGE
+C-----------------------------------------------------------------------
+      INU = INT(SNGL(FNU))
+      ARG = (FNU-DBLE(FLOAT(INU)))*SGN
+      CSPNR = DCOS(ARG)
+      CSPNI = DSIN(ARG)
+      IF (MOD(INU,2).EQ.0) GO TO 60
+      CSPNR = -CSPNR
+      CSPNI = -CSPNI
+   60 CONTINUE
+      C1R = CYR(1)
+      C1I = CYI(1)
+      C2R = YR(1)
+      C2I = YI(1)
+      IF (KODE.EQ.1) GO TO 70
+      IUF = 0
+      ASCLE = 1.0D+3*D1MACH(1)/TOL
+      CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
+      NZ = NZ + NW
+   70 CONTINUE
+      YR(1) = CSPNR*C1R - CSPNI*C1I + CSGNR*C2R - CSGNI*C2I
+      YI(1) = CSPNR*C1I + CSPNI*C1R + CSGNR*C2I + CSGNI*C2R
+      RETURN
+   80 CONTINUE
+      NZ = -1
+      IF(NW.EQ.(-2)) NZ=-2
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zacon.f
@@ -0,0 +1,203 @@
+      SUBROUTINE ZACON(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, FNUL,
+     * TOL, ELIM, ALIM)
+C***BEGIN PROLOGUE  ZACON
+C***REFER TO  ZBESK,ZBESH
+C
+C     ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA
+C
+C         K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
+C                 MP=PI*MR*CMPLX(0.0,1.0)
+C
+C     TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
+C     HALF Z PLANE
+C
+C***ROUTINES CALLED  ZBINU,ZBKNU,ZS1S2,D1MACH,XZABS,ZMLT
+C***END PROLOGUE  ZACON
+C     COMPLEX CK,CONE,CSCL,CSCR,CSGN,CSPN,CY,CZERO,C1,C2,RZ,SC1,SC2,ST,
+C    *S1,S2,Y,Z,ZN
+      DOUBLE PRECISION ALIM, ARG, ASCLE, AS2, AZN, BRY, BSCLE, CKI,
+     * CKR, CONER, CPN, CSCL, CSCR, CSGNI, CSGNR, CSPNI, CSPNR,
+     * CSR, CSRR, CSSR, CYI, CYR, C1I, C1M, C1R, C2I, C2R, ELIM, FMR,
+     * FN, FNU, FNUL, PI, PTI, PTR, RAZN, RL, RZI, RZR, SC1I, SC1R,
+     * SC2I, SC2R, SGN, SPN, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR,
+     * YY, ZEROR, ZI, ZNI, ZNR, ZR, D1MACH, XZABS
+      INTEGER I, INU, IUF, KFLAG, KODE, MR, N, NN, NW, NZ
+      DIMENSION YR(N), YI(N), CYR(2), CYI(2), CSSR(3), CSRR(3), BRY(3)
+      DATA PI / 3.14159265358979324D0 /
+      DATA ZEROR,CONER / 0.0D0,1.0D0 /
+      NZ = 0
+      ZNR = -ZR
+      ZNI = -ZI
+      NN = N
+      CALL ZBINU(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, FNUL, TOL,
+     * ELIM, ALIM)
+      IF (NW.LT.0) GO TO 90
+C-----------------------------------------------------------------------
+C     ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
+C-----------------------------------------------------------------------
+      NN = MIN0(2,N)
+      CALL ZBKNU(ZNR, ZNI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
+      IF (NW.NE.0) GO TO 90
+      S1R = CYR(1)
+      S1I = CYI(1)
+      FMR = DBLE(FLOAT(MR))
+      SGN = -DSIGN(PI,FMR)
+      CSGNR = ZEROR
+      CSGNI = SGN
+      IF (KODE.EQ.1) GO TO 10
+      YY = -ZNI
+      CPN = DCOS(YY)
+      SPN = DSIN(YY)
+      CALL ZMLT(CSGNR, CSGNI, CPN, SPN, CSGNR, CSGNI)
+   10 CONTINUE
+C-----------------------------------------------------------------------
+C     CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
+C     WHEN FNU IS LARGE
+C-----------------------------------------------------------------------
+      INU = INT(SNGL(FNU))
+      ARG = (FNU-DBLE(FLOAT(INU)))*SGN
+      CPN = DCOS(ARG)
+      SPN = DSIN(ARG)
+      CSPNR = CPN
+      CSPNI = SPN
+      IF (MOD(INU,2).EQ.0) GO TO 20
+      CSPNR = -CSPNR
+      CSPNI = -CSPNI
+   20 CONTINUE
+      IUF = 0
+      C1R = S1R
+      C1I = S1I
+      C2R = YR(1)
+      C2I = YI(1)
+      ASCLE = 1.0D+3*D1MACH(1)/TOL
+      IF (KODE.EQ.1) GO TO 30
+      CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
+      NZ = NZ + NW
+      SC1R = C1R
+      SC1I = C1I
+   30 CONTINUE
+      CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
+      CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
+      YR(1) = STR + PTR
+      YI(1) = STI + PTI
+      IF (N.EQ.1) RETURN
+      CSPNR = -CSPNR
+      CSPNI = -CSPNI
+      S2R = CYR(2)
+      S2I = CYI(2)
+      C1R = S2R
+      C1I = S2I
+      C2R = YR(2)
+      C2I = YI(2)
+      IF (KODE.EQ.1) GO TO 40
+      CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
+      NZ = NZ + NW
+      SC2R = C1R
+      SC2I = C1I
+   40 CONTINUE
+      CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
+      CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
+      YR(2) = STR + PTR
+      YI(2) = STI + PTI
+      IF (N.EQ.2) RETURN
+      CSPNR = -CSPNR
+      CSPNI = -CSPNI
+      AZN = XZABS(ZNR,ZNI)
+      RAZN = 1.0D0/AZN
+      STR = ZNR*RAZN
+      STI = -ZNI*RAZN
+      RZR = (STR+STR)*RAZN
+      RZI = (STI+STI)*RAZN
+      FN = FNU + 1.0D0
+      CKR = FN*RZR
+      CKI = FN*RZI
+C-----------------------------------------------------------------------
+C     SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS
+C-----------------------------------------------------------------------
+      CSCL = 1.0D0/TOL
+      CSCR = TOL
+      CSSR(1) = CSCL
+      CSSR(2) = CONER
+      CSSR(3) = CSCR
+      CSRR(1) = CSCR
+      CSRR(2) = CONER
+      CSRR(3) = CSCL
+      BRY(1) = ASCLE
+      BRY(2) = 1.0D0/ASCLE
+      BRY(3) = D1MACH(2)
+      AS2 = XZABS(S2R,S2I)
+      KFLAG = 2
+      IF (AS2.GT.BRY(1)) GO TO 50
+      KFLAG = 1
+      GO TO 60
+   50 CONTINUE
+      IF (AS2.LT.BRY(2)) GO TO 60
+      KFLAG = 3
+   60 CONTINUE
+      BSCLE = BRY(KFLAG)
+      S1R = S1R*CSSR(KFLAG)
+      S1I = S1I*CSSR(KFLAG)
+      S2R = S2R*CSSR(KFLAG)
+      S2I = S2I*CSSR(KFLAG)
+      CSR = CSRR(KFLAG)
+      DO 80 I=3,N
+        STR = S2R
+        STI = S2I
+        S2R = CKR*STR - CKI*STI + S1R
+        S2I = CKR*STI + CKI*STR + S1I
+        S1R = STR
+        S1I = STI
+        C1R = S2R*CSR
+        C1I = S2I*CSR
+        STR = C1R
+        STI = C1I
+        C2R = YR(I)
+        C2I = YI(I)
+        IF (KODE.EQ.1) GO TO 70
+        IF (IUF.LT.0) GO TO 70
+        CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
+        NZ = NZ + NW
+        SC1R = SC2R
+        SC1I = SC2I
+        SC2R = C1R
+        SC2I = C1I
+        IF (IUF.NE.3) GO TO 70
+        IUF = -4
+        S1R = SC1R*CSSR(KFLAG)
+        S1I = SC1I*CSSR(KFLAG)
+        S2R = SC2R*CSSR(KFLAG)
+        S2I = SC2I*CSSR(KFLAG)
+        STR = SC2R
+        STI = SC2I
+   70   CONTINUE
+        PTR = CSPNR*C1R - CSPNI*C1I
+        PTI = CSPNR*C1I + CSPNI*C1R
+        YR(I) = PTR + CSGNR*C2R - CSGNI*C2I
+        YI(I) = PTI + CSGNR*C2I + CSGNI*C2R
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        CSPNR = -CSPNR
+        CSPNI = -CSPNI
+        IF (KFLAG.GE.3) GO TO 80
+        PTR = DABS(C1R)
+        PTI = DABS(C1I)
+        C1M = DMAX1(PTR,PTI)
+        IF (C1M.LE.BSCLE) GO TO 80
+        KFLAG = KFLAG + 1
+        BSCLE = BRY(KFLAG)
+        S1R = S1R*CSR
+        S1I = S1I*CSR
+        S2R = STR
+        S2I = STI
+        S1R = S1R*CSSR(KFLAG)
+        S1I = S1I*CSSR(KFLAG)
+        S2R = S2R*CSSR(KFLAG)
+        S2I = S2I*CSSR(KFLAG)
+        CSR = CSRR(KFLAG)
+   80 CONTINUE
+      RETURN
+   90 CONTINUE
+      NZ = -1
+      IF(NW.EQ.(-2)) NZ=-2
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zairy.f
@@ -0,0 +1,393 @@
+      SUBROUTINE ZAIRY(ZR, ZI, ID, KODE, AIR, AII, NZ, IERR)
+C***BEGIN PROLOGUE  ZAIRY
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  890801   (YYMMDD)
+C***CATEGORY NO.  B5K
+C***KEYWORDS  AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE AIRY FUNCTIONS AI(Z) AND DAI(Z) FOR COMPLEX Z
+C***DESCRIPTION
+C
+C                      ***A DOUBLE PRECISION ROUTINE***
+C         ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR
+C         ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
+C         KODE=2, A SCALING OPTION CEXP(ZTA)*AI(Z) OR CEXP(ZTA)*
+C         DAI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL DECAY IN
+C         -PI/3.LT.ARG(Z).LT.PI/3 AND THE EXPONENTIAL GROWTH IN
+C         PI/3.LT.ABS(ARG(Z)).LT.PI WHERE ZTA=(2/3)*Z*CSQRT(Z).
+C
+C         WHILE THE AIRY FUNCTIONS AI(Z) AND DAI(Z)/DZ ARE ANALYTIC IN
+C         THE WHOLE Z PLANE, THE CORRESPONDING SCALED FUNCTIONS DEFINED
+C         FOR KODE=2 HAVE A CUT ALONG THE NEGATIVE REAL AXIS.
+C         DEFINTIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
+C         MATHEMATICAL FUNCTIONS (REF. 1).
+C
+C         INPUT      ZR,ZI ARE DOUBLE PRECISION
+C           ZR,ZI  - Z=CMPLX(ZR,ZI)
+C           ID     - ORDER OF DERIVATIVE, ID=0 OR ID=1
+C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
+C                    KODE= 1  RETURNS
+C                             AI=AI(Z)                ON ID=0 OR
+C                             AI=DAI(Z)/DZ            ON ID=1
+C                        = 2  RETURNS
+C                             AI=CEXP(ZTA)*AI(Z)       ON ID=0 OR
+C                             AI=CEXP(ZTA)*DAI(Z)/DZ   ON ID=1 WHERE
+C                             ZTA=(2/3)*Z*CSQRT(Z)
+C
+C         OUTPUT     AIR,AII ARE DOUBLE PRECISION
+C           AIR,AII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
+C                    KODE
+C           NZ     - UNDERFLOW INDICATOR
+C                    NZ= 0   , NORMAL RETURN
+C                    NZ= 1   , AI=CMPLX(0.0D0,0.0D0) DUE TO UNDERFLOW IN
+C                              -PI/3.LT.ARG(Z).LT.PI/3 ON KODE=1
+C           IERR   - ERROR FLAG
+C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
+C                    IERR=1, INPUT ERROR   - NO COMPUTATION
+C                    IERR=2, OVERFLOW      - NO COMPUTATION, REAL(ZTA)
+C                            TOO LARGE ON KODE=1
+C                    IERR=3, CABS(Z) LARGE      - COMPUTATION COMPLETED
+C                            LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
+C                            PRODUCE LESS THAN HALF OF MACHINE ACCURACY
+C                    IERR=4, CABS(Z) TOO LARGE  - NO COMPUTATION
+C                            COMPLETE LOSS OF ACCURACY BY ARGUMENT
+C                            REDUCTION
+C                    IERR=5, ERROR              - NO COMPUTATION,
+C                            ALGORITHM TERMINATION CONDITION NOT MET
+C
+C***LONG DESCRIPTION
+C
+C         AI AND DAI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE K BESSEL
+C         FUNCTIONS BY
+C
+C            AI(Z)=C*SQRT(Z)*K(1/3,ZTA) , DAI(Z)=-C*Z*K(2/3,ZTA)
+C                           C=1.0/(PI*SQRT(3.0))
+C                            ZTA=(2/3)*Z**(3/2)
+C
+C         WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
+C
+C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
+C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
+C         OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
+C         THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
+C         THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
+C         FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
+C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
+C         ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
+C         ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
+C         FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
+C         LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
+C         MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
+C         AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
+C         PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
+C         PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
+C         ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
+C         NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
+C         DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
+C         EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
+C         NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
+C         PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER
+C         MACHINES.
+C
+C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
+C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
+C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
+C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
+C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
+C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
+C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
+C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
+C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
+C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
+C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
+C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
+C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
+C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
+C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
+C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
+C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
+C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
+C         OR -PI/2+P.
+C
+C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
+C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
+C                 COMMERCE, 1955.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
+C
+C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
+C                 1018, MAY, 1985
+C
+C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
+C                 MATH. SOFTWARE, 1986
+C
+C***ROUTINES CALLED  ZACAI,ZBKNU,XZEXP,XZSQRT,I1MACH,D1MACH
+C***END PROLOGUE  ZAIRY
+C     COMPLEX AI,CONE,CSQ,CY,S1,S2,TRM1,TRM2,Z,ZTA,Z3
+      DOUBLE PRECISION AA, AD, AII, AIR, AK, ALIM, ATRM, AZ, AZ3, BK,
+     * CC, CK, COEF, CONEI, CONER, CSQI, CSQR, CYI, CYR, C1, C2, DIG,
+     * DK, D1, D2, ELIM, FID, FNU, PTR, RL, R1M5, SFAC, STI, STR,
+     * S1I, S1R, S2I, S2R, TOL, TRM1I, TRM1R, TRM2I, TRM2R, TTH, ZEROI,
+     * ZEROR, ZI, ZR, ZTAI, ZTAR, Z3I, Z3R, D1MACH, XZABS, ALAZ, BB
+      INTEGER ID, IERR, IFLAG, K, KODE, K1, K2, MR, NN, NZ, I1MACH
+      DIMENSION CYR(1), CYI(1)
+      DATA TTH, C1, C2, COEF /6.66666666666666667D-01,
+     * 3.55028053887817240D-01,2.58819403792806799D-01,
+     * 1.83776298473930683D-01/
+      DATA ZEROR, ZEROI, CONER, CONEI /0.0D0,0.0D0,1.0D0,0.0D0/
+C***FIRST EXECUTABLE STATEMENT  ZAIRY
+      IERR = 0
+      NZ=0
+      IF (ID.LT.0 .OR. ID.GT.1) IERR=1
+      IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
+      IF (IERR.NE.0) RETURN
+      AZ = XZABS(ZR,ZI)
+      TOL = DMAX1(D1MACH(4),1.0D-18)
+      FID = DBLE(FLOAT(ID))
+      IF (AZ.GT.1.0D0) GO TO 70
+C-----------------------------------------------------------------------
+C     POWER SERIES FOR CABS(Z).LE.1.
+C-----------------------------------------------------------------------
+      S1R = CONER
+      S1I = CONEI
+      S2R = CONER
+      S2I = CONEI
+      IF (AZ.LT.TOL) GO TO 170
+      AA = AZ*AZ
+      IF (AA.LT.TOL/AZ) GO TO 40
+      TRM1R = CONER
+      TRM1I = CONEI
+      TRM2R = CONER
+      TRM2I = CONEI
+      ATRM = 1.0D0
+      STR = ZR*ZR - ZI*ZI
+      STI = ZR*ZI + ZI*ZR
+      Z3R = STR*ZR - STI*ZI
+      Z3I = STR*ZI + STI*ZR
+      AZ3 = AZ*AA
+      AK = 2.0D0 + FID
+      BK = 3.0D0 - FID - FID
+      CK = 4.0D0 - FID
+      DK = 3.0D0 + FID + FID
+      D1 = AK*DK
+      D2 = BK*CK
+      AD = DMIN1(D1,D2)
+      AK = 24.0D0 + 9.0D0*FID
+      BK = 30.0D0 - 9.0D0*FID
+      DO 30 K=1,25
+        STR = (TRM1R*Z3R-TRM1I*Z3I)/D1
+        TRM1I = (TRM1R*Z3I+TRM1I*Z3R)/D1
+        TRM1R = STR
+        S1R = S1R + TRM1R
+        S1I = S1I + TRM1I
+        STR = (TRM2R*Z3R-TRM2I*Z3I)/D2
+        TRM2I = (TRM2R*Z3I+TRM2I*Z3R)/D2
+        TRM2R = STR
+        S2R = S2R + TRM2R
+        S2I = S2I + TRM2I
+        ATRM = ATRM*AZ3/AD
+        D1 = D1 + AK
+        D2 = D2 + BK
+        AD = DMIN1(D1,D2)
+        IF (ATRM.LT.TOL*AD) GO TO 40
+        AK = AK + 18.0D0
+        BK = BK + 18.0D0
+   30 CONTINUE
+   40 CONTINUE
+      IF (ID.EQ.1) GO TO 50
+      AIR = S1R*C1 - C2*(ZR*S2R-ZI*S2I)
+      AII = S1I*C1 - C2*(ZR*S2I+ZI*S2R)
+      IF (KODE.EQ.1) RETURN
+      CALL XZSQRT(ZR, ZI, STR, STI)
+      ZTAR = TTH*(ZR*STR-ZI*STI)
+      ZTAI = TTH*(ZR*STI+ZI*STR)
+      CALL XZEXP(ZTAR, ZTAI, STR, STI)
+      PTR = AIR*STR - AII*STI
+      AII = AIR*STI + AII*STR
+      AIR = PTR
+      RETURN
+   50 CONTINUE
+      AIR = -S2R*C2
+      AII = -S2I*C2
+      IF (AZ.LE.TOL) GO TO 60
+      STR = ZR*S1R - ZI*S1I
+      STI = ZR*S1I + ZI*S1R
+      CC = C1/(1.0D0+FID)
+      AIR = AIR + CC*(STR*ZR-STI*ZI)
+      AII = AII + CC*(STR*ZI+STI*ZR)
+   60 CONTINUE
+      IF (KODE.EQ.1) RETURN
+      CALL XZSQRT(ZR, ZI, STR, STI)
+      ZTAR = TTH*(ZR*STR-ZI*STI)
+      ZTAI = TTH*(ZR*STI+ZI*STR)
+      CALL XZEXP(ZTAR, ZTAI, STR, STI)
+      PTR = STR*AIR - STI*AII
+      AII = STR*AII + STI*AIR
+      AIR = PTR
+      RETURN
+C-----------------------------------------------------------------------
+C     CASE FOR CABS(Z).GT.1.0
+C-----------------------------------------------------------------------
+   70 CONTINUE
+      FNU = (1.0D0+FID)/3.0D0
+C-----------------------------------------------------------------------
+C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
+C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0D-18.
+C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
+C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
+C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
+C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
+C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
+C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
+C-----------------------------------------------------------------------
+      K1 = I1MACH(15)
+      K2 = I1MACH(16)
+      R1M5 = D1MACH(5)
+      K = MIN0(IABS(K1),IABS(K2))
+      ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
+      K1 = I1MACH(14) - 1
+      AA = R1M5*DBLE(FLOAT(K1))
+      DIG = DMIN1(AA,18.0D0)
+      AA = AA*2.303D0
+      ALIM = ELIM + DMAX1(-AA,-41.45D0)
+      RL = 1.2D0*DIG + 3.0D0
+      ALAZ = DLOG(AZ)
+C--------------------------------------------------------------------------
+C     TEST FOR PROPER RANGE
+C-----------------------------------------------------------------------
+      AA=0.5D0/TOL
+      BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
+      AA=DMIN1(AA,BB)
+      AA=AA**TTH
+      IF (AZ.GT.AA) GO TO 260
+      AA=DSQRT(AA)
+      IF (AZ.GT.AA) IERR=3
+      CALL XZSQRT(ZR, ZI, CSQR, CSQI)
+      ZTAR = TTH*(ZR*CSQR-ZI*CSQI)
+      ZTAI = TTH*(ZR*CSQI+ZI*CSQR)
+C-----------------------------------------------------------------------
+C     RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
+C-----------------------------------------------------------------------
+      IFLAG = 0
+      SFAC = 1.0D0
+      AK = ZTAI
+      IF (ZR.GE.0.0D0) GO TO 80
+      BK = ZTAR
+      CK = -DABS(BK)
+      ZTAR = CK
+      ZTAI = AK
+   80 CONTINUE
+      IF (ZI.NE.0.0D0) GO TO 90
+      IF (ZR.GT.0.0D0) GO TO 90
+      ZTAR = 0.0D0
+      ZTAI = AK
+   90 CONTINUE
+      AA = ZTAR
+      IF (AA.GE.0.0D0 .AND. ZR.GT.0.0D0) GO TO 110
+      IF (KODE.EQ.2) GO TO 100
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST
+C-----------------------------------------------------------------------
+      IF (AA.GT.(-ALIM)) GO TO 100
+      AA = -AA + 0.25D0*ALAZ
+      IFLAG = 1
+      SFAC = TOL
+      IF (AA.GT.ELIM) GO TO 270
+  100 CONTINUE
+C-----------------------------------------------------------------------
+C     CBKNU AND CACON RETURN EXP(ZTA)*K(FNU,ZTA) ON KODE=2
+C-----------------------------------------------------------------------
+      MR = 1
+      IF (ZI.LT.0.0D0) MR = -1
+      CALL ZACAI(ZTAR, ZTAI, FNU, KODE, MR, 1, CYR, CYI, NN, RL, TOL,
+     * ELIM, ALIM)
+      IF (NN.LT.0) GO TO 280
+      NZ = NZ + NN
+      GO TO 130
+  110 CONTINUE
+      IF (KODE.EQ.2) GO TO 120
+C-----------------------------------------------------------------------
+C     UNDERFLOW TEST
+C-----------------------------------------------------------------------
+      IF (AA.LT.ALIM) GO TO 120
+      AA = -AA - 0.25D0*ALAZ
+      IFLAG = 2
+      SFAC = 1.0D0/TOL
+      IF (AA.LT.(-ELIM)) GO TO 210
+  120 CONTINUE
+      CALL ZBKNU(ZTAR, ZTAI, FNU, KODE, 1, CYR, CYI, NZ, TOL, ELIM,
+     * ALIM)
+  130 CONTINUE
+      S1R = CYR(1)*COEF
+      S1I = CYI(1)*COEF
+      IF (IFLAG.NE.0) GO TO 150
+      IF (ID.EQ.1) GO TO 140
+      AIR = CSQR*S1R - CSQI*S1I
+      AII = CSQR*S1I + CSQI*S1R
+      RETURN
+  140 CONTINUE
+      AIR = -(ZR*S1R-ZI*S1I)
+      AII = -(ZR*S1I+ZI*S1R)
+      RETURN
+  150 CONTINUE
+      S1R = S1R*SFAC
+      S1I = S1I*SFAC
+      IF (ID.EQ.1) GO TO 160
+      STR = S1R*CSQR - S1I*CSQI
+      S1I = S1R*CSQI + S1I*CSQR
+      S1R = STR
+      AIR = S1R/SFAC
+      AII = S1I/SFAC
+      RETURN
+  160 CONTINUE
+      STR = -(S1R*ZR-S1I*ZI)
+      S1I = -(S1R*ZI+S1I*ZR)
+      S1R = STR
+      AIR = S1R/SFAC
+      AII = S1I/SFAC
+      RETURN
+  170 CONTINUE
+      AA = 1.0D+3*D1MACH(1)
+      S1R = ZEROR
+      S1I = ZEROI
+      IF (ID.EQ.1) GO TO 190
+      IF (AZ.LE.AA) GO TO 180
+      S1R = C2*ZR
+      S1I = C2*ZI
+  180 CONTINUE
+      AIR = C1 - S1R
+      AII = -S1I
+      RETURN
+  190 CONTINUE
+      AIR = -C2
+      AII = 0.0D0
+      AA = DSQRT(AA)
+      IF (AZ.LE.AA) GO TO 200
+      S1R = 0.5D0*(ZR*ZR-ZI*ZI)
+      S1I = ZR*ZI
+  200 CONTINUE
+      AIR = AIR + C1*S1R
+      AII = AII + C1*S1I
+      RETURN
+  210 CONTINUE
+      NZ = 1
+      AIR = ZEROR
+      AII = ZEROI
+      RETURN
+  270 CONTINUE
+      NZ = 0
+      IERR=2
+      RETURN
+  280 CONTINUE
+      IF(NN.EQ.(-1)) GO TO 270
+      NZ=0
+      IERR=5
+      RETURN
+  260 CONTINUE
+      IERR=4
+      NZ=0
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zasyi.f
@@ -0,0 +1,165 @@
+      SUBROUTINE ZASYI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, RL, TOL, ELIM,
+     * ALIM)
+C***BEGIN PROLOGUE  ZASYI
+C***REFER TO  ZBESI,ZBESK
+C
+C     ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
+C     MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE
+C     REGION CABS(Z).GT.MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL RETURN.
+C     NZ.LT.0 INDICATES AN OVERFLOW ON KODE=1.
+C
+C***ROUTINES CALLED  D1MACH,XZABS,ZDIV,XZEXP,ZMLT,XZSQRT
+C***END PROLOGUE  ZASYI
+C     COMPLEX AK1,CK,CONE,CS1,CS2,CZ,CZERO,DK,EZ,P1,RZ,S2,Y,Z
+      DOUBLE PRECISION AA, AEZ, AK, AK1I, AK1R, ALIM, ARG, ARM, ATOL,
+     * AZ, BB, BK, CKI, CKR, CONEI, CONER, CS1I, CS1R, CS2I, CS2R, CZI,
+     * CZR, DFNU, DKI, DKR, DNU2, ELIM, EZI, EZR, FDN, FNU, PI, P1I,
+     * P1R, RAZ, RL, RTPI, RTR1, RZI, RZR, S, SGN, SQK, STI, STR, S2I,
+     * S2R, TOL, TZI, TZR, YI, YR, ZEROI, ZEROR, ZI, ZR, D1MACH, XZABS
+      INTEGER I, IB, IL, INU, J, JL, K, KODE, KODED, M, N, NN, NZ
+      DIMENSION YR(N), YI(N)
+      DATA PI, RTPI  /3.14159265358979324D0 , 0.159154943091895336D0 /
+      DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
+C
+      NZ = 0
+      AZ = XZABS(ZR,ZI)
+      ARM = 1.0D+3*D1MACH(1)
+      RTR1 = DSQRT(ARM)
+      IL = MIN0(2,N)
+      DFNU = FNU + DBLE(FLOAT(N-IL))
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST
+C-----------------------------------------------------------------------
+      RAZ = 1.0D0/AZ
+      STR = ZR*RAZ
+      STI = -ZI*RAZ
+      AK1R = RTPI*STR*RAZ
+      AK1I = RTPI*STI*RAZ
+      CALL XZSQRT(AK1R, AK1I, AK1R, AK1I)
+      CZR = ZR
+      CZI = ZI
+      IF (KODE.NE.2) GO TO 10
+      CZR = ZEROR
+      CZI = ZI
+   10 CONTINUE
+      IF (DABS(CZR).GT.ELIM) GO TO 100
+      DNU2 = DFNU + DFNU
+      KODED = 1
+      IF ((DABS(CZR).GT.ALIM) .AND. (N.GT.2)) GO TO 20
+      KODED = 0
+      CALL XZEXP(CZR, CZI, STR, STI)
+      CALL ZMLT(AK1R, AK1I, STR, STI, AK1R, AK1I)
+   20 CONTINUE
+      FDN = 0.0D0
+      IF (DNU2.GT.RTR1) FDN = DNU2*DNU2
+      EZR = ZR*8.0D0
+      EZI = ZI*8.0D0
+C-----------------------------------------------------------------------
+C     WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
+C     FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
+C     EXPANSION FOR THE IMAGINARY PART.
+C-----------------------------------------------------------------------
+      AEZ = 8.0D0*AZ
+      S = TOL/AEZ
+      JL = INT(SNGL(RL+RL)) + 2
+      P1R = ZEROR
+      P1I = ZEROI
+      IF (ZI.EQ.0.0D0) GO TO 30
+C-----------------------------------------------------------------------
+C     CALCULATE EXP(PI*(0.5+FNU+N-IL)*I) TO MINIMIZE LOSSES OF
+C     SIGNIFICANCE WHEN FNU OR N IS LARGE
+C-----------------------------------------------------------------------
+      INU = INT(SNGL(FNU))
+      ARG = (FNU-DBLE(FLOAT(INU)))*PI
+      INU = INU + N - IL
+      AK = -DSIN(ARG)
+      BK = DCOS(ARG)
+      IF (ZI.LT.0.0D0) BK = -BK
+      P1R = AK
+      P1I = BK
+      IF (MOD(INU,2).EQ.0) GO TO 30
+      P1R = -P1R
+      P1I = -P1I
+   30 CONTINUE
+      DO 70 K=1,IL
+        SQK = FDN - 1.0D0
+        ATOL = S*DABS(SQK)
+        SGN = 1.0D0
+        CS1R = CONER
+        CS1I = CONEI
+        CS2R = CONER
+        CS2I = CONEI
+        CKR = CONER
+        CKI = CONEI
+        AK = 0.0D0
+        AA = 1.0D0
+        BB = AEZ
+        DKR = EZR
+        DKI = EZI
+        DO 40 J=1,JL
+          CALL ZDIV(CKR, CKI, DKR, DKI, STR, STI)
+          CKR = STR*SQK
+          CKI = STI*SQK
+          CS2R = CS2R + CKR
+          CS2I = CS2I + CKI
+          SGN = -SGN
+          CS1R = CS1R + CKR*SGN
+          CS1I = CS1I + CKI*SGN
+          DKR = DKR + EZR
+          DKI = DKI + EZI
+          AA = AA*DABS(SQK)/BB
+          BB = BB + AEZ
+          AK = AK + 8.0D0
+          SQK = SQK - AK
+          IF (AA.LE.ATOL) GO TO 50
+   40   CONTINUE
+        GO TO 110
+   50   CONTINUE
+        S2R = CS1R
+        S2I = CS1I
+        IF (ZR+ZR.GE.ELIM) GO TO 60
+        TZR = ZR + ZR
+        TZI = ZI + ZI
+        CALL XZEXP(-TZR, -TZI, STR, STI)
+        CALL ZMLT(STR, STI, P1R, P1I, STR, STI)
+        CALL ZMLT(STR, STI, CS2R, CS2I, STR, STI)
+        S2R = S2R + STR
+        S2I = S2I + STI
+   60   CONTINUE
+        FDN = FDN + 8.0D0*DFNU + 4.0D0
+        P1R = -P1R
+        P1I = -P1I
+        M = N - IL + K
+        YR(M) = S2R*AK1R - S2I*AK1I
+        YI(M) = S2R*AK1I + S2I*AK1R
+   70 CONTINUE
+      IF (N.LE.2) RETURN
+      NN = N
+      K = NN - 2
+      AK = DBLE(FLOAT(K))
+      STR = ZR*RAZ
+      STI = -ZI*RAZ
+      RZR = (STR+STR)*RAZ
+      RZI = (STI+STI)*RAZ
+      IB = 3
+      DO 80 I=IB,NN
+        YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
+        YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
+        AK = AK - 1.0D0
+        K = K - 1
+   80 CONTINUE
+      IF (KODED.EQ.0) RETURN
+      CALL XZEXP(CZR, CZI, CKR, CKI)
+      DO 90 I=1,NN
+        STR = YR(I)*CKR - YI(I)*CKI
+        YI(I) = YR(I)*CKI + YI(I)*CKR
+        YR(I) = STR
+   90 CONTINUE
+      RETURN
+  100 CONTINUE
+      NZ = -1
+      RETURN
+  110 CONTINUE
+      NZ=-2
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbesh.f
@@ -0,0 +1,348 @@
+      SUBROUTINE ZBESH(ZR, ZI, FNU, KODE, M, N, CYR, CYI, NZ, IERR)
+C***BEGIN PROLOGUE  ZBESH
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  890801   (YYMMDD)
+C***CATEGORY NO.  B5K
+C***KEYWORDS  H-BESSEL FUNCTIONS,BESSEL FUNCTIONS OF COMPLEX ARGUMENT,
+C             BESSEL FUNCTIONS OF THIRD KIND,HANKEL FUNCTIONS
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE THE H-BESSEL FUNCTIONS OF A COMPLEX ARGUMENT
+C***DESCRIPTION
+C
+C                      ***A DOUBLE PRECISION ROUTINE***
+C         ON KODE=1, ZBESH COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
+C         HANKEL (BESSEL) FUNCTIONS CY(J)=H(M,FNU+J-1,Z) FOR KINDS M=1
+C         OR 2, REAL, NONNEGATIVE ORDERS FNU+J-1, J=1,...,N, AND COMPLEX
+C         Z.NE.CMPLX(0.0,0.0) IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI.
+C         ON KODE=2, ZBESH RETURNS THE SCALED HANKEL FUNCTIONS
+C
+C         CY(I)=EXP(-MM*Z*I)*H(M,FNU+J-1,Z)       MM=3-2*M,   I**2=-1.
+C
+C         WHICH REMOVES THE EXPONENTIAL BEHAVIOR IN BOTH THE UPPER AND
+C         LOWER HALF PLANES. DEFINITIONS AND NOTATION ARE FOUND IN THE
+C         NBS HANDBOOK OF MATHEMATICAL FUNCTIONS (REF. 1).
+C
+C         INPUT      ZR,ZI,FNU ARE DOUBLE PRECISION
+C           ZR,ZI  - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
+C                    -PT.LT.ARG(Z).LE.PI
+C           FNU    - ORDER OF INITIAL H FUNCTION, FNU.GE.0.0D0
+C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
+C                    KODE= 1  RETURNS
+C                             CY(J)=H(M,FNU+J-1,Z),   J=1,...,N
+C                        = 2  RETURNS
+C                             CY(J)=H(M,FNU+J-1,Z)*EXP(-I*Z*(3-2M))
+C                                  J=1,...,N  ,  I**2=-1
+C           M      - KIND OF HANKEL FUNCTION, M=1 OR 2
+C           N      - NUMBER OF MEMBERS IN THE SEQUENCE, N.GE.1
+C
+C         OUTPUT     CYR,CYI ARE DOUBLE PRECISION
+C           CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
+C                    CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
+C                    CY(J)=H(M,FNU+J-1,Z)  OR
+C                    CY(J)=H(M,FNU+J-1,Z)*EXP(-I*Z*(3-2M))  J=1,...,N
+C                    DEPENDING ON KODE, I**2=-1.
+C           NZ     - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
+C                    NZ= 0   , NORMAL RETURN
+C                    NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE
+C                              TO UNDERFLOW, CY(J)=CMPLX(0.0D0,0.0D0)
+C                              J=1,...,NZ WHEN Y.GT.0.0 AND M=1 OR
+C                              Y.LT.0.0 AND M=2. FOR THE COMPLMENTARY
+C                              HALF PLANES, NZ STATES ONLY THE NUMBER
+C                              OF UNDERFLOWS.
+C           IERR   - ERROR FLAG
+C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
+C                    IERR=1, INPUT ERROR   - NO COMPUTATION
+C                    IERR=2, OVERFLOW      - NO COMPUTATION, FNU TOO
+C                            LARGE OR CABS(Z) TOO SMALL OR BOTH
+C                    IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
+C                            BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
+C                            REDUCTION PRODUCE LESS THAN HALF OF MACHINE
+C                            ACCURACY
+C                    IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
+C                            TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
+C                            CANCE BY ARGUMENT REDUCTION
+C                    IERR=5, ERROR              - NO COMPUTATION,
+C                            ALGORITHM TERMINATION CONDITION NOT MET
+C
+C***LONG DESCRIPTION
+C
+C         THE COMPUTATION IS CARRIED OUT BY THE RELATION
+C
+C         H(M,FNU,Z)=(1/MP)*EXP(-MP*FNU)*K(FNU,Z*EXP(-MP))
+C             MP=MM*HPI*I,  MM=3-2*M,  HPI=PI/2,  I**2=-1
+C
+C         FOR M=1 OR 2 WHERE THE K BESSEL FUNCTION IS COMPUTED FOR THE
+C         RIGHT HALF PLANE RE(Z).GE.0.0. THE K FUNCTION IS CONTINUED
+C         TO THE LEFT HALF PLANE BY THE RELATION
+C
+C         K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
+C         MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
+C
+C         WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
+C
+C         EXPONENTIAL DECAY OF H(M,FNU,Z) OCCURS IN THE UPPER HALF Z
+C         PLANE FOR M=1 AND THE LOWER HALF Z PLANE FOR M=2.  EXPONENTIAL
+C         GROWTH OCCURS IN THE COMPLEMENTARY HALF PLANES.  SCALING
+C         BY EXP(-MM*Z*I) REMOVES THE EXPONENTIAL BEHAVIOR IN THE
+C         WHOLE Z PLANE FOR Z TO INFINITY.
+C
+C         FOR NEGATIVE ORDERS,THE FORMULAE
+C
+C               H(1,-FNU,Z) = H(1,FNU,Z)*CEXP( PI*FNU*I)
+C               H(2,-FNU,Z) = H(2,FNU,Z)*CEXP(-PI*FNU*I)
+C                         I**2=-1
+C
+C         CAN BE USED.
+C
+C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
+C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
+C         LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
+C         CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
+C         LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
+C         IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
+C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
+C         IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
+C         LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
+C         MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
+C         INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
+C         RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
+C         ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
+C         ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
+C         ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
+C         THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
+C         TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
+C         IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
+C         SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
+C
+C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
+C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
+C         ROUNDOFF,1.0D-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
+C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
+C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
+C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
+C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
+C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
+C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
+C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
+C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
+C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
+C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
+C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
+C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
+C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
+C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
+C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
+C         OR -PI/2+P.
+C
+C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
+C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
+C                 COMMERCE, 1955.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
+C
+C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
+C                 1018, MAY, 1985
+C
+C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
+C                 MATH. SOFTWARE, 1986
+C
+C***ROUTINES CALLED  ZACON,ZBKNU,ZBUNK,ZUOIK,XZABS,I1MACH,D1MACH
+C***END PROLOGUE  ZBESH
+C
+C     COMPLEX CY,Z,ZN,ZT,CSGN
+      DOUBLE PRECISION AA, ALIM, ALN, ARG, AZ, CYI, CYR, DIG, ELIM,
+     * FMM, FN, FNU, FNUL, HPI, RHPI, RL, R1M5, SGN, STR, TOL, UFL, ZI,
+     * ZNI, ZNR, ZR, ZTI, D1MACH, XZABS, BB, ASCLE, RTOL, ATOL, STI,
+     * CSGNR, CSGNI
+      INTEGER I, IERR, INU, INUH, IR, K, KODE, K1, K2, M,
+     * MM, MR, N, NN, NUF, NW, NZ, I1MACH
+      DIMENSION CYR(N), CYI(N)
+C
+      DATA HPI /1.57079632679489662D0/
+C
+C***FIRST EXECUTABLE STATEMENT  ZBESH
+      IERR = 0
+      NZ=0
+      IF (ZR.EQ.0.0D0 .AND. ZI.EQ.0.0D0) IERR=1
+      IF (FNU.LT.0.0D0) IERR=1
+      IF (M.LT.1 .OR. M.GT.2) IERR=1
+      IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
+      IF (N.LT.1) IERR=1
+      IF (IERR.NE.0) RETURN
+      NN = N
+C-----------------------------------------------------------------------
+C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
+C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
+C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
+C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
+C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
+C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
+C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
+C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
+C     FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
+C-----------------------------------------------------------------------
+      TOL = DMAX1(D1MACH(4),1.0D-18)
+      K1 = I1MACH(15)
+      K2 = I1MACH(16)
+      R1M5 = D1MACH(5)
+      K = MIN0(IABS(K1),IABS(K2))
+      ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
+      K1 = I1MACH(14) - 1
+      AA = R1M5*DBLE(FLOAT(K1))
+      DIG = DMIN1(AA,18.0D0)
+      AA = AA*2.303D0
+      ALIM = ELIM + DMAX1(-AA,-41.45D0)
+      FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
+      RL = 1.2D0*DIG + 3.0D0
+      FN = FNU + DBLE(FLOAT(NN-1))
+      MM = 3 - M - M
+      FMM = DBLE(FLOAT(MM))
+      ZNR = FMM*ZI
+      ZNI = -FMM*ZR
+C-----------------------------------------------------------------------
+C     TEST FOR PROPER RANGE
+C-----------------------------------------------------------------------
+      AZ = XZABS(ZR,ZI)
+      AA = 0.5D0/TOL
+      BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
+      AA = DMIN1(AA,BB)
+      IF (AZ.GT.AA) GO TO 260
+      IF (FN.GT.AA) GO TO 260
+      AA = DSQRT(AA)
+      IF (AZ.GT.AA) IERR=3
+      IF (FN.GT.AA) IERR=3
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
+C-----------------------------------------------------------------------
+      UFL = D1MACH(1)*1.0D+3
+      IF (AZ.LT.UFL) GO TO 230
+      IF (FNU.GT.FNUL) GO TO 90
+      IF (FN.LE.1.0D0) GO TO 70
+      IF (FN.GT.2.0D0) GO TO 60
+      IF (AZ.GT.TOL) GO TO 70
+      ARG = 0.5D0*AZ
+      ALN = -FN*DLOG(ARG)
+      IF (ALN.GT.ELIM) GO TO 230
+      GO TO 70
+   60 CONTINUE
+      CALL ZUOIK(ZNR, ZNI, FNU, KODE, 2, NN, CYR, CYI, NUF, TOL, ELIM,
+     * ALIM)
+      IF (NUF.LT.0) GO TO 230
+      NZ = NZ + NUF
+      NN = NN - NUF
+C-----------------------------------------------------------------------
+C     HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
+C     IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
+C-----------------------------------------------------------------------
+      IF (NN.EQ.0) GO TO 140
+   70 CONTINUE
+      IF ((ZNR.LT.0.0D0) .OR. (ZNR.EQ.0.0D0 .AND. ZNI.LT.0.0D0 .AND.
+     * M.EQ.2)) GO TO 80
+C-----------------------------------------------------------------------
+C     RIGHT HALF PLANE COMPUTATION, XN.GE.0. .AND. (XN.NE.0. .OR.
+C     YN.GE.0. .OR. M=1)
+C-----------------------------------------------------------------------
+      CALL ZBKNU(ZNR, ZNI, FNU, KODE, NN, CYR, CYI, NZ, TOL, ELIM, ALIM)
+      GO TO 110
+C-----------------------------------------------------------------------
+C     LEFT HALF PLANE COMPUTATION
+C-----------------------------------------------------------------------
+   80 CONTINUE
+      MR = -MM
+      CALL ZACON(ZNR, ZNI, FNU, KODE, MR, NN, CYR, CYI, NW, RL, FNUL,
+     * TOL, ELIM, ALIM)
+      IF (NW.LT.0) GO TO 240
+      NZ=NW
+      GO TO 110
+   90 CONTINUE
+C-----------------------------------------------------------------------
+C     UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
+C-----------------------------------------------------------------------
+      MR = 0
+      IF ((ZNR.GE.0.0D0) .AND. (ZNR.NE.0.0D0 .OR. ZNI.GE.0.0D0 .OR.
+     * M.NE.2)) GO TO 100
+      MR = -MM
+      IF (ZNR.NE.0.0D0 .OR. ZNI.GE.0.0D0) GO TO 100
+      ZNR = -ZNR
+      ZNI = -ZNI
+  100 CONTINUE
+      CALL ZBUNK(ZNR, ZNI, FNU, KODE, MR, NN, CYR, CYI, NW, TOL, ELIM,
+     * ALIM)
+      IF (NW.LT.0) GO TO 240
+      NZ = NZ + NW
+  110 CONTINUE
+C-----------------------------------------------------------------------
+C     H(M,FNU,Z) = -FMM*(I/HPI)*(ZT**FNU)*K(FNU,-Z*ZT)
+C
+C     ZT=EXP(-FMM*HPI*I) = CMPLX(0.0,-FMM), FMM=3-2*M, M=1,2
+C-----------------------------------------------------------------------
+      SGN = DSIGN(HPI,-FMM)
+C-----------------------------------------------------------------------
+C     CALCULATE EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
+C     WHEN FNU IS LARGE
+C-----------------------------------------------------------------------
+      INU = INT(SNGL(FNU))
+      INUH = INU/2
+      IR = INU - 2*INUH
+      ARG = (FNU-DBLE(FLOAT(INU-IR)))*SGN
+      RHPI = 1.0D0/SGN
+C     ZNI = RHPI*DCOS(ARG)
+C     ZNR = -RHPI*DSIN(ARG)
+      CSGNI = RHPI*DCOS(ARG)
+      CSGNR = -RHPI*DSIN(ARG)
+      IF (MOD(INUH,2).EQ.0) GO TO 120
+C     ZNR = -ZNR
+C     ZNI = -ZNI
+      CSGNR = -CSGNR
+      CSGNI = -CSGNI
+  120 CONTINUE
+      ZTI = -FMM
+      RTOL = 1.0D0/TOL
+      ASCLE = UFL*RTOL
+      DO 130 I=1,NN
+C       STR = CYR(I)*ZNR - CYI(I)*ZNI
+C       CYI(I) = CYR(I)*ZNI + CYI(I)*ZNR
+C       CYR(I) = STR
+C       STR = -ZNI*ZTI
+C       ZNI = ZNR*ZTI
+C       ZNR = STR
+        AA = CYR(I)
+        BB = CYI(I)
+        ATOL = 1.0D0
+        IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 135
+          AA = AA*RTOL
+          BB = BB*RTOL
+          ATOL = TOL
+  135 CONTINUE
+      STR = AA*CSGNR - BB*CSGNI
+      STI = AA*CSGNI + BB*CSGNR
+      CYR(I) = STR*ATOL
+      CYI(I) = STI*ATOL
+      STR = -CSGNI*ZTI
+      CSGNI = CSGNR*ZTI
+      CSGNR = STR
+  130 CONTINUE
+      RETURN
+  140 CONTINUE
+      IF (ZNR.LT.0.0D0) GO TO 230
+      RETURN
+  230 CONTINUE
+      NZ=0
+      IERR=2
+      RETURN
+  240 CONTINUE
+      IF(NW.EQ.(-1)) GO TO 230
+      NZ=0
+      IERR=5
+      RETURN
+  260 CONTINUE
+      NZ=0
+      IERR=4
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbesi.f
@@ -0,0 +1,269 @@
+      SUBROUTINE ZBESI(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
+C***BEGIN PROLOGUE  ZBESI
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  890801   (YYMMDD)
+C***CATEGORY NO.  B5K
+C***KEYWORDS  I-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
+C             MODIFIED BESSEL FUNCTION OF THE FIRST KIND
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE I-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C***DESCRIPTION
+C
+C                    ***A DOUBLE PRECISION ROUTINE***
+C         ON KODE=1, ZBESI COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
+C         BESSEL FUNCTIONS CY(J)=I(FNU+J-1,Z) FOR REAL, NONNEGATIVE
+C         ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z IN THE CUT PLANE
+C         -PI.LT.ARG(Z).LE.PI. ON KODE=2, ZBESI RETURNS THE SCALED
+C         FUNCTIONS
+C
+C         CY(J)=EXP(-ABS(X))*I(FNU+J-1,Z)   J = 1,...,N , X=REAL(Z)
+C
+C         WITH THE EXPONENTIAL GROWTH REMOVED IN BOTH THE LEFT AND
+C         RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
+C         ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
+C         (REF. 1).
+C
+C         INPUT      ZR,ZI,FNU ARE DOUBLE PRECISION
+C           ZR,ZI  - Z=CMPLX(ZR,ZI),  -PI.LT.ARG(Z).LE.PI
+C           FNU    - ORDER OF INITIAL I FUNCTION, FNU.GE.0.0D0
+C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
+C                    KODE= 1  RETURNS
+C                             CY(J)=I(FNU+J-1,Z), J=1,...,N
+C                        = 2  RETURNS
+C                             CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)), J=1,...,N
+C           N      - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
+C
+C         OUTPUT     CYR,CYI ARE DOUBLE PRECISION
+C           CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
+C                    CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
+C                    CY(J)=I(FNU+J-1,Z)  OR
+C                    CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X))  J=1,...,N
+C                    DEPENDING ON KODE, X=REAL(Z)
+C           NZ     - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
+C                    NZ= 0   , NORMAL RETURN
+C                    NZ.GT.0 , LAST NZ COMPONENTS OF CY SET TO ZERO
+C                              TO UNDERFLOW, CY(J)=CMPLX(0.0D0,0.0D0)
+C                              J = N-NZ+1,...,N
+C           IERR   - ERROR FLAG
+C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
+C                    IERR=1, INPUT ERROR   - NO COMPUTATION
+C                    IERR=2, OVERFLOW      - NO COMPUTATION, REAL(Z) TOO
+C                            LARGE ON KODE=1
+C                    IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
+C                            BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
+C                            REDUCTION PRODUCE LESS THAN HALF OF MACHINE
+C                            ACCURACY
+C                    IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
+C                            TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
+C                            CANCE BY ARGUMENT REDUCTION
+C                    IERR=5, ERROR              - NO COMPUTATION,
+C                            ALGORITHM TERMINATION CONDITION NOT MET
+C
+C***LONG DESCRIPTION
+C
+C         THE COMPUTATION IS CARRIED OUT BY THE POWER SERIES FOR
+C         SMALL CABS(Z), THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z),
+C         THE MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN AND A
+C         NEUMANN SERIES FOR IMTERMEDIATE MAGNITUDES, AND THE
+C         UNIFORM ASYMPTOTIC EXPANSIONS FOR I(FNU,Z) AND J(FNU,Z)
+C         FOR LARGE ORDERS. BACKWARD RECURRENCE IS USED TO GENERATE
+C         SEQUENCES OR REDUCE ORDERS WHEN NECESSARY.
+C
+C         THE CALCULATIONS ABOVE ARE DONE IN THE RIGHT HALF PLANE AND
+C         CONTINUED INTO THE LEFT HALF PLANE BY THE FORMULA
+C
+C         I(FNU,Z*EXP(M*PI)) = EXP(M*PI*FNU)*I(FNU,Z)  REAL(Z).GT.0.0
+C                       M = +I OR -I,  I**2=-1
+C
+C         FOR NEGATIVE ORDERS,THE FORMULA
+C
+C              I(-FNU,Z) = I(FNU,Z) + (2/PI)*SIN(PI*FNU)*K(FNU,Z)
+C
+C         CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
+C         THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
+C         INTEGER,THE MAGNITUDE OF I(-FNU,Z)=I(FNU,Z) IS A LARGE
+C         NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
+C         K(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
+C         TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
+C         UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
+C         OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
+C         LARGE MEANS FNU.GT.CABS(Z).
+C
+C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
+C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
+C         LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
+C         CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
+C         LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
+C         IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
+C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
+C         IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
+C         LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
+C         MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
+C         INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
+C         RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
+C         ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
+C         ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
+C         ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
+C         THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
+C         TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
+C         IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
+C         SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
+C
+C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
+C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
+C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
+C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
+C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
+C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
+C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
+C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
+C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
+C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
+C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
+C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
+C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
+C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
+C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
+C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
+C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
+C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
+C         OR -PI/2+P.
+C
+C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
+C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
+C                 COMMERCE, 1955.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
+C
+C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
+C                 1018, MAY, 1985
+C
+C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
+C                 MATH. SOFTWARE, 1986
+C
+C***ROUTINES CALLED  ZBINU,I1MACH,D1MACH
+C***END PROLOGUE  ZBESI
+C     COMPLEX CONE,CSGN,CW,CY,CZERO,Z,ZN
+      DOUBLE PRECISION AA, ALIM, ARG, CONEI, CONER, CSGNI, CSGNR, CYI,
+     * CYR, DIG, ELIM, FNU, FNUL, PI, RL, R1M5, STR, TOL, ZI, ZNI, ZNR,
+     * ZR, D1MACH, AZ, BB, FN, XZABS, ASCLE, RTOL, ATOL, STI
+      INTEGER I, IERR, INU, K, KODE, K1,K2,N,NZ,NN, I1MACH
+      DIMENSION CYR(N), CYI(N)
+      DATA PI /3.14159265358979324D0/
+      DATA CONER, CONEI /1.0D0,0.0D0/
+C
+C***FIRST EXECUTABLE STATEMENT  ZBESI
+      IERR = 0
+      NZ=0
+      IF (FNU.LT.0.0D0) IERR=1
+      IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
+      IF (N.LT.1) IERR=1
+      IF (IERR.NE.0) RETURN
+C-----------------------------------------------------------------------
+C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
+C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
+C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
+C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
+C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
+C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
+C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
+C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
+C     FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
+C-----------------------------------------------------------------------
+      TOL = DMAX1(D1MACH(4),1.0D-18)
+      K1 = I1MACH(15)
+      K2 = I1MACH(16)
+      R1M5 = D1MACH(5)
+      K = MIN0(IABS(K1),IABS(K2))
+      ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
+      K1 = I1MACH(14) - 1
+      AA = R1M5*DBLE(FLOAT(K1))
+      DIG = DMIN1(AA,18.0D0)
+      AA = AA*2.303D0
+      ALIM = ELIM + DMAX1(-AA,-41.45D0)
+      RL = 1.2D0*DIG + 3.0D0
+      FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
+C-----------------------------------------------------------------------------
+C     TEST FOR PROPER RANGE
+C-----------------------------------------------------------------------
+      AZ = XZABS(ZR,ZI)
+      FN = FNU+DBLE(FLOAT(N-1))
+      AA = 0.5D0/TOL
+      BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
+      AA = DMIN1(AA,BB)
+      IF (AZ.GT.AA) GO TO 260
+      IF (FN.GT.AA) GO TO 260
+      AA = DSQRT(AA)
+      IF (AZ.GT.AA) IERR=3
+      IF (FN.GT.AA) IERR=3
+      ZNR = ZR
+      ZNI = ZI
+      CSGNR = CONER
+      CSGNI = CONEI
+      IF (ZR.GE.0.0D0) GO TO 40
+      ZNR = -ZR
+      ZNI = -ZI
+C-----------------------------------------------------------------------
+C     CALCULATE CSGN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
+C     WHEN FNU IS LARGE
+C-----------------------------------------------------------------------
+      INU = INT(SNGL(FNU))
+      ARG = (FNU-DBLE(FLOAT(INU)))*PI
+      IF (ZI.LT.0.0D0) ARG = -ARG
+      CSGNR = DCOS(ARG)
+      CSGNI = DSIN(ARG)
+      IF (MOD(INU,2).EQ.0) GO TO 40
+      CSGNR = -CSGNR
+      CSGNI = -CSGNI
+   40 CONTINUE
+      CALL ZBINU(ZNR, ZNI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, TOL,
+     * ELIM, ALIM)
+      IF (NZ.LT.0) GO TO 120
+      IF (ZR.GE.0.0D0) RETURN
+C-----------------------------------------------------------------------
+C     ANALYTIC CONTINUATION TO THE LEFT HALF PLANE
+C-----------------------------------------------------------------------
+      NN = N - NZ
+      IF (NN.EQ.0) RETURN
+      RTOL = 1.0D0/TOL
+      ASCLE = D1MACH(1)*RTOL*1.0D+3
+      DO 50 I=1,NN
+C       STR = CYR(I)*CSGNR - CYI(I)*CSGNI
+C       CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR
+C       CYR(I) = STR
+        AA = CYR(I)
+        BB = CYI(I)
+        ATOL = 1.0D0
+        IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 55
+          AA = AA*RTOL
+          BB = BB*RTOL
+          ATOL = TOL
+   55   CONTINUE
+        STR = AA*CSGNR - BB*CSGNI
+        STI = AA*CSGNI + BB*CSGNR
+        CYR(I) = STR*ATOL
+        CYI(I) = STI*ATOL
+        CSGNR = -CSGNR
+        CSGNI = -CSGNI
+   50 CONTINUE
+      RETURN
+  120 CONTINUE
+      IF(NZ.EQ.(-2)) GO TO 130
+      NZ = 0
+      IERR=2
+      RETURN
+  130 CONTINUE
+      NZ=0
+      IERR=5
+      RETURN
+  260 CONTINUE
+      NZ=0
+      IERR=4
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbesj.f
@@ -0,0 +1,266 @@
+      SUBROUTINE ZBESJ(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
+C***BEGIN PROLOGUE  ZBESJ
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  890801   (YYMMDD)
+C***CATEGORY NO.  B5K
+C***KEYWORDS  J-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT,
+C             BESSEL FUNCTION OF FIRST KIND
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE THE J-BESSEL FUNCTION OF A COMPLEX ARGUMENT
+C***DESCRIPTION
+C
+C                      ***A DOUBLE PRECISION ROUTINE***
+C         ON KODE=1, CBESJ COMPUTES AN N MEMBER  SEQUENCE OF COMPLEX
+C         BESSEL FUNCTIONS CY(I)=J(FNU+I-1,Z) FOR REAL, NONNEGATIVE
+C         ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE
+C         -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESJ RETURNS THE SCALED
+C         FUNCTIONS
+C
+C         CY(I)=EXP(-ABS(Y))*J(FNU+I-1,Z)   I = 1,...,N , Y=AIMAG(Z)
+C
+C         WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND
+C         LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
+C         ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
+C         (REF. 1).
+C
+C         INPUT      ZR,ZI,FNU ARE DOUBLE PRECISION
+C           ZR,ZI  - Z=CMPLX(ZR,ZI),  -PI.LT.ARG(Z).LE.PI
+C           FNU    - ORDER OF INITIAL J FUNCTION, FNU.GE.0.0D0
+C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
+C                    KODE= 1  RETURNS
+C                             CY(I)=J(FNU+I-1,Z), I=1,...,N
+C                        = 2  RETURNS
+C                             CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)), I=1,...,N
+C           N      - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
+C
+C         OUTPUT     CYR,CYI ARE DOUBLE PRECISION
+C           CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
+C                    CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
+C                    CY(I)=J(FNU+I-1,Z)  OR
+C                    CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y))  I=1,...,N
+C                    DEPENDING ON KODE, Y=AIMAG(Z).
+C           NZ     - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
+C                    NZ= 0   , NORMAL RETURN
+C                    NZ.GT.0 , LAST NZ COMPONENTS OF CY SET  ZERO DUE
+C                              TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
+C                              I = N-NZ+1,...,N
+C           IERR   - ERROR FLAG
+C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
+C                    IERR=1, INPUT ERROR   - NO COMPUTATION
+C                    IERR=2, OVERFLOW      - NO COMPUTATION, AIMAG(Z)
+C                            TOO LARGE ON KODE=1
+C                    IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
+C                            BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
+C                            REDUCTION PRODUCE LESS THAN HALF OF MACHINE
+C                            ACCURACY
+C                    IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
+C                            TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
+C                            CANCE BY ARGUMENT REDUCTION
+C                    IERR=5, ERROR              - NO COMPUTATION,
+C                            ALGORITHM TERMINATION CONDITION NOT MET
+C
+C***LONG DESCRIPTION
+C
+C         THE COMPUTATION IS CARRIED OUT BY THE FORMULA
+C
+C         J(FNU,Z)=EXP( FNU*PI*I/2)*I(FNU,-I*Z)    AIMAG(Z).GE.0.0
+C
+C         J(FNU,Z)=EXP(-FNU*PI*I/2)*I(FNU, I*Z)    AIMAG(Z).LT.0.0
+C
+C         WHERE I**2 = -1 AND I(FNU,Z) IS THE I BESSEL FUNCTION.
+C
+C         FOR NEGATIVE ORDERS,THE FORMULA
+C
+C              J(-FNU,Z) = J(FNU,Z)*COS(PI*FNU) - Y(FNU,Z)*SIN(PI*FNU)
+C
+C         CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
+C         THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
+C         INTEGER,THE MAGNITUDE OF J(-FNU,Z)=J(FNU,Z)*COS(PI*FNU) IS A
+C         LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
+C         Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
+C         TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
+C         UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
+C         OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
+C         LARGE MEANS FNU.GT.CABS(Z).
+C
+C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
+C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
+C         LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
+C         CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
+C         LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
+C         IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
+C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
+C         IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
+C         LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
+C         MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
+C         INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
+C         RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
+C         ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
+C         ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
+C         ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
+C         THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
+C         TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
+C         IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
+C         SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
+C
+C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
+C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
+C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
+C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
+C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
+C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
+C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
+C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
+C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
+C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
+C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
+C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
+C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
+C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
+C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
+C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
+C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
+C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
+C         OR -PI/2+P.
+C
+C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
+C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
+C                 COMMERCE, 1955.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
+C
+C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
+C                 1018, MAY, 1985
+C
+C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
+C                 MATH. SOFTWARE, 1986
+C
+C***ROUTINES CALLED  ZBINU,I1MACH,D1MACH
+C***END PROLOGUE  ZBESJ
+C
+C     COMPLEX CI,CSGN,CY,Z,ZN
+      DOUBLE PRECISION AA, ALIM, ARG, CII, CSGNI, CSGNR, CYI, CYR, DIG,
+     * ELIM, FNU, FNUL, HPI, RL, R1M5, STR, TOL, ZI, ZNI, ZNR, ZR,
+     * D1MACH, BB, FN, AZ, XZABS, ASCLE, RTOL, ATOL, STI
+      INTEGER I, IERR, INU, INUH, IR, K, KODE, K1, K2, N, NL, NZ, I1MACH
+      DIMENSION CYR(N), CYI(N)
+      DATA HPI /1.57079632679489662D0/
+C
+C***FIRST EXECUTABLE STATEMENT  ZBESJ
+      IERR = 0
+      NZ=0
+      IF (FNU.LT.0.0D0) IERR=1
+      IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
+      IF (N.LT.1) IERR=1
+      IF (IERR.NE.0) RETURN
+C-----------------------------------------------------------------------
+C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
+C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
+C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
+C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
+C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
+C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
+C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
+C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
+C     FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
+C-----------------------------------------------------------------------
+      TOL = DMAX1(D1MACH(4),1.0D-18)
+      K1 = I1MACH(15)
+      K2 = I1MACH(16)
+      R1M5 = D1MACH(5)
+      K = MIN0(IABS(K1),IABS(K2))
+      ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
+      K1 = I1MACH(14) - 1
+      AA = R1M5*DBLE(FLOAT(K1))
+      DIG = DMIN1(AA,18.0D0)
+      AA = AA*2.303D0
+      ALIM = ELIM + DMAX1(-AA,-41.45D0)
+      RL = 1.2D0*DIG + 3.0D0
+      FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
+C-----------------------------------------------------------------------
+C     TEST FOR PROPER RANGE
+C-----------------------------------------------------------------------
+      AZ = XZABS(ZR,ZI)
+      FN = FNU+DBLE(FLOAT(N-1))
+      AA = 0.5D0/TOL
+      BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
+      AA = DMIN1(AA,BB)
+      IF (AZ.GT.AA) GO TO 260
+      IF (FN.GT.AA) GO TO 260
+      AA = DSQRT(AA)
+      IF (AZ.GT.AA) IERR=3
+      IF (FN.GT.AA) IERR=3
+C-----------------------------------------------------------------------
+C     CALCULATE CSGN=EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
+C     WHEN FNU IS LARGE
+C-----------------------------------------------------------------------
+      CII = 1.0D0
+      INU = INT(SNGL(FNU))
+      INUH = INU/2
+      IR = INU - 2*INUH
+      ARG = (FNU-DBLE(FLOAT(INU-IR)))*HPI
+      CSGNR = DCOS(ARG)
+      CSGNI = DSIN(ARG)
+      IF (MOD(INUH,2).EQ.0) GO TO 40
+      CSGNR = -CSGNR
+      CSGNI = -CSGNI
+   40 CONTINUE
+C-----------------------------------------------------------------------
+C     ZN IS IN THE RIGHT HALF PLANE
+C-----------------------------------------------------------------------
+      ZNR = ZI
+      ZNI = -ZR
+      IF (ZI.GE.0.0D0) GO TO 50
+      ZNR = -ZNR
+      ZNI = -ZNI
+      CSGNI = -CSGNI
+      CII = -CII
+   50 CONTINUE
+      CALL ZBINU(ZNR, ZNI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, TOL,
+     * ELIM, ALIM)
+      IF (NZ.LT.0) GO TO 130
+      NL = N - NZ
+      IF (NL.EQ.0) RETURN
+      RTOL = 1.0D0/TOL
+      ASCLE = D1MACH(1)*RTOL*1.0D+3
+      DO 60 I=1,NL
+C       STR = CYR(I)*CSGNR - CYI(I)*CSGNI
+C       CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR
+C       CYR(I) = STR
+        AA = CYR(I)
+        BB = CYI(I)
+        ATOL = 1.0D0
+        IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 55
+          AA = AA*RTOL
+          BB = BB*RTOL
+          ATOL = TOL
+   55   CONTINUE
+        STR = AA*CSGNR - BB*CSGNI
+        STI = AA*CSGNI + BB*CSGNR
+        CYR(I) = STR*ATOL
+        CYI(I) = STI*ATOL
+        STR = -CSGNI*CII
+        CSGNI = CSGNR*CII
+        CSGNR = STR
+   60 CONTINUE
+      RETURN
+  130 CONTINUE
+      IF(NZ.EQ.(-2)) GO TO 140
+      NZ = 0
+      IERR = 2
+      RETURN
+  140 CONTINUE
+      NZ=0
+      IERR=5
+      RETURN
+  260 CONTINUE
+      NZ=0
+      IERR=4
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbesk.f
@@ -0,0 +1,281 @@
+      SUBROUTINE ZBESK(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
+C***BEGIN PROLOGUE  ZBESK
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  890801   (YYMMDD)
+C***CATEGORY NO.  B5K
+C***KEYWORDS  K-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
+C             MODIFIED BESSEL FUNCTION OF THE SECOND KIND,
+C             BESSEL FUNCTION OF THE THIRD KIND
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE K-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C***DESCRIPTION
+C
+C                      ***A DOUBLE PRECISION ROUTINE***
+C
+C         ON KODE=1, CBESK COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
+C         BESSEL FUNCTIONS CY(J)=K(FNU+J-1,Z) FOR REAL, NONNEGATIVE
+C         ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z.NE.CMPLX(0.0,0.0)
+C         IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESK
+C         RETURNS THE SCALED K FUNCTIONS,
+C
+C         CY(J)=EXP(Z)*K(FNU+J-1,Z) , J=1,...,N,
+C
+C         WHICH REMOVE THE EXPONENTIAL BEHAVIOR IN BOTH THE LEFT AND
+C         RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND
+C         NOTATION ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL
+C         FUNCTIONS (REF. 1).
+C
+C         INPUT      ZR,ZI,FNU ARE DOUBLE PRECISION
+C           ZR,ZI  - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
+C                    -PI.LT.ARG(Z).LE.PI
+C           FNU    - ORDER OF INITIAL K FUNCTION, FNU.GE.0.0D0
+C           N      - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
+C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
+C                    KODE= 1  RETURNS
+C                             CY(I)=K(FNU+I-1,Z), I=1,...,N
+C                        = 2  RETURNS
+C                             CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
+C
+C         OUTPUT     CYR,CYI ARE DOUBLE PRECISION
+C           CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
+C                    CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
+C                    CY(I)=K(FNU+I-1,Z), I=1,...,N OR
+C                    CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
+C                    DEPENDING ON KODE
+C           NZ     - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW.
+C                    NZ= 0   , NORMAL RETURN
+C                    NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE
+C                              TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
+C                              I=1,...,N WHEN X.GE.0.0. WHEN X.LT.0.0
+C                              NZ STATES ONLY THE NUMBER OF UNDERFLOWS
+C                              IN THE SEQUENCE.
+C
+C           IERR   - ERROR FLAG
+C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
+C                    IERR=1, INPUT ERROR   - NO COMPUTATION
+C                    IERR=2, OVERFLOW      - NO COMPUTATION, FNU IS
+C                            TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
+C                    IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
+C                            BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
+C                            REDUCTION PRODUCE LESS THAN HALF OF MACHINE
+C                            ACCURACY
+C                    IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
+C                            TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
+C                            CANCE BY ARGUMENT REDUCTION
+C                    IERR=5, ERROR              - NO COMPUTATION,
+C                            ALGORITHM TERMINATION CONDITION NOT MET
+C
+C***LONG DESCRIPTION
+C
+C         EQUATIONS OF THE REFERENCE ARE IMPLEMENTED FOR SMALL ORDERS
+C         DNU AND DNU+1.0 IN THE RIGHT HALF PLANE X.GE.0.0. FORWARD
+C         RECURRENCE GENERATES HIGHER ORDERS. K IS CONTINUED TO THE LEFT
+C         HALF PLANE BY THE RELATION
+C
+C         K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
+C         MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
+C
+C         WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
+C
+C         FOR LARGE ORDERS, FNU.GT.FNUL, THE K FUNCTION IS COMPUTED
+C         BY MEANS OF ITS UNIFORM ASYMPTOTIC EXPANSIONS.
+C
+C         FOR NEGATIVE ORDERS, THE FORMULA
+C
+C                       K(-FNU,Z) = K(FNU,Z)
+C
+C         CAN BE USED.
+C
+C         CBESK ASSUMES THAT A SIGNIFICANT DIGIT SINH(X) FUNCTION IS
+C         AVAILABLE.
+C
+C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
+C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
+C         LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
+C         CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
+C         LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
+C         IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
+C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
+C         IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
+C         LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
+C         MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
+C         INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
+C         RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
+C         ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
+C         ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
+C         ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
+C         THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
+C         TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
+C         IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
+C         SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
+C
+C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
+C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
+C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
+C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
+C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
+C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
+C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
+C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
+C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
+C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
+C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
+C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
+C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
+C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
+C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
+C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
+C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
+C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
+C         OR -PI/2+P.
+C
+C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
+C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
+C                 COMMERCE, 1955.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983.
+C
+C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
+C                 1018, MAY, 1985
+C
+C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
+C                 MATH. SOFTWARE, 1986
+C
+C***ROUTINES CALLED  ZACON,ZBKNU,ZBUNK,ZUOIK,XZABS,I1MACH,D1MACH
+C***END PROLOGUE  ZBESK
+C
+C     COMPLEX CY,Z
+      DOUBLE PRECISION AA, ALIM, ALN, ARG, AZ, CYI, CYR, DIG, ELIM, FN,
+     * FNU, FNUL, RL, R1M5, TOL, UFL, ZI, ZR, D1MACH, XZABS, BB
+      INTEGER IERR, K, KODE, K1, K2, MR, N, NN, NUF, NW, NZ, I1MACH
+      DIMENSION CYR(N), CYI(N)
+C***FIRST EXECUTABLE STATEMENT  ZBESK
+      IERR = 0
+      NZ=0
+      IF (ZI.EQ.0.0E0 .AND. ZR.EQ.0.0E0) IERR=1
+      IF (FNU.LT.0.0D0) IERR=1
+      IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
+      IF (N.LT.1) IERR=1
+      IF (IERR.NE.0) RETURN
+      NN = N
+C-----------------------------------------------------------------------
+C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
+C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
+C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
+C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
+C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
+C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
+C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
+C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
+C     FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
+C-----------------------------------------------------------------------
+      TOL = DMAX1(D1MACH(4),1.0D-18)
+      K1 = I1MACH(15)
+      K2 = I1MACH(16)
+      R1M5 = D1MACH(5)
+      K = MIN0(IABS(K1),IABS(K2))
+      ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
+      K1 = I1MACH(14) - 1
+      AA = R1M5*DBLE(FLOAT(K1))
+      DIG = DMIN1(AA,18.0D0)
+      AA = AA*2.303D0
+      ALIM = ELIM + DMAX1(-AA,-41.45D0)
+      FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
+      RL = 1.2D0*DIG + 3.0D0
+C-----------------------------------------------------------------------------
+C     TEST FOR PROPER RANGE
+C-----------------------------------------------------------------------
+      AZ = XZABS(ZR,ZI)
+      FN = FNU + DBLE(FLOAT(NN-1))
+      AA = 0.5D0/TOL
+      BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
+      AA = DMIN1(AA,BB)
+      IF (AZ.GT.AA) GO TO 260
+      IF (FN.GT.AA) GO TO 260
+      AA = DSQRT(AA)
+      IF (AZ.GT.AA) IERR=3
+      IF (FN.GT.AA) IERR=3
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
+C-----------------------------------------------------------------------
+C     UFL = DEXP(-ELIM)
+      UFL = D1MACH(1)*1.0D+3
+      IF (AZ.LT.UFL) GO TO 180
+      IF (FNU.GT.FNUL) GO TO 80
+      IF (FN.LE.1.0D0) GO TO 60
+      IF (FN.GT.2.0D0) GO TO 50
+      IF (AZ.GT.TOL) GO TO 60
+      ARG = 0.5D0*AZ
+      ALN = -FN*DLOG(ARG)
+      IF (ALN.GT.ELIM) GO TO 180
+      GO TO 60
+   50 CONTINUE
+      CALL ZUOIK(ZR, ZI, FNU, KODE, 2, NN, CYR, CYI, NUF, TOL, ELIM,
+     * ALIM)
+      IF (NUF.LT.0) GO TO 180
+      NZ = NZ + NUF
+      NN = NN - NUF
+C-----------------------------------------------------------------------
+C     HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
+C     IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
+C-----------------------------------------------------------------------
+      IF (NN.EQ.0) GO TO 100
+   60 CONTINUE
+      IF (ZR.LT.0.0D0) GO TO 70
+C-----------------------------------------------------------------------
+C     RIGHT HALF PLANE COMPUTATION, REAL(Z).GE.0.
+C-----------------------------------------------------------------------
+      CALL ZBKNU(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
+      IF (NW.LT.0) GO TO 200
+      NZ=NW
+      RETURN
+C-----------------------------------------------------------------------
+C     LEFT HALF PLANE COMPUTATION
+C     PI/2.LT.ARG(Z).LE.PI AND -PI.LT.ARG(Z).LT.-PI/2.
+C-----------------------------------------------------------------------
+   70 CONTINUE
+      IF (NZ.NE.0) GO TO 180
+      MR = 1
+      IF (ZI.LT.0.0D0) MR = -1
+      CALL ZACON(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, RL, FNUL,
+     * TOL, ELIM, ALIM)
+      IF (NW.LT.0) GO TO 200
+      NZ=NW
+      RETURN
+C-----------------------------------------------------------------------
+C     UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
+C-----------------------------------------------------------------------
+   80 CONTINUE
+      MR = 0
+      IF (ZR.GE.0.0D0) GO TO 90
+      MR = 1
+      IF (ZI.LT.0.0D0) MR = -1
+   90 CONTINUE
+      CALL ZBUNK(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, TOL, ELIM,
+     * ALIM)
+      IF (NW.LT.0) GO TO 200
+      NZ = NZ + NW
+      RETURN
+  100 CONTINUE
+      IF (ZR.LT.0.0D0) GO TO 180
+      RETURN
+  180 CONTINUE
+      NZ = 0
+      IERR=2
+      RETURN
+  200 CONTINUE
+      IF(NW.EQ.(-1)) GO TO 180
+      NZ=0
+      IERR=5
+      RETURN
+  260 CONTINUE
+      NZ=0
+      IERR=4
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbesy.f
@@ -0,0 +1,244 @@
+      SUBROUTINE ZBESY(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, CWRKR, CWRKI,
+     *                 IERR)
+C***BEGIN PROLOGUE  ZBESY
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  890801   (YYMMDD)
+C***CATEGORY NO.  B5K
+C***KEYWORDS  Y-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT,
+C             BESSEL FUNCTION OF SECOND KIND
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE THE Y-BESSEL FUNCTION OF A COMPLEX ARGUMENT
+C***DESCRIPTION
+C
+C                      ***A DOUBLE PRECISION ROUTINE***
+C
+C         ON KODE=1, CBESY COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
+C         BESSEL FUNCTIONS CY(I)=Y(FNU+I-1,Z) FOR REAL, NONNEGATIVE
+C         ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE
+C         -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESY RETURNS THE SCALED
+C         FUNCTIONS
+C
+C         CY(I)=EXP(-ABS(Y))*Y(FNU+I-1,Z)   I = 1,...,N , Y=AIMAG(Z)
+C
+C         WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND
+C         LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
+C         ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
+C         (REF. 1).
+C
+C         INPUT      ZR,ZI,FNU ARE DOUBLE PRECISION
+C           ZR,ZI  - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
+C                    -PI.LT.ARG(Z).LE.PI
+C           FNU    - ORDER OF INITIAL Y FUNCTION, FNU.GE.0.0D0
+C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
+C                    KODE= 1  RETURNS
+C                             CY(I)=Y(FNU+I-1,Z), I=1,...,N
+C                        = 2  RETURNS
+C                             CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y)), I=1,...,N
+C                             WHERE Y=AIMAG(Z)
+C           N      - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
+C           CWRKR, - DOUBLE PRECISION WORK VECTORS OF DIMENSION AT
+C           CWRKI    AT LEAST N
+C
+C         OUTPUT     CYR,CYI ARE DOUBLE PRECISION
+C           CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
+C                    CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
+C                    CY(I)=Y(FNU+I-1,Z)  OR
+C                    CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y))  I=1,...,N
+C                    DEPENDING ON KODE.
+C           NZ     - NZ=0 , A NORMAL RETURN
+C                    NZ.GT.0 , NZ COMPONENTS OF CY SET TO ZERO DUE TO
+C                    UNDERFLOW (GENERALLY ON KODE=2)
+C           IERR   - ERROR FLAG
+C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
+C                    IERR=1, INPUT ERROR   - NO COMPUTATION
+C                    IERR=2, OVERFLOW      - NO COMPUTATION, FNU IS
+C                            TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
+C                    IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
+C                            BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
+C                            REDUCTION PRODUCE LESS THAN HALF OF MACHINE
+C                            ACCURACY
+C                    IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
+C                            TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
+C                            CANCE BY ARGUMENT REDUCTION
+C                    IERR=5, ERROR              - NO COMPUTATION,
+C                            ALGORITHM TERMINATION CONDITION NOT MET
+C
+C***LONG DESCRIPTION
+C
+C         THE COMPUTATION IS CARRIED OUT BY THE FORMULA
+C
+C         Y(FNU,Z)=0.5*(H(1,FNU,Z)-H(2,FNU,Z))/I
+C
+C         WHERE I**2 = -1 AND THE HANKEL BESSEL FUNCTIONS H(1,FNU,Z)
+C         AND H(2,FNU,Z) ARE CALCULATED IN CBESH.
+C
+C         FOR NEGATIVE ORDERS,THE FORMULA
+C
+C              Y(-FNU,Z) = Y(FNU,Z)*COS(PI*FNU) + J(FNU,Z)*SIN(PI*FNU)
+C
+C         CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO HALF ODD
+C         INTEGERS THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE
+C         POSITIVE HALF ODD INTEGER,THE MAGNITUDE OF Y(-FNU,Z)=J(FNU,Z)*
+C         SIN(PI*FNU) IS A LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS
+C         NOT A HALF ODD INTEGER, Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A
+C         LARGE POSITIVE POWER OF TEN AND THE MOST THAT THE SECOND TERM
+C         CAN BE REDUCED IS BY UNIT ROUNDOFF FROM THE COEFFICIENT. THUS,
+C         WIDE CHANGES CAN OCCUR WITHIN UNIT ROUNDOFF OF A LARGE HALF
+C         ODD INTEGER. HERE, LARGE MEANS FNU.GT.CABS(Z).
+C
+C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
+C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
+C         LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
+C         CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
+C         LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
+C         IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
+C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
+C         IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
+C         LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
+C         MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
+C         INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
+C         RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
+C         ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
+C         ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
+C         ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
+C         THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
+C         TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
+C         IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
+C         SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
+C
+C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
+C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
+C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
+C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
+C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
+C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
+C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
+C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
+C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
+C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
+C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
+C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
+C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
+C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
+C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
+C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
+C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
+C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
+C         OR -PI/2+P.
+C
+C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
+C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
+C                 COMMERCE, 1955.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
+C
+C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
+C                 1018, MAY, 1985
+C
+C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
+C                 MATH. SOFTWARE, 1986
+C
+C***ROUTINES CALLED  ZBESH,I1MACH,D1MACH
+C***END PROLOGUE  ZBESY
+C
+C     COMPLEX CWRK,CY,C1,C2,EX,HCI,Z,ZU,ZV
+      DOUBLE PRECISION CWRKI, CWRKR, CYI, CYR, C1I, C1R, C2I, C2R,
+     * ELIM, EXI, EXR, EY, FNU, HCII, STI, STR, TAY, ZI, ZR, DEXP,
+     * D1MACH, ASCLE, RTOL, ATOL, AA, BB, TOL
+      INTEGER I, IERR, K, KODE, K1, K2, N, NZ, NZ1, NZ2, I1MACH
+      DIMENSION CYR(N), CYI(N), CWRKR(N), CWRKI(N)
+C***FIRST EXECUTABLE STATEMENT  ZBESY
+      IERR = 0
+      NZ=0
+      IF (ZR.EQ.0.0D0 .AND. ZI.EQ.0.0D0) IERR=1
+      IF (FNU.LT.0.0D0) IERR=1
+      IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
+      IF (N.LT.1) IERR=1
+      IF (IERR.NE.0) RETURN
+      HCII = 0.5D0
+      CALL ZBESH(ZR, ZI, FNU, KODE, 1, N, CYR, CYI, NZ1, IERR)
+      IF (IERR.NE.0.AND.IERR.NE.3) GO TO 170
+      CALL ZBESH(ZR, ZI, FNU, KODE, 2, N, CWRKR, CWRKI, NZ2, IERR)
+      IF (IERR.NE.0.AND.IERR.NE.3) GO TO 170
+      NZ = MIN0(NZ1,NZ2)
+      IF (KODE.EQ.2) GO TO 60
+      DO 50 I=1,N
+        STR = CWRKR(I) - CYR(I)
+        STI = CWRKI(I) - CYI(I)
+        CYR(I) = -STI*HCII
+        CYI(I) = STR*HCII
+   50 CONTINUE
+      RETURN
+   60 CONTINUE
+      TOL = DMAX1(D1MACH(4),1.0D-18)
+      K1 = I1MACH(15)
+      K2 = I1MACH(16)
+      K = MIN0(IABS(K1),IABS(K2))
+      R1M5 = D1MACH(5)
+C-----------------------------------------------------------------------
+C     ELIM IS THE APPROXIMATE EXPONENTIAL UNDER- AND OVERFLOW LIMIT
+C-----------------------------------------------------------------------
+      ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
+      EXR = DCOS(ZR)
+      EXI = DSIN(ZR)
+      EY = 0.0D0
+      TAY = DABS(ZI+ZI)
+      IF (TAY.LT.ELIM) EY = DEXP(-TAY)
+      IF (ZI.LT.0.0D0) GO TO 90
+      C1R = EXR*EY
+      C1I = EXI*EY
+      C2R = EXR
+      C2I = -EXI
+   70 CONTINUE
+      NZ = 0
+      RTOL = 1.0D0/TOL
+      ASCLE = D1MACH(1)*RTOL*1.0D+3
+      DO 80 I=1,N
+C       STR = C1R*CYR(I) - C1I*CYI(I)
+C       STI = C1R*CYI(I) + C1I*CYR(I)
+C       STR = -STR + C2R*CWRKR(I) - C2I*CWRKI(I)
+C       STI = -STI + C2R*CWRKI(I) + C2I*CWRKR(I)
+C       CYR(I) = -STI*HCII
+C       CYI(I) = STR*HCII
+        AA = CWRKR(I)
+        BB = CWRKI(I)
+        ATOL = 1.0D0
+        IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 75
+          AA = AA*RTOL
+          BB = BB*RTOL
+          ATOL = TOL
+   75   CONTINUE
+        STR = (AA*C2R - BB*C2I)*ATOL
+        STI = (AA*C2I + BB*C2R)*ATOL
+        AA = CYR(I)
+        BB = CYI(I)
+        ATOL = 1.0D0
+        IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 85
+          AA = AA*RTOL
+          BB = BB*RTOL
+          ATOL = TOL
+   85   CONTINUE
+        STR = STR - (AA*C1R - BB*C1I)*ATOL
+        STI = STI - (AA*C1I + BB*C1R)*ATOL
+        CYR(I) = -STI*HCII
+        CYI(I) =  STR*HCII
+        IF (STR.EQ.0.0D0 .AND. STI.EQ.0.0D0 .AND. EY.EQ.0.0D0) NZ = NZ
+     *   + 1
+   80 CONTINUE
+      RETURN
+   90 CONTINUE
+      C1R = EXR
+      C1I = EXI
+      C2R = EXR*EY
+      C2I = -EXI*EY
+      GO TO 70
+  170 CONTINUE
+      NZ = 0
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbinu.f
@@ -0,0 +1,110 @@
+      SUBROUTINE ZBINU(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL,
+     * TOL, ELIM, ALIM)
+C***BEGIN PROLOGUE  ZBINU
+C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZAIRY,ZBIRY
+C
+C     ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
+C
+C***ROUTINES CALLED  XZABS,ZASYI,ZBUNI,ZMLRI,ZSERI,ZUOIK,ZWRSK
+C***END PROLOGUE  ZBINU
+      DOUBLE PRECISION ALIM, AZ, CWI, CWR, CYI, CYR, DFNU, ELIM, FNU,
+     * FNUL, RL, TOL, ZEROI, ZEROR, ZI, ZR, XZABS
+      INTEGER I, INW, KODE, N, NLAST, NN, NUI, NW, NZ
+      DIMENSION CYR(N), CYI(N), CWR(2), CWI(2)
+      DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
+C
+      NZ = 0
+      AZ = XZABS(ZR,ZI)
+      NN = N
+      DFNU = FNU + DBLE(FLOAT(N-1))
+      IF (AZ.LE.2.0D0) GO TO 10
+      IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
+   10 CONTINUE
+C-----------------------------------------------------------------------
+C     POWER SERIES
+C-----------------------------------------------------------------------
+      CALL ZSERI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
+      INW = IABS(NW)
+      NZ = NZ + INW
+      NN = NN - INW
+      IF (NN.EQ.0) RETURN
+      IF (NW.GE.0) GO TO 120
+      DFNU = FNU + DBLE(FLOAT(NN-1))
+   20 CONTINUE
+      IF (AZ.LT.RL) GO TO 40
+      IF (DFNU.LE.1.0D0) GO TO 30
+      IF (AZ+AZ.LT.DFNU*DFNU) GO TO 50
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR LARGE Z
+C-----------------------------------------------------------------------
+   30 CONTINUE
+      CALL ZASYI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, RL, TOL, ELIM,
+     * ALIM)
+      IF (NW.LT.0) GO TO 130
+      GO TO 120
+   40 CONTINUE
+      IF (DFNU.LE.1.0D0) GO TO 70
+   50 CONTINUE
+C-----------------------------------------------------------------------
+C     OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
+C-----------------------------------------------------------------------
+      CALL ZUOIK(ZR, ZI, FNU, KODE, 1, NN, CYR, CYI, NW, TOL, ELIM,
+     * ALIM)
+      IF (NW.LT.0) GO TO 130
+      NZ = NZ + NW
+      NN = NN - NW
+      IF (NN.EQ.0) RETURN
+      DFNU = FNU+DBLE(FLOAT(NN-1))
+      IF (DFNU.GT.FNUL) GO TO 110
+      IF (AZ.GT.FNUL) GO TO 110
+   60 CONTINUE
+      IF (AZ.GT.RL) GO TO 80
+   70 CONTINUE
+C-----------------------------------------------------------------------
+C     MILLER ALGORITHM NORMALIZED BY THE SERIES
+C-----------------------------------------------------------------------
+      CALL ZMLRI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL)
+      IF(NW.LT.0) GO TO 130
+      GO TO 120
+   80 CONTINUE
+C-----------------------------------------------------------------------
+C     MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
+C-----------------------------------------------------------------------
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
+C-----------------------------------------------------------------------
+      CALL ZUOIK(ZR, ZI, FNU, KODE, 2, 2, CWR, CWI, NW, TOL, ELIM,
+     * ALIM)
+      IF (NW.GE.0) GO TO 100
+      NZ = NN
+      DO 90 I=1,NN
+        CYR(I) = ZEROR
+        CYI(I) = ZEROI
+   90 CONTINUE
+      RETURN
+  100 CONTINUE
+      IF (NW.GT.0) GO TO 130
+      CALL ZWRSK(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, CWR, CWI, TOL,
+     * ELIM, ALIM)
+      IF (NW.LT.0) GO TO 130
+      GO TO 120
+  110 CONTINUE
+C-----------------------------------------------------------------------
+C     INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
+C-----------------------------------------------------------------------
+      NUI = INT(SNGL(FNUL-DFNU)) + 1
+      NUI = MAX0(NUI,0)
+      CALL ZBUNI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, NUI, NLAST, FNUL,
+     * TOL, ELIM, ALIM)
+      IF (NW.LT.0) GO TO 130
+      NZ = NZ + NW
+      IF (NLAST.EQ.0) GO TO 120
+      NN = NLAST
+      GO TO 60
+  120 CONTINUE
+      RETURN
+  130 CONTINUE
+      NZ = -1
+      IF(NW.EQ.(-2)) NZ=-2
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbiry.f
@@ -0,0 +1,364 @@
+      SUBROUTINE ZBIRY(ZR, ZI, ID, KODE, BIR, BII, IERR)
+C***BEGIN PROLOGUE  ZBIRY
+C***DATE WRITTEN   830501   (YYMMDD)
+C***REVISION DATE  890801   (YYMMDD)
+C***CATEGORY NO.  B5K
+C***KEYWORDS  AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
+C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
+C***PURPOSE  TO COMPUTE AIRY FUNCTIONS BI(Z) AND DBI(Z) FOR COMPLEX Z
+C***DESCRIPTION
+C
+C                      ***A DOUBLE PRECISION ROUTINE***
+C         ON KODE=1, CBIRY COMPUTES THE COMPLEX AIRY FUNCTION BI(Z) OR
+C         ITS DERIVATIVE DBI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
+C         KODE=2, A SCALING OPTION CEXP(-AXZTA)*BI(Z) OR CEXP(-AXZTA)*
+C         DBI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL BEHAVIOR IN
+C         BOTH THE LEFT AND RIGHT HALF PLANES WHERE
+C         ZTA=(2/3)*Z*CSQRT(Z)=CMPLX(XZTA,YZTA) AND AXZTA=ABS(XZTA).
+C         DEFINTIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
+C         MATHEMATICAL FUNCTIONS (REF. 1).
+C
+C         INPUT      ZR,ZI ARE DOUBLE PRECISION
+C           ZR,ZI  - Z=CMPLX(ZR,ZI)
+C           ID     - ORDER OF DERIVATIVE, ID=0 OR ID=1
+C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
+C                    KODE= 1  RETURNS
+C                             BI=BI(Z)                 ON ID=0 OR
+C                             BI=DBI(Z)/DZ             ON ID=1
+C                        = 2  RETURNS
+C                             BI=CEXP(-AXZTA)*BI(Z)     ON ID=0 OR
+C                             BI=CEXP(-AXZTA)*DBI(Z)/DZ ON ID=1 WHERE
+C                             ZTA=(2/3)*Z*CSQRT(Z)=CMPLX(XZTA,YZTA)
+C                             AND AXZTA=ABS(XZTA)
+C
+C         OUTPUT     BIR,BII ARE DOUBLE PRECISION
+C           BIR,BII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
+C                    KODE
+C           IERR   - ERROR FLAG
+C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
+C                    IERR=1, INPUT ERROR   - NO COMPUTATION
+C                    IERR=2, OVERFLOW      - NO COMPUTATION, REAL(Z)
+C                            TOO LARGE ON KODE=1
+C                    IERR=3, CABS(Z) LARGE      - COMPUTATION COMPLETED
+C                            LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
+C                            PRODUCE LESS THAN HALF OF MACHINE ACCURACY
+C                    IERR=4, CABS(Z) TOO LARGE  - NO COMPUTATION
+C                            COMPLETE LOSS OF ACCURACY BY ARGUMENT
+C                            REDUCTION
+C                    IERR=5, ERROR              - NO COMPUTATION,
+C                            ALGORITHM TERMINATION CONDITION NOT MET
+C
+C***LONG DESCRIPTION
+C
+C         BI AND DBI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE I BESSEL
+C         FUNCTIONS BY
+C
+C                BI(Z)=C*SQRT(Z)*( I(-1/3,ZTA) + I(1/3,ZTA) )
+C               DBI(Z)=C *  Z  * ( I(-2/3,ZTA) + I(2/3,ZTA) )
+C                               C=1.0/SQRT(3.0)
+C                             ZTA=(2/3)*Z**(3/2)
+C
+C         WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
+C
+C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
+C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
+C         OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
+C         THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
+C         THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
+C         FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
+C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
+C         ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
+C         ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
+C         FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
+C         LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
+C         MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
+C         AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
+C         PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
+C         PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
+C         ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
+C         NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
+C         DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
+C         EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
+C         NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
+C         PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER
+C         MACHINES.
+C
+C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
+C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
+C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
+C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
+C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
+C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
+C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
+C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
+C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
+C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
+C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
+C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
+C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
+C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
+C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
+C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
+C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
+C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
+C         OR -PI/2+P.
+C
+C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
+C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
+C                 COMMERCE, 1955.
+C
+C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
+C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
+C
+C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
+C                 1018, MAY, 1985
+C
+C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
+C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
+C                 MATH. SOFTWARE, 1986
+C
+C***ROUTINES CALLED  ZBINU,XZABS,ZDIV,XZSQRT,D1MACH,I1MACH
+C***END PROLOGUE  ZBIRY
+C     COMPLEX BI,CONE,CSQ,CY,S1,S2,TRM1,TRM2,Z,ZTA,Z3
+      DOUBLE PRECISION AA, AD, AK, ALIM, ATRM, AZ, AZ3, BB, BII, BIR,
+     * BK, CC, CK, COEF, CONEI, CONER, CSQI, CSQR, CYI, CYR, C1, C2,
+     * DIG, DK, D1, D2, EAA, ELIM, FID, FMR, FNU, FNUL, PI, RL, R1M5,
+     * SFAC, STI, STR, S1I, S1R, S2I, S2R, TOL, TRM1I, TRM1R, TRM2I,
+     * TRM2R, TTH, ZI, ZR, ZTAI, ZTAR, Z3I, Z3R, D1MACH, XZABS
+      INTEGER ID, IERR, K, KODE, K1, K2, NZ, I1MACH
+      DIMENSION CYR(2), CYI(2)
+      DATA TTH, C1, C2, COEF, PI /6.66666666666666667D-01,
+     * 6.14926627446000736D-01,4.48288357353826359D-01,
+     * 5.77350269189625765D-01,3.14159265358979324D+00/
+      DATA CONER, CONEI /1.0D0,0.0D0/
+C***FIRST EXECUTABLE STATEMENT  ZBIRY
+      IERR = 0
+      NZ=0
+      IF (ID.LT.0 .OR. ID.GT.1) IERR=1
+      IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
+      IF (IERR.NE.0) RETURN
+      AZ = XZABS(ZR,ZI)
+      TOL = DMAX1(D1MACH(4),1.0D-18)
+      FID = DBLE(FLOAT(ID))
+      IF (AZ.GT.1.0E0) GO TO 70
+C-----------------------------------------------------------------------
+C     POWER SERIES FOR CABS(Z).LE.1.
+C-----------------------------------------------------------------------
+      S1R = CONER
+      S1I = CONEI
+      S2R = CONER
+      S2I = CONEI
+      IF (AZ.LT.TOL) GO TO 130
+      AA = AZ*AZ
+      IF (AA.LT.TOL/AZ) GO TO 40
+      TRM1R = CONER
+      TRM1I = CONEI
+      TRM2R = CONER
+      TRM2I = CONEI
+      ATRM = 1.0D0
+      STR = ZR*ZR - ZI*ZI
+      STI = ZR*ZI + ZI*ZR
+      Z3R = STR*ZR - STI*ZI
+      Z3I = STR*ZI + STI*ZR
+      AZ3 = AZ*AA
+      AK = 2.0D0 + FID
+      BK = 3.0D0 - FID - FID
+      CK = 4.0D0 - FID
+      DK = 3.0D0 + FID + FID
+      D1 = AK*DK
+      D2 = BK*CK
+      AD = DMIN1(D1,D2)
+      AK = 24.0D0 + 9.0D0*FID
+      BK = 30.0D0 - 9.0D0*FID
+      DO 30 K=1,25
+        STR = (TRM1R*Z3R-TRM1I*Z3I)/D1
+        TRM1I = (TRM1R*Z3I+TRM1I*Z3R)/D1
+        TRM1R = STR
+        S1R = S1R + TRM1R
+        S1I = S1I + TRM1I
+        STR = (TRM2R*Z3R-TRM2I*Z3I)/D2
+        TRM2I = (TRM2R*Z3I+TRM2I*Z3R)/D2
+        TRM2R = STR
+        S2R = S2R + TRM2R
+        S2I = S2I + TRM2I
+        ATRM = ATRM*AZ3/AD
+        D1 = D1 + AK
+        D2 = D2 + BK
+        AD = DMIN1(D1,D2)
+        IF (ATRM.LT.TOL*AD) GO TO 40
+        AK = AK + 18.0D0
+        BK = BK + 18.0D0
+   30 CONTINUE
+   40 CONTINUE
+      IF (ID.EQ.1) GO TO 50
+      BIR = C1*S1R + C2*(ZR*S2R-ZI*S2I)
+      BII = C1*S1I + C2*(ZR*S2I+ZI*S2R)
+      IF (KODE.EQ.1) RETURN
+      CALL XZSQRT(ZR, ZI, STR, STI)
+      ZTAR = TTH*(ZR*STR-ZI*STI)
+      ZTAI = TTH*(ZR*STI+ZI*STR)
+      AA = ZTAR
+      AA = -DABS(AA)
+      EAA = DEXP(AA)
+      BIR = BIR*EAA
+      BII = BII*EAA
+      RETURN
+   50 CONTINUE
+      BIR = S2R*C2
+      BII = S2I*C2
+      IF (AZ.LE.TOL) GO TO 60
+      CC = C1/(1.0D0+FID)
+      STR = S1R*ZR - S1I*ZI
+      STI = S1R*ZI + S1I*ZR
+      BIR = BIR + CC*(STR*ZR-STI*ZI)
+      BII = BII + CC*(STR*ZI+STI*ZR)
+   60 CONTINUE
+      IF (KODE.EQ.1) RETURN
+      CALL XZSQRT(ZR, ZI, STR, STI)
+      ZTAR = TTH*(ZR*STR-ZI*STI)
+      ZTAI = TTH*(ZR*STI+ZI*STR)
+      AA = ZTAR
+      AA = -DABS(AA)
+      EAA = DEXP(AA)
+      BIR = BIR*EAA
+      BII = BII*EAA
+      RETURN
+C-----------------------------------------------------------------------
+C     CASE FOR CABS(Z).GT.1.0
+C-----------------------------------------------------------------------
+   70 CONTINUE
+      FNU = (1.0D0+FID)/3.0D0
+C-----------------------------------------------------------------------
+C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
+C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
+C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
+C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
+C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
+C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
+C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
+C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
+C     FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
+C-----------------------------------------------------------------------
+      K1 = I1MACH(15)
+      K2 = I1MACH(16)
+      R1M5 = D1MACH(5)
+      K = MIN0(IABS(K1),IABS(K2))
+      ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
+      K1 = I1MACH(14) - 1
+      AA = R1M5*DBLE(FLOAT(K1))
+      DIG = DMIN1(AA,18.0D0)
+      AA = AA*2.303D0
+      ALIM = ELIM + DMAX1(-AA,-41.45D0)
+      RL = 1.2D0*DIG + 3.0D0
+      FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
+C-----------------------------------------------------------------------
+C     TEST FOR RANGE
+C-----------------------------------------------------------------------
+      AA=0.5D0/TOL
+      BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
+      AA=DMIN1(AA,BB)
+      AA=AA**TTH
+      IF (AZ.GT.AA) GO TO 260
+      AA=DSQRT(AA)
+      IF (AZ.GT.AA) IERR=3
+      CALL XZSQRT(ZR, ZI, CSQR, CSQI)
+      ZTAR = TTH*(ZR*CSQR-ZI*CSQI)
+      ZTAI = TTH*(ZR*CSQI+ZI*CSQR)
+C-----------------------------------------------------------------------
+C     RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
+C-----------------------------------------------------------------------
+      SFAC = 1.0D0
+      AK = ZTAI
+      IF (ZR.GE.0.0D0) GO TO 80
+      BK = ZTAR
+      CK = -DABS(BK)
+      ZTAR = CK
+      ZTAI = AK
+   80 CONTINUE
+      IF (ZI.NE.0.0D0 .OR. ZR.GT.0.0D0) GO TO 90
+      ZTAR = 0.0D0
+      ZTAI = AK
+   90 CONTINUE
+      AA = ZTAR
+      IF (KODE.EQ.2) GO TO 100
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST
+C-----------------------------------------------------------------------
+      BB = DABS(AA)
+      IF (BB.LT.ALIM) GO TO 100
+      BB = BB + 0.25D0*DLOG(AZ)
+      SFAC = TOL
+      IF (BB.GT.ELIM) GO TO 190
+  100 CONTINUE
+      FMR = 0.0D0
+      IF (AA.GE.0.0D0 .AND. ZR.GT.0.0D0) GO TO 110
+      FMR = PI
+      IF (ZI.LT.0.0D0) FMR = -PI
+      ZTAR = -ZTAR
+      ZTAI = -ZTAI
+  110 CONTINUE
+C-----------------------------------------------------------------------
+C     AA=FACTOR FOR ANALYTIC CONTINUATION OF I(FNU,ZTA)
+C     KODE=2 RETURNS EXP(-ABS(XZTA))*I(FNU,ZTA) FROM CBESI
+C-----------------------------------------------------------------------
+      CALL ZBINU(ZTAR, ZTAI, FNU, KODE, 1, CYR, CYI, NZ, RL, FNUL, TOL,
+     * ELIM, ALIM)
+      IF (NZ.LT.0) GO TO 200
+      AA = FMR*FNU
+      Z3R = SFAC
+      STR = DCOS(AA)
+      STI = DSIN(AA)
+      S1R = (STR*CYR(1)-STI*CYI(1))*Z3R
+      S1I = (STR*CYI(1)+STI*CYR(1))*Z3R
+      FNU = (2.0D0-FID)/3.0D0
+      CALL ZBINU(ZTAR, ZTAI, FNU, KODE, 2, CYR, CYI, NZ, RL, FNUL, TOL,
+     * ELIM, ALIM)
+      CYR(1) = CYR(1)*Z3R
+      CYI(1) = CYI(1)*Z3R
+      CYR(2) = CYR(2)*Z3R
+      CYI(2) = CYI(2)*Z3R
+C-----------------------------------------------------------------------
+C     BACKWARD RECUR ONE STEP FOR ORDERS -1/3 OR -2/3
+C-----------------------------------------------------------------------
+      CALL ZDIV(CYR(1), CYI(1), ZTAR, ZTAI, STR, STI)
+      S2R = (FNU+FNU)*STR + CYR(2)
+      S2I = (FNU+FNU)*STI + CYI(2)
+      AA = FMR*(FNU-1.0D0)
+      STR = DCOS(AA)
+      STI = DSIN(AA)
+      S1R = COEF*(S1R+S2R*STR-S2I*STI)
+      S1I = COEF*(S1I+S2R*STI+S2I*STR)
+      IF (ID.EQ.1) GO TO 120
+      STR = CSQR*S1R - CSQI*S1I
+      S1I = CSQR*S1I + CSQI*S1R
+      S1R = STR
+      BIR = S1R/SFAC
+      BII = S1I/SFAC
+      RETURN
+  120 CONTINUE
+      STR = ZR*S1R - ZI*S1I
+      S1I = ZR*S1I + ZI*S1R
+      S1R = STR
+      BIR = S1R/SFAC
+      BII = S1I/SFAC
+      RETURN
+  130 CONTINUE
+      AA = C1*(1.0D0-FID) + FID*C2
+      BIR = AA
+      BII = 0.0D0
+      RETURN
+  190 CONTINUE
+      IERR=2
+      NZ=0
+      RETURN
+  200 CONTINUE
+      IF(NZ.EQ.(-1)) GO TO 190
+      NZ=0
+      IERR=5
+      RETURN
+  260 CONTINUE
+      IERR=4
+      NZ=0
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbknu.f
@@ -0,0 +1,568 @@
+      SUBROUTINE ZBKNU(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM,
+     * ALIM)
+C***BEGIN PROLOGUE  ZBKNU
+C***REFER TO  ZBESI,ZBESK,ZAIRY,ZBESH
+C
+C     ZBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE.
+C
+C***ROUTINES CALLED  DGAMLN,I1MACH,D1MACH,ZKSCL,ZSHCH,ZUCHK,XZABS,ZDIV,
+C                    XZEXP,XZLOG,ZMLT,XZSQRT
+C***END PROLOGUE  ZBKNU
+C
+      DOUBLE PRECISION AA, AK, ALIM, ASCLE, A1, A2, BB, BK, BRY, CAZ,
+     * CBI, CBR, CC, CCHI, CCHR, CKI, CKR, COEFI, COEFR, CONEI, CONER,
+     * CRSCR, CSCLR, CSHI, CSHR, CSI, CSR, CSRR, CSSR, CTWOR,
+     * CZEROI, CZEROR, CZI, CZR, DNU, DNU2, DPI, ELIM, ETEST, FC, FHS,
+     * FI, FK, FKS, FMUI, FMUR, FNU, FPI, FR, G1, G2, HPI, PI, PR, PTI,
+     * PTR, P1I, P1R, P2I, P2M, P2R, QI, QR, RAK, RCAZ, RTHPI, RZI,
+     * RZR, R1, S, SMUI, SMUR, SPI, STI, STR, S1I, S1R, S2I, S2R, TM,
+     * TOL, TTH, T1, T2, YI, YR, ZI, ZR, DGAMLN, D1MACH, XZABS, ELM,
+     * CELMR, ZDR, ZDI, AS, ALAS, HELIM, CYR, CYI
+      INTEGER I, IFLAG, INU, K, KFLAG, KK, KMAX, KODE, KODED, N, NZ,
+     * IDUM, I1MACH, J, IC, INUB, NW
+      DIMENSION YR(N), YI(N), CC(8), CSSR(3), CSRR(3), BRY(3), CYR(2),
+     * CYI(2)
+C     COMPLEX Z,Y,A,B,RZ,SMU,FU,FMU,F,FLRZ,CZ,S1,S2,CSH,CCH
+C     COMPLEX CK,P,Q,COEF,P1,P2,CBK,PT,CZERO,CONE,CTWO,ST,EZ,CS,DK
+C
+      DATA KMAX / 30 /
+      DATA CZEROR,CZEROI,CONER,CONEI,CTWOR,R1/
+     1  0.0D0 , 0.0D0 , 1.0D0 , 0.0D0 , 2.0D0 , 2.0D0 /
+      DATA DPI, RTHPI, SPI ,HPI, FPI, TTH /
+     1     3.14159265358979324D0,       1.25331413731550025D0,
+     2     1.90985931710274403D0,       1.57079632679489662D0,
+     3     1.89769999331517738D0,       6.66666666666666666D-01/
+      DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)/
+     1     5.77215664901532861D-01,    -4.20026350340952355D-02,
+     2    -4.21977345555443367D-02,     7.21894324666309954D-03,
+     3    -2.15241674114950973D-04,    -2.01348547807882387D-05,
+     4     1.13302723198169588D-06,     6.11609510448141582D-09/
+C
+      CAZ = XZABS(ZR,ZI)
+      CSCLR = 1.0D0/TOL
+      CRSCR = TOL
+      CSSR(1) = CSCLR
+      CSSR(2) = 1.0D0
+      CSSR(3) = CRSCR
+      CSRR(1) = CRSCR
+      CSRR(2) = 1.0D0
+      CSRR(3) = CSCLR
+      BRY(1) = 1.0D+3*D1MACH(1)/TOL
+      BRY(2) = 1.0D0/BRY(1)
+      BRY(3) = D1MACH(2)
+      NZ = 0
+      IFLAG = 0
+      KODED = KODE
+      RCAZ = 1.0D0/CAZ
+      STR = ZR*RCAZ
+      STI = -ZI*RCAZ
+      RZR = (STR+STR)*RCAZ
+      RZI = (STI+STI)*RCAZ
+      INU = INT(SNGL(FNU+0.5D0))
+      DNU = FNU - DBLE(FLOAT(INU))
+      IF (DABS(DNU).EQ.0.5D0) GO TO 110
+      DNU2 = 0.0D0
+      IF (DABS(DNU).GT.TOL) DNU2 = DNU*DNU
+      IF (CAZ.GT.R1) GO TO 110
+C-----------------------------------------------------------------------
+C     SERIES FOR CABS(Z).LE.R1
+C-----------------------------------------------------------------------
+      FC = 1.0D0
+      CALL XZLOG(RZR, RZI, SMUR, SMUI, IDUM)
+      FMUR = SMUR*DNU
+      FMUI = SMUI*DNU
+      CALL ZSHCH(FMUR, FMUI, CSHR, CSHI, CCHR, CCHI)
+      IF (DNU.EQ.0.0D0) GO TO 10
+      FC = DNU*DPI
+      FC = FC/DSIN(FC)
+      SMUR = CSHR/DNU
+      SMUI = CSHI/DNU
+   10 CONTINUE
+      A2 = 1.0D0 + DNU
+C-----------------------------------------------------------------------
+C     GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
+C-----------------------------------------------------------------------
+      T2 = DEXP(-DGAMLN(A2,IDUM))
+      T1 = 1.0D0/(T2*FC)
+      IF (DABS(DNU).GT.0.1D0) GO TO 40
+C-----------------------------------------------------------------------
+C     SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
+C-----------------------------------------------------------------------
+      AK = 1.0D0
+      S = CC(1)
+      DO 20 K=2,8
+        AK = AK*DNU2
+        TM = CC(K)*AK
+        S = S + TM
+        IF (DABS(TM).LT.TOL) GO TO 30
+   20 CONTINUE
+   30 G1 = -S
+      GO TO 50
+   40 CONTINUE
+      G1 = (T1-T2)/(DNU+DNU)
+   50 CONTINUE
+      G2 = (T1+T2)*0.5D0
+      FR = FC*(CCHR*G1+SMUR*G2)
+      FI = FC*(CCHI*G1+SMUI*G2)
+      CALL XZEXP(FMUR, FMUI, STR, STI)
+      PR = 0.5D0*STR/T2
+      PI = 0.5D0*STI/T2
+      CALL ZDIV(0.5D0, 0.0D0, STR, STI, PTR, PTI)
+      QR = PTR/T1
+      QI = PTI/T1
+      S1R = FR
+      S1I = FI
+      S2R = PR
+      S2I = PI
+      AK = 1.0D0
+      A1 = 1.0D0
+      CKR = CONER
+      CKI = CONEI
+      BK = 1.0D0 - DNU2
+      IF (INU.GT.0 .OR. N.GT.1) GO TO 80
+C-----------------------------------------------------------------------
+C     GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
+C-----------------------------------------------------------------------
+      IF (CAZ.LT.TOL) GO TO 70
+      CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
+      CZR = 0.25D0*CZR
+      CZI = 0.25D0*CZI
+      T1 = 0.25D0*CAZ*CAZ
+   60 CONTINUE
+      FR = (FR*AK+PR+QR)/BK
+      FI = (FI*AK+PI+QI)/BK
+      STR = 1.0D0/(AK-DNU)
+      PR = PR*STR
+      PI = PI*STR
+      STR = 1.0D0/(AK+DNU)
+      QR = QR*STR
+      QI = QI*STR
+      STR = CKR*CZR - CKI*CZI
+      RAK = 1.0D0/AK
+      CKI = (CKR*CZI+CKI*CZR)*RAK
+      CKR = STR*RAK
+      S1R = CKR*FR - CKI*FI + S1R
+      S1I = CKR*FI + CKI*FR + S1I
+      A1 = A1*T1*RAK
+      BK = BK + AK + AK + 1.0D0
+      AK = AK + 1.0D0
+      IF (A1.GT.TOL) GO TO 60
+   70 CONTINUE
+      YR(1) = S1R
+      YI(1) = S1I
+      IF (KODED.EQ.1) RETURN
+      CALL XZEXP(ZR, ZI, STR, STI)
+      CALL ZMLT(S1R, S1I, STR, STI, YR(1), YI(1))
+      RETURN
+C-----------------------------------------------------------------------
+C     GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
+C-----------------------------------------------------------------------
+   80 CONTINUE
+      IF (CAZ.LT.TOL) GO TO 100
+      CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
+      CZR = 0.25D0*CZR
+      CZI = 0.25D0*CZI
+      T1 = 0.25D0*CAZ*CAZ
+   90 CONTINUE
+      FR = (FR*AK+PR+QR)/BK
+      FI = (FI*AK+PI+QI)/BK
+      STR = 1.0D0/(AK-DNU)
+      PR = PR*STR
+      PI = PI*STR
+      STR = 1.0D0/(AK+DNU)
+      QR = QR*STR
+      QI = QI*STR
+      STR = CKR*CZR - CKI*CZI
+      RAK = 1.0D0/AK
+      CKI = (CKR*CZI+CKI*CZR)*RAK
+      CKR = STR*RAK
+      S1R = CKR*FR - CKI*FI + S1R
+      S1I = CKR*FI + CKI*FR + S1I
+      STR = PR - FR*AK
+      STI = PI - FI*AK
+      S2R = CKR*STR - CKI*STI + S2R
+      S2I = CKR*STI + CKI*STR + S2I
+      A1 = A1*T1*RAK
+      BK = BK + AK + AK + 1.0D0
+      AK = AK + 1.0D0
+      IF (A1.GT.TOL) GO TO 90
+  100 CONTINUE
+      KFLAG = 2
+      A1 = FNU + 1.0D0
+      AK = A1*DABS(SMUR)
+      IF (AK.GT.ALIM) KFLAG = 3
+      STR = CSSR(KFLAG)
+      P2R = S2R*STR
+      P2I = S2I*STR
+      CALL ZMLT(P2R, P2I, RZR, RZI, S2R, S2I)
+      S1R = S1R*STR
+      S1I = S1I*STR
+      IF (KODED.EQ.1) GO TO 210
+      CALL XZEXP(ZR, ZI, FR, FI)
+      CALL ZMLT(S1R, S1I, FR, FI, S1R, S1I)
+      CALL ZMLT(S2R, S2I, FR, FI, S2R, S2I)
+      GO TO 210
+C-----------------------------------------------------------------------
+C     IFLAG=0 MEANS NO UNDERFLOW OCCURRED
+C     IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
+C     KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
+C     RECURSION
+C-----------------------------------------------------------------------
+  110 CONTINUE
+      CALL XZSQRT(ZR, ZI, STR, STI)
+      CALL ZDIV(RTHPI, CZEROI, STR, STI, COEFR, COEFI)
+      KFLAG = 2
+      IF (KODED.EQ.2) GO TO 120
+      IF (ZR.GT.ALIM) GO TO 290
+C     BLANK LINE
+      STR = DEXP(-ZR)*CSSR(KFLAG)
+      STI = -STR*DSIN(ZI)
+      STR = STR*DCOS(ZI)
+      CALL ZMLT(COEFR, COEFI, STR, STI, COEFR, COEFI)
+  120 CONTINUE
+      IF (DABS(DNU).EQ.0.5D0) GO TO 300
+C-----------------------------------------------------------------------
+C     MILLER ALGORITHM FOR CABS(Z).GT.R1
+C-----------------------------------------------------------------------
+      AK = DCOS(DPI*DNU)
+      AK = DABS(AK)
+      IF (AK.EQ.CZEROR) GO TO 300
+      FHS = DABS(0.25D0-DNU2)
+      IF (FHS.EQ.CZEROR) GO TO 300
+C-----------------------------------------------------------------------
+C     COMPUTE R2=F(E). IF CABS(Z).GE.R2, USE FORWARD RECURRENCE TO
+C     DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
+C     12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
+C     TOL WHERE B IS THE BASE OF THE ARITHMETIC.
+C-----------------------------------------------------------------------
+      T1 = DBLE(FLOAT(I1MACH(14)-1))
+      T1 = T1*D1MACH(5)*3.321928094D0
+      T1 = DMAX1(T1,12.0D0)
+      T1 = DMIN1(T1,60.0D0)
+      T2 = TTH*T1 - 6.0D0
+      IF (ZR.NE.0.0D0) GO TO 130
+      T1 = HPI
+      GO TO 140
+  130 CONTINUE
+      T1 = DATAN(ZI/ZR)
+      T1 = DABS(T1)
+  140 CONTINUE
+      IF (T2.GT.CAZ) GO TO 170
+C-----------------------------------------------------------------------
+C     FORWARD RECURRENCE LOOP WHEN CABS(Z).GE.R2
+C-----------------------------------------------------------------------
+      ETEST = AK/(DPI*CAZ*TOL)
+      FK = CONER
+      IF (ETEST.LT.CONER) GO TO 180
+      FKS = CTWOR
+      CKR = CAZ + CAZ + CTWOR
+      P1R = CZEROR
+      P2R = CONER
+      DO 150 I=1,KMAX
+        AK = FHS/FKS
+        CBR = CKR/(FK+CONER)
+        PTR = P2R
+        P2R = CBR*P2R - P1R*AK
+        P1R = PTR
+        CKR = CKR + CTWOR
+        FKS = FKS + FK + FK + CTWOR
+        FHS = FHS + FK + FK
+        FK = FK + CONER
+        STR = DABS(P2R)*FK
+        IF (ETEST.LT.STR) GO TO 160
+  150 CONTINUE
+      GO TO 310
+  160 CONTINUE
+      FK = FK + SPI*T1*DSQRT(T2/CAZ)
+      FHS = DABS(0.25D0-DNU2)
+      GO TO 180
+  170 CONTINUE
+C-----------------------------------------------------------------------
+C     COMPUTE BACKWARD INDEX K FOR CABS(Z).LT.R2
+C-----------------------------------------------------------------------
+      A2 = DSQRT(CAZ)
+      AK = FPI*AK/(TOL*DSQRT(A2))
+      AA = 3.0D0*T1/(1.0D0+CAZ)
+      BB = 14.7D0*T1/(28.0D0+CAZ)
+      AK = (DLOG(AK)+CAZ*DCOS(AA)/(1.0D0+0.008D0*CAZ))/DCOS(BB)
+      FK = 0.12125D0*AK*AK/CAZ + 1.5D0
+  180 CONTINUE
+C-----------------------------------------------------------------------
+C     BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
+C-----------------------------------------------------------------------
+      K = INT(SNGL(FK))
+      FK = DBLE(FLOAT(K))
+      FKS = FK*FK
+      P1R = CZEROR
+      P1I = CZEROI
+      P2R = TOL
+      P2I = CZEROI
+      CSR = P2R
+      CSI = P2I
+      DO 190 I=1,K
+        A1 = FKS - FK
+        AK = (FKS+FK)/(A1+FHS)
+        RAK = 2.0D0/(FK+CONER)
+        CBR = (FK+ZR)*RAK
+        CBI = ZI*RAK
+        PTR = P2R
+        PTI = P2I
+        P2R = (PTR*CBR-PTI*CBI-P1R)*AK
+        P2I = (PTI*CBR+PTR*CBI-P1I)*AK
+        P1R = PTR
+        P1I = PTI
+        CSR = CSR + P2R
+        CSI = CSI + P2I
+        FKS = A1 - FK + CONER
+        FK = FK - CONER
+  190 CONTINUE
+C-----------------------------------------------------------------------
+C     COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
+C     SCALING
+C-----------------------------------------------------------------------
+      TM = XZABS(CSR,CSI)
+      PTR = 1.0D0/TM
+      S1R = P2R*PTR
+      S1I = P2I*PTR
+      CSR = CSR*PTR
+      CSI = -CSI*PTR
+      CALL ZMLT(COEFR, COEFI, S1R, S1I, STR, STI)
+      CALL ZMLT(STR, STI, CSR, CSI, S1R, S1I)
+      IF (INU.GT.0 .OR. N.GT.1) GO TO 200
+      ZDR = ZR
+      ZDI = ZI
+      IF(IFLAG.EQ.1) GO TO 270
+      GO TO 240
+  200 CONTINUE
+C-----------------------------------------------------------------------
+C     COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
+C-----------------------------------------------------------------------
+      TM = XZABS(P2R,P2I)
+      PTR = 1.0D0/TM
+      P1R = P1R*PTR
+      P1I = P1I*PTR
+      P2R = P2R*PTR
+      P2I = -P2I*PTR
+      CALL ZMLT(P1R, P1I, P2R, P2I, PTR, PTI)
+      STR = DNU + 0.5D0 - PTR
+      STI = -PTI
+      CALL ZDIV(STR, STI, ZR, ZI, STR, STI)
+      STR = STR + 1.0D0
+      CALL ZMLT(STR, STI, S1R, S1I, S2R, S2I)
+C-----------------------------------------------------------------------
+C     FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
+C     SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
+C-----------------------------------------------------------------------
+  210 CONTINUE
+      STR = DNU + 1.0D0
+      CKR = STR*RZR
+      CKI = STR*RZI
+      IF (N.EQ.1) INU = INU - 1
+      IF (INU.GT.0) GO TO 220
+      IF (N.GT.1) GO TO 215
+      S1R = S2R
+      S1I = S2I
+  215 CONTINUE
+      ZDR = ZR
+      ZDI = ZI
+      IF(IFLAG.EQ.1) GO TO 270
+      GO TO 240
+  220 CONTINUE
+      INUB = 1
+      IF(IFLAG.EQ.1) GO TO 261
+  225 CONTINUE
+      P1R = CSRR(KFLAG)
+      ASCLE = BRY(KFLAG)
+      DO 230 I=INUB,INU
+        STR = S2R
+        STI = S2I
+        S2R = CKR*STR - CKI*STI + S1R
+        S2I = CKR*STI + CKI*STR + S1I
+        S1R = STR
+        S1I = STI
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        IF (KFLAG.GE.3) GO TO 230
+        P2R = S2R*P1R
+        P2I = S2I*P1R
+        STR = DABS(P2R)
+        STI = DABS(P2I)
+        P2M = DMAX1(STR,STI)
+        IF (P2M.LE.ASCLE) GO TO 230
+        KFLAG = KFLAG + 1
+        ASCLE = BRY(KFLAG)
+        S1R = S1R*P1R
+        S1I = S1I*P1R
+        S2R = P2R
+        S2I = P2I
+        STR = CSSR(KFLAG)
+        S1R = S1R*STR
+        S1I = S1I*STR
+        S2R = S2R*STR
+        S2I = S2I*STR
+        P1R = CSRR(KFLAG)
+  230 CONTINUE
+      IF (N.NE.1) GO TO 240
+      S1R = S2R
+      S1I = S2I
+  240 CONTINUE
+      STR = CSRR(KFLAG)
+      YR(1) = S1R*STR
+      YI(1) = S1I*STR
+      IF (N.EQ.1) RETURN
+      YR(2) = S2R*STR
+      YI(2) = S2I*STR
+      IF (N.EQ.2) RETURN
+      KK = 2
+  250 CONTINUE
+      KK = KK + 1
+      IF (KK.GT.N) RETURN
+      P1R = CSRR(KFLAG)
+      ASCLE = BRY(KFLAG)
+      DO 260 I=KK,N
+        P2R = S2R
+        P2I = S2I
+        S2R = CKR*P2R - CKI*P2I + S1R
+        S2I = CKI*P2R + CKR*P2I + S1I
+        S1R = P2R
+        S1I = P2I
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        P2R = S2R*P1R
+        P2I = S2I*P1R
+        YR(I) = P2R
+        YI(I) = P2I
+        IF (KFLAG.GE.3) GO TO 260
+        STR = DABS(P2R)
+        STI = DABS(P2I)
+        P2M = DMAX1(STR,STI)
+        IF (P2M.LE.ASCLE) GO TO 260
+        KFLAG = KFLAG + 1
+        ASCLE = BRY(KFLAG)
+        S1R = S1R*P1R
+        S1I = S1I*P1R
+        S2R = P2R
+        S2I = P2I
+        STR = CSSR(KFLAG)
+        S1R = S1R*STR
+        S1I = S1I*STR
+        S2R = S2R*STR
+        S2I = S2I*STR
+        P1R = CSRR(KFLAG)
+  260 CONTINUE
+      RETURN
+C-----------------------------------------------------------------------
+C     IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
+C-----------------------------------------------------------------------
+  261 CONTINUE
+      HELIM = 0.5D0*ELIM
+      ELM = DEXP(-ELIM)
+      CELMR = ELM
+      ASCLE = BRY(1)
+      ZDR = ZR
+      ZDI = ZI
+      IC = -1
+      J = 2
+      DO 262 I=1,INU
+        STR = S2R
+        STI = S2I
+        S2R = STR*CKR-STI*CKI+S1R
+        S2I = STI*CKR+STR*CKI+S1I
+        S1R = STR
+        S1I = STI
+        CKR = CKR+RZR
+        CKI = CKI+RZI
+        AS = XZABS(S2R,S2I)
+        ALAS = DLOG(AS)
+        P2R = -ZDR+ALAS
+        IF(P2R.LT.(-ELIM)) GO TO 263
+        CALL XZLOG(S2R,S2I,STR,STI,IDUM)
+        P2R = -ZDR+STR
+        P2I = -ZDI+STI
+        P2M = DEXP(P2R)/TOL
+        P1R = P2M*DCOS(P2I)
+        P1I = P2M*DSIN(P2I)
+        CALL ZUCHK(P1R,P1I,NW,ASCLE,TOL)
+        IF(NW.NE.0) GO TO 263
+        J = 3 - J
+        CYR(J) = P1R
+        CYI(J) = P1I
+        IF(IC.EQ.(I-1)) GO TO 264
+        IC = I
+        GO TO 262
+  263   CONTINUE
+        IF(ALAS.LT.HELIM) GO TO 262
+        ZDR = ZDR-ELIM
+        S1R = S1R*CELMR
+        S1I = S1I*CELMR
+        S2R = S2R*CELMR
+        S2I = S2I*CELMR
+  262 CONTINUE
+      IF(N.NE.1) GO TO 270
+      S1R = S2R
+      S1I = S2I
+      GO TO 270
+  264 CONTINUE
+      KFLAG = 1
+      INUB = I+1
+      S2R = CYR(J)
+      S2I = CYI(J)
+      J = 3 - J
+      S1R = CYR(J)
+      S1I = CYI(J)
+      IF(INUB.LE.INU) GO TO 225
+      IF(N.NE.1) GO TO 240
+      S1R = S2R
+      S1I = S2I
+      GO TO 240
+  270 CONTINUE
+      YR(1) = S1R
+      YI(1) = S1I
+      IF(N.EQ.1) GO TO 280
+      YR(2) = S2R
+      YI(2) = S2I
+  280 CONTINUE
+      ASCLE = BRY(1)
+      CALL ZKSCL(ZDR,ZDI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
+      INU = N - NZ
+      IF (INU.LE.0) RETURN
+      KK = NZ + 1
+      S1R = YR(KK)
+      S1I = YI(KK)
+      YR(KK) = S1R*CSRR(1)
+      YI(KK) = S1I*CSRR(1)
+      IF (INU.EQ.1) RETURN
+      KK = NZ + 2
+      S2R = YR(KK)
+      S2I = YI(KK)
+      YR(KK) = S2R*CSRR(1)
+      YI(KK) = S2I*CSRR(1)
+      IF (INU.EQ.2) RETURN
+      T2 = FNU + DBLE(FLOAT(KK-1))
+      CKR = T2*RZR
+      CKI = T2*RZI
+      KFLAG = 1
+      GO TO 250
+  290 CONTINUE
+C-----------------------------------------------------------------------
+C     SCALE BY DEXP(Z), IFLAG = 1 CASES
+C-----------------------------------------------------------------------
+      KODED = 2
+      IFLAG = 1
+      KFLAG = 2
+      GO TO 120
+C-----------------------------------------------------------------------
+C     FNU=HALF ODD INTEGER CASE, DNU=-0.5
+C-----------------------------------------------------------------------
+  300 CONTINUE
+      S1R = COEFR
+      S1I = COEFI
+      S2R = COEFR
+      S2I = COEFI
+      GO TO 210
+C
+C
+  310 CONTINUE
+      NZ=-2
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbuni.f
@@ -0,0 +1,174 @@
+      SUBROUTINE ZBUNI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NUI, NLAST,
+     * FNUL, TOL, ELIM, ALIM)
+C***BEGIN PROLOGUE  ZBUNI
+C***REFER TO  ZBESI,ZBESK
+C
+C     ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT.
+C     FNUL AND FNU+N-1.LT.FNUL. THE ORDER IS INCREASED FROM
+C     FNU+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING
+C     ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z)
+C     ON IFORM=1 AND THE EXPANSION FOR J(FNU,Z) ON IFORM=2
+C
+C***ROUTINES CALLED  ZUNI1,ZUNI2,XZABS,D1MACH
+C***END PROLOGUE  ZBUNI
+C     COMPLEX CSCL,CSCR,CY,RZ,ST,S1,S2,Y,Z
+      DOUBLE PRECISION ALIM, AX, AY, CSCLR, CSCRR, CYI, CYR, DFNU,
+     * ELIM, FNU, FNUI, FNUL, GNU, RAZ, RZI, RZR, STI, STR, S1I, S1R,
+     * S2I, S2R, TOL, YI, YR, ZI, ZR, XZABS, ASCLE, BRY, C1R, C1I, C1M,
+     * D1MACH
+      INTEGER I, IFLAG, IFORM, K, KODE, N, NL, NLAST, NUI, NW, NZ
+      DIMENSION YR(N), YI(N), CYR(2), CYI(2), BRY(3)
+      NZ = 0
+      AX = DABS(ZR)*1.7321D0
+      AY = DABS(ZI)
+      IFORM = 1
+      IF (AY.GT.AX) IFORM = 2
+      IF (NUI.EQ.0) GO TO 60
+      FNUI = DBLE(FLOAT(NUI))
+      DFNU = FNU + DBLE(FLOAT(N-1))
+      GNU = DFNU + FNUI
+      IF (IFORM.EQ.2) GO TO 10
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
+C     -PI/3.LE.ARG(Z).LE.PI/3
+C-----------------------------------------------------------------------
+      CALL ZUNI1(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL,
+     * ELIM, ALIM)
+      GO TO 20
+   10 CONTINUE
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
+C     APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
+C     AND HPI=PI/2
+C-----------------------------------------------------------------------
+      CALL ZUNI2(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL,
+     * ELIM, ALIM)
+   20 CONTINUE
+      IF (NW.LT.0) GO TO 50
+      IF (NW.NE.0) GO TO 90
+      STR = XZABS(CYR(1),CYI(1))
+C----------------------------------------------------------------------
+C     SCALE BACKWARD RECURRENCE, BRY(3) IS DEFINED BUT NEVER USED
+C----------------------------------------------------------------------
+      BRY(1)=1.0D+3*D1MACH(1)/TOL
+      BRY(2) = 1.0D0/BRY(1)
+      BRY(3) = BRY(2)
+      IFLAG = 2
+      ASCLE = BRY(2)
+      CSCLR = 1.0D0
+      IF (STR.GT.BRY(1)) GO TO 21
+      IFLAG = 1
+      ASCLE = BRY(1)
+      CSCLR = 1.0D0/TOL
+      GO TO 25
+   21 CONTINUE
+      IF (STR.LT.BRY(2)) GO TO 25
+      IFLAG = 3
+      ASCLE=BRY(3)
+      CSCLR = TOL
+   25 CONTINUE
+      CSCRR = 1.0D0/CSCLR
+      S1R = CYR(2)*CSCLR
+      S1I = CYI(2)*CSCLR
+      S2R = CYR(1)*CSCLR
+      S2I = CYI(1)*CSCLR
+      RAZ = 1.0D0/XZABS(ZR,ZI)
+      STR = ZR*RAZ
+      STI = -ZI*RAZ
+      RZR = (STR+STR)*RAZ
+      RZI = (STI+STI)*RAZ
+      DO 30 I=1,NUI
+        STR = S2R
+        STI = S2I
+        S2R = (DFNU+FNUI)*(RZR*STR-RZI*STI) + S1R
+        S2I = (DFNU+FNUI)*(RZR*STI+RZI*STR) + S1I
+        S1R = STR
+        S1I = STI
+        FNUI = FNUI - 1.0D0
+        IF (IFLAG.GE.3) GO TO 30
+        STR = S2R*CSCRR
+        STI = S2I*CSCRR
+        C1R = DABS(STR)
+        C1I = DABS(STI)
+        C1M = DMAX1(C1R,C1I)
+        IF (C1M.LE.ASCLE) GO TO 30
+        IFLAG = IFLAG+1
+        ASCLE = BRY(IFLAG)
+        S1R = S1R*CSCRR
+        S1I = S1I*CSCRR
+        S2R = STR
+        S2I = STI
+        CSCLR = CSCLR*TOL
+        CSCRR = 1.0D0/CSCLR
+        S1R = S1R*CSCLR
+        S1I = S1I*CSCLR
+        S2R = S2R*CSCLR
+        S2I = S2I*CSCLR
+   30 CONTINUE
+      YR(N) = S2R*CSCRR
+      YI(N) = S2I*CSCRR
+      IF (N.EQ.1) RETURN
+      NL = N - 1
+      FNUI = DBLE(FLOAT(NL))
+      K = NL
+      DO 40 I=1,NL
+        STR = S2R
+        STI = S2I
+        S2R = (FNU+FNUI)*(RZR*STR-RZI*STI) + S1R
+        S2I = (FNU+FNUI)*(RZR*STI+RZI*STR) + S1I
+        S1R = STR
+        S1I = STI
+        STR = S2R*CSCRR
+        STI = S2I*CSCRR
+        YR(K) = STR
+        YI(K) = STI
+        FNUI = FNUI - 1.0D0
+        K = K - 1
+        IF (IFLAG.GE.3) GO TO 40
+        C1R = DABS(STR)
+        C1I = DABS(STI)
+        C1M = DMAX1(C1R,C1I)
+        IF (C1M.LE.ASCLE) GO TO 40
+        IFLAG = IFLAG+1
+        ASCLE = BRY(IFLAG)
+        S1R = S1R*CSCRR
+        S1I = S1I*CSCRR
+        S2R = STR
+        S2I = STI
+        CSCLR = CSCLR*TOL
+        CSCRR = 1.0D0/CSCLR
+        S1R = S1R*CSCLR
+        S1I = S1I*CSCLR
+        S2R = S2R*CSCLR
+        S2I = S2I*CSCLR
+   40 CONTINUE
+      RETURN
+   50 CONTINUE
+      NZ = -1
+      IF(NW.EQ.(-2)) NZ=-2
+      RETURN
+   60 CONTINUE
+      IF (IFORM.EQ.2) GO TO 70
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
+C     -PI/3.LE.ARG(Z).LE.PI/3
+C-----------------------------------------------------------------------
+      CALL ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL,
+     * ELIM, ALIM)
+      GO TO 80
+   70 CONTINUE
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
+C     APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
+C     AND HPI=PI/2
+C-----------------------------------------------------------------------
+      CALL ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL,
+     * ELIM, ALIM)
+   80 CONTINUE
+      IF (NW.LT.0) GO TO 50
+      NZ = NW
+      RETURN
+   90 CONTINUE
+      NLAST = N
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zbunk.f
@@ -0,0 +1,35 @@
+      SUBROUTINE ZBUNK(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM,
+     * ALIM)
+C***BEGIN PROLOGUE  ZBUNK
+C***REFER TO  ZBESK,ZBESH
+C
+C     ZBUNK COMPUTES THE K BESSEL FUNCTION FOR FNU.GT.FNUL.
+C     ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR K(FNU,Z)
+C     IN ZUNK1 AND THE EXPANSION FOR H(2,FNU,Z) IN ZUNK2
+C
+C***ROUTINES CALLED  ZUNK1,ZUNK2
+C***END PROLOGUE  ZBUNK
+C     COMPLEX Y,Z
+      DOUBLE PRECISION ALIM, AX, AY, ELIM, FNU, TOL, YI, YR, ZI, ZR
+      INTEGER KODE, MR, N, NZ
+      DIMENSION YR(N), YI(N)
+      NZ = 0
+      AX = DABS(ZR)*1.7321D0
+      AY = DABS(ZI)
+      IF (AY.GT.AX) GO TO 10
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR K(FNU,Z) FOR LARGE FNU APPLIED IN
+C     -PI/3.LE.ARG(Z).LE.PI/3
+C-----------------------------------------------------------------------
+      CALL ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
+      GO TO 20
+   10 CONTINUE
+C-----------------------------------------------------------------------
+C     ASYMPTOTIC EXPANSION FOR H(2,FNU,Z*EXP(M*HPI)) FOR LARGE FNU
+C     APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
+C     AND HPI=PI/2
+C-----------------------------------------------------------------------
+      CALL ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
+   20 CONTINUE
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zdiv.f
@@ -0,0 +1,19 @@
+      SUBROUTINE ZDIV(AR, AI, BR, BI, CR, CI)
+C***BEGIN PROLOGUE  ZDIV
+C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
+C
+C     DOUBLE PRECISION COMPLEX DIVIDE C=A/B.
+C
+C***ROUTINES CALLED  XZABS
+C***END PROLOGUE  ZDIV
+      DOUBLE PRECISION AR, AI, BR, BI, CR, CI, BM, CA, CB, CC, CD
+      DOUBLE PRECISION XZABS
+      BM = 1.0D0/XZABS(BR,BI)
+      CC = BR*BM
+      CD = BI*BM
+      CA = (AR*CC+AI*CD)*BM
+      CB = (AI*CC-AR*CD)*BM
+      CR = CA
+      CI = CB
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zkscl.f
@@ -0,0 +1,121 @@
+      SUBROUTINE ZKSCL(ZRR,ZRI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
+C***BEGIN PROLOGUE  ZKSCL
+C***REFER TO  ZBESK
+C
+C     SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
+C     ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
+C     RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
+C
+C***ROUTINES CALLED  ZUCHK,XZABS,XZLOG
+C***END PROLOGUE  ZKSCL
+C     COMPLEX CK,CS,CY,CZERO,RZ,S1,S2,Y,ZR,ZD,CELM
+      DOUBLE PRECISION ACS, AS, ASCLE, CKI, CKR, CSI, CSR, CYI,
+     * CYR, ELIM, FN, FNU, RZI, RZR, STR, S1I, S1R, S2I,
+     * S2R, TOL, YI, YR, ZEROI, ZEROR, ZRI, ZRR, XZABS,
+     * ZDR, ZDI, CELMR, ELM, HELIM, ALAS
+      INTEGER I, IC, IDUM, KK, N, NN, NW, NZ
+      DIMENSION YR(N), YI(N), CYR(2), CYI(2)
+      DATA ZEROR,ZEROI / 0.0D0 , 0.0D0 /
+C
+      NZ = 0
+      IC = 0
+      NN = MIN0(2,N)
+      DO 10 I=1,NN
+        S1R = YR(I)
+        S1I = YI(I)
+        CYR(I) = S1R
+        CYI(I) = S1I
+        AS = XZABS(S1R,S1I)
+        ACS = -ZRR + DLOG(AS)
+        NZ = NZ + 1
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+        IF (ACS.LT.(-ELIM)) GO TO 10
+        CALL XZLOG(S1R, S1I, CSR, CSI, IDUM)
+        CSR = CSR - ZRR
+        CSI = CSI - ZRI
+        STR = DEXP(CSR)/TOL
+        CSR = STR*DCOS(CSI)
+        CSI = STR*DSIN(CSI)
+        CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
+        IF (NW.NE.0) GO TO 10
+        YR(I) = CSR
+        YI(I) = CSI
+        IC = I
+        NZ = NZ - 1
+   10 CONTINUE
+      IF (N.EQ.1) RETURN
+      IF (IC.GT.1) GO TO 20
+      YR(1) = ZEROR
+      YI(1) = ZEROI
+      NZ = 2
+   20 CONTINUE
+      IF (N.EQ.2) RETURN
+      IF (NZ.EQ.0) RETURN
+      FN = FNU + 1.0D0
+      CKR = FN*RZR
+      CKI = FN*RZI
+      S1R = CYR(1)
+      S1I = CYI(1)
+      S2R = CYR(2)
+      S2I = CYI(2)
+      HELIM = 0.5D0*ELIM
+      ELM = DEXP(-ELIM)
+      CELMR = ELM
+      ZDR = ZRR
+      ZDI = ZRI
+C
+C     FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
+C     S2 GETS LARGER THAN EXP(ELIM/2)
+C
+      DO 30 I=3,N
+        KK = I
+        CSR = S2R
+        CSI = S2I
+        S2R = CKR*CSR - CKI*CSI + S1R
+        S2I = CKI*CSR + CKR*CSI + S1I
+        S1R = CSR
+        S1I = CSI
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        AS = XZABS(S2R,S2I)
+        ALAS = DLOG(AS)
+        ACS = -ZDR + ALAS
+        NZ = NZ + 1
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+        IF (ACS.LT.(-ELIM)) GO TO 25
+        CALL XZLOG(S2R, S2I, CSR, CSI, IDUM)
+        CSR = CSR - ZDR
+        CSI = CSI - ZDI
+        STR = DEXP(CSR)/TOL
+        CSR = STR*DCOS(CSI)
+        CSI = STR*DSIN(CSI)
+        CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
+        IF (NW.NE.0) GO TO 25
+        YR(I) = CSR
+        YI(I) = CSI
+        NZ = NZ - 1
+        IF (IC.EQ.KK-1) GO TO 40
+        IC = KK
+        GO TO 30
+   25   CONTINUE
+        IF(ALAS.LT.HELIM) GO TO 30
+        ZDR = ZDR - ELIM
+        S1R = S1R*CELMR
+        S1I = S1I*CELMR
+        S2R = S2R*CELMR
+        S2I = S2I*CELMR
+   30 CONTINUE
+      NZ = N
+      IF(IC.EQ.N) NZ=N-1
+      GO TO 45
+   40 CONTINUE
+      NZ = KK - 2
+   45 CONTINUE
+      DO 50 I=1,NZ
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+   50 CONTINUE
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zmlri.f
@@ -0,0 +1,204 @@
+      SUBROUTINE ZMLRI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL)
+C***BEGIN PROLOGUE  ZMLRI
+C***REFER TO  ZBESI,ZBESK
+C
+C     ZMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY THE
+C     MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
+C
+C***ROUTINES CALLED  DGAMLN,D1MACH,XZABS,XZEXP,XZLOG,ZMLT
+C***END PROLOGUE  ZMLRI
+C     COMPLEX CK,CNORM,CONE,CTWO,CZERO,PT,P1,P2,RZ,SUM,Y,Z
+      DOUBLE PRECISION ACK, AK, AP, AT, AZ, BK, CKI, CKR, CNORMI,
+     * CNORMR, CONEI, CONER, FKAP, FKK, FLAM, FNF, FNU, PTI, PTR, P1I,
+     * P1R, P2I, P2R, RAZ, RHO, RHO2, RZI, RZR, SCLE, STI, STR, SUMI,
+     * SUMR, TFNF, TOL, TST, YI, YR, ZEROI, ZEROR, ZI, ZR, DGAMLN,
+     * D1MACH, XZABS
+      INTEGER I, IAZ, IDUM, IFNU, INU, ITIME, K, KK, KM, KODE, M, N, NZ
+      DIMENSION YR(N), YI(N)
+      DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
+      SCLE = D1MACH(1)/TOL
+      NZ=0
+      AZ = XZABS(ZR,ZI)
+      IAZ = INT(SNGL(AZ))
+      IFNU = INT(SNGL(FNU))
+      INU = IFNU + N - 1
+      AT = DBLE(FLOAT(IAZ)) + 1.0D0
+      RAZ = 1.0D0/AZ
+      STR = ZR*RAZ
+      STI = -ZI*RAZ
+      CKR = STR*AT*RAZ
+      CKI = STI*AT*RAZ
+      RZR = (STR+STR)*RAZ
+      RZI = (STI+STI)*RAZ
+      P1R = ZEROR
+      P1I = ZEROI
+      P2R = CONER
+      P2I = CONEI
+      ACK = (AT+1.0D0)*RAZ
+      RHO = ACK + DSQRT(ACK*ACK-1.0D0)
+      RHO2 = RHO*RHO
+      TST = (RHO2+RHO2)/((RHO2-1.0D0)*(RHO-1.0D0))
+      TST = TST/TOL
+C-----------------------------------------------------------------------
+C     COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
+C-----------------------------------------------------------------------
+      AK = AT
+      DO 10 I=1,80
+        PTR = P2R
+        PTI = P2I
+        P2R = P1R - (CKR*PTR-CKI*PTI)
+        P2I = P1I - (CKI*PTR+CKR*PTI)
+        P1R = PTR
+        P1I = PTI
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        AP = XZABS(P2R,P2I)
+        IF (AP.GT.TST*AK*AK) GO TO 20
+        AK = AK + 1.0D0
+   10 CONTINUE
+      GO TO 110
+   20 CONTINUE
+      I = I + 1
+      K = 0
+      IF (INU.LT.IAZ) GO TO 40
+C-----------------------------------------------------------------------
+C     COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
+C-----------------------------------------------------------------------
+      P1R = ZEROR
+      P1I = ZEROI
+      P2R = CONER
+      P2I = CONEI
+      AT = DBLE(FLOAT(INU)) + 1.0D0
+      STR = ZR*RAZ
+      STI = -ZI*RAZ
+      CKR = STR*AT*RAZ
+      CKI = STI*AT*RAZ
+      ACK = AT*RAZ
+      TST = DSQRT(ACK/TOL)
+      ITIME = 1
+      DO 30 K=1,80
+        PTR = P2R
+        PTI = P2I
+        P2R = P1R - (CKR*PTR-CKI*PTI)
+        P2I = P1I - (CKR*PTI+CKI*PTR)
+        P1R = PTR
+        P1I = PTI
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        AP = XZABS(P2R,P2I)
+        IF (AP.LT.TST) GO TO 30
+        IF (ITIME.EQ.2) GO TO 40
+        ACK = XZABS(CKR,CKI)
+        FLAM = ACK + DSQRT(ACK*ACK-1.0D0)
+        FKAP = AP/XZABS(P1R,P1I)
+        RHO = DMIN1(FLAM,FKAP)
+        TST = TST*DSQRT(RHO/(RHO*RHO-1.0D0))
+        ITIME = 2
+   30 CONTINUE
+      GO TO 110
+   40 CONTINUE
+C-----------------------------------------------------------------------
+C     BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
+C-----------------------------------------------------------------------
+      K = K + 1
+      KK = MAX0(I+IAZ,K+INU)
+      FKK = DBLE(FLOAT(KK))
+      P1R = ZEROR
+      P1I = ZEROI
+C-----------------------------------------------------------------------
+C     SCALE P2 AND SUM BY SCLE
+C-----------------------------------------------------------------------
+      P2R = SCLE
+      P2I = ZEROI
+      FNF = FNU - DBLE(FLOAT(IFNU))
+      TFNF = FNF + FNF
+      BK = DGAMLN(FKK+TFNF+1.0D0,IDUM) - DGAMLN(FKK+1.0D0,IDUM) -
+     * DGAMLN(TFNF+1.0D0,IDUM)
+      BK = DEXP(BK)
+      SUMR = ZEROR
+      SUMI = ZEROI
+      KM = KK - INU
+      DO 50 I=1,KM
+        PTR = P2R
+        PTI = P2I
+        P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
+        P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
+        P1R = PTR
+        P1I = PTI
+        AK = 1.0D0 - TFNF/(FKK+TFNF)
+        ACK = BK*AK
+        SUMR = SUMR + (ACK+BK)*P1R
+        SUMI = SUMI + (ACK+BK)*P1I
+        BK = ACK
+        FKK = FKK - 1.0D0
+   50 CONTINUE
+      YR(N) = P2R
+      YI(N) = P2I
+      IF (N.EQ.1) GO TO 70
+      DO 60 I=2,N
+        PTR = P2R
+        PTI = P2I
+        P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
+        P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
+        P1R = PTR
+        P1I = PTI
+        AK = 1.0D0 - TFNF/(FKK+TFNF)
+        ACK = BK*AK
+        SUMR = SUMR + (ACK+BK)*P1R
+        SUMI = SUMI + (ACK+BK)*P1I
+        BK = ACK
+        FKK = FKK - 1.0D0
+        M = N - I + 1
+        YR(M) = P2R
+        YI(M) = P2I
+   60 CONTINUE
+   70 CONTINUE
+      IF (IFNU.LE.0) GO TO 90
+      DO 80 I=1,IFNU
+        PTR = P2R
+        PTI = P2I
+        P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
+        P2I = P1I + (FKK+FNF)*(RZR*PTI+RZI*PTR)
+        P1R = PTR
+        P1I = PTI
+        AK = 1.0D0 - TFNF/(FKK+TFNF)
+        ACK = BK*AK
+        SUMR = SUMR + (ACK+BK)*P1R
+        SUMI = SUMI + (ACK+BK)*P1I
+        BK = ACK
+        FKK = FKK - 1.0D0
+   80 CONTINUE
+   90 CONTINUE
+      PTR = ZR
+      PTI = ZI
+      IF (KODE.EQ.2) PTR = ZEROR
+      CALL XZLOG(RZR, RZI, STR, STI, IDUM)
+      P1R = -FNF*STR + PTR
+      P1I = -FNF*STI + PTI
+      AP = DGAMLN(1.0D0+FNF,IDUM)
+      PTR = P1R - AP
+      PTI = P1I
+C-----------------------------------------------------------------------
+C     THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
+C     IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
+C-----------------------------------------------------------------------
+      P2R = P2R + SUMR
+      P2I = P2I + SUMI
+      AP = XZABS(P2R,P2I)
+      P1R = 1.0D0/AP
+      CALL XZEXP(PTR, PTI, STR, STI)
+      CKR = STR*P1R
+      CKI = STI*P1R
+      PTR = P2R*P1R
+      PTI = -P2I*P1R
+      CALL ZMLT(CKR, CKI, PTR, PTI, CNORMR, CNORMI)
+      DO 100 I=1,N
+        STR = YR(I)*CNORMR - YI(I)*CNORMI
+        YI(I) = YR(I)*CNORMI + YI(I)*CNORMR
+        YR(I) = STR
+  100 CONTINUE
+      RETURN
+  110 CONTINUE
+      NZ=-2
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zmlt.f
@@ -0,0 +1,15 @@
+      SUBROUTINE ZMLT(AR, AI, BR, BI, CR, CI)
+C***BEGIN PROLOGUE  ZMLT
+C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
+C
+C     DOUBLE PRECISION COMPLEX MULTIPLY, C=A*B.
+C
+C***ROUTINES CALLED  (NONE)
+C***END PROLOGUE  ZMLT
+      DOUBLE PRECISION AR, AI, BR, BI, CR, CI, CA, CB
+      CA = AR*BR - AI*BI
+      CB = AR*BI + AI*BR
+      CR = CA
+      CI = CB
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zrati.f
@@ -0,0 +1,132 @@
+      SUBROUTINE ZRATI(ZR, ZI, FNU, N, CYR, CYI, TOL)
+C***BEGIN PROLOGUE  ZRATI
+C***REFER TO  ZBESI,ZBESK,ZBESH
+C
+C     ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD
+C     RECURRENCE.  THE STARTING INDEX IS DETERMINED BY FORWARD
+C     RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B,
+C     MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973,
+C     BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER,
+C     BY D. J. SOOKNE.
+C
+C***ROUTINES CALLED  XZABS,ZDIV
+C***END PROLOGUE  ZRATI
+C     COMPLEX Z,CY(1),CONE,CZERO,P1,P2,T1,RZ,PT,CDFNU
+      DOUBLE PRECISION AK, AMAGZ, AP1, AP2, ARG, AZ, CDFNUI, CDFNUR,
+     * CONEI, CONER, CYI, CYR, CZEROI, CZEROR, DFNU, FDNU, FLAM, FNU,
+     * FNUP, PTI, PTR, P1I, P1R, P2I, P2R, RAK, RAP1, RHO, RT2, RZI,
+     * RZR, TEST, TEST1, TOL, TTI, TTR, T1I, T1R, ZI, ZR, XZABS
+      INTEGER I, ID, IDNU, INU, ITIME, K, KK, MAGZ, N
+      DIMENSION CYR(N), CYI(N)
+      DATA CZEROR,CZEROI,CONER,CONEI,RT2/
+     1 0.0D0, 0.0D0, 1.0D0, 0.0D0, 1.41421356237309505D0 /
+      AZ = XZABS(ZR,ZI)
+      INU = INT(SNGL(FNU))
+      IDNU = INU + N - 1
+      MAGZ = INT(SNGL(AZ))
+      AMAGZ = DBLE(FLOAT(MAGZ+1))
+      FDNU = DBLE(FLOAT(IDNU))
+      FNUP = DMAX1(AMAGZ,FDNU)
+      ID = IDNU - MAGZ - 1
+      ITIME = 1
+      K = 1
+      PTR = 1.0D0/AZ
+      RZR = PTR*(ZR+ZR)*PTR
+      RZI = -PTR*(ZI+ZI)*PTR
+      T1R = RZR*FNUP
+      T1I = RZI*FNUP
+      P2R = -T1R
+      P2I = -T1I
+      P1R = CONER
+      P1I = CONEI
+      T1R = T1R + RZR
+      T1I = T1I + RZI
+      IF (ID.GT.0) ID = 0
+      AP2 = XZABS(P2R,P2I)
+      AP1 = XZABS(P1R,P1I)
+C-----------------------------------------------------------------------
+C     THE OVERFLOW TEST ON K(FNU+I-1,Z) BEFORE THE CALL TO CBKNU
+C     GUARANTEES THAT P2 IS ON SCALE. SCALE TEST1 AND ALL SUBSEQUENT
+C     P2 VALUES BY AP1 TO ENSURE THAT AN OVERFLOW DOES NOT OCCUR
+C     PREMATURELY.
+C-----------------------------------------------------------------------
+      ARG = (AP2+AP2)/(AP1*TOL)
+      TEST1 = DSQRT(ARG)
+      TEST = TEST1
+      RAP1 = 1.0D0/AP1
+      P1R = P1R*RAP1
+      P1I = P1I*RAP1
+      P2R = P2R*RAP1
+      P2I = P2I*RAP1
+      AP2 = AP2*RAP1
+   10 CONTINUE
+      K = K + 1
+      AP1 = AP2
+      PTR = P2R
+      PTI = P2I
+      P2R = P1R - (T1R*PTR-T1I*PTI)
+      P2I = P1I - (T1R*PTI+T1I*PTR)
+      P1R = PTR
+      P1I = PTI
+      T1R = T1R + RZR
+      T1I = T1I + RZI
+      AP2 = XZABS(P2R,P2I)
+      IF (AP1.LE.TEST) GO TO 10
+      IF (ITIME.EQ.2) GO TO 20
+      AK = XZABS(T1R,T1I)*0.5D0
+      FLAM = AK + DSQRT(AK*AK-1.0D0)
+      RHO = DMIN1(AP2/AP1,FLAM)
+      TEST = TEST1*DSQRT(RHO/(RHO*RHO-1.0D0))
+      ITIME = 2
+      GO TO 10
+   20 CONTINUE
+      KK = K + 1 - ID
+      AK = DBLE(FLOAT(KK))
+      T1R = AK
+      T1I = CZEROI
+      DFNU = FNU + DBLE(FLOAT(N-1))
+      P1R = 1.0D0/AP2
+      P1I = CZEROI
+      P2R = CZEROR
+      P2I = CZEROI
+      DO 30 I=1,KK
+        PTR = P1R
+        PTI = P1I
+        RAP1 = DFNU + T1R
+        TTR = RZR*RAP1
+        TTI = RZI*RAP1
+        P1R = (PTR*TTR-PTI*TTI) + P2R
+        P1I = (PTR*TTI+PTI*TTR) + P2I
+        P2R = PTR
+        P2I = PTI
+        T1R = T1R - CONER
+   30 CONTINUE
+      IF (P1R.NE.CZEROR .OR. P1I.NE.CZEROI) GO TO 40
+      P1R = TOL
+      P1I = TOL
+   40 CONTINUE
+      CALL ZDIV(P2R, P2I, P1R, P1I, CYR(N), CYI(N))
+      IF (N.EQ.1) RETURN
+      K = N - 1
+      AK = DBLE(FLOAT(K))
+      T1R = AK
+      T1I = CZEROI
+      CDFNUR = FNU*RZR
+      CDFNUI = FNU*RZI
+      DO 60 I=2,N
+        PTR = CDFNUR + (T1R*RZR-T1I*RZI) + CYR(K+1)
+        PTI = CDFNUI + (T1R*RZI+T1I*RZR) + CYI(K+1)
+        AK = XZABS(PTR,PTI)
+        IF (AK.NE.CZEROR) GO TO 50
+        PTR = TOL
+        PTI = TOL
+        AK = TOL*RT2
+   50   CONTINUE
+        RAK = CONER/AK
+        CYR(K) = RAK*PTR*RAK
+        CYI(K) = -RAK*PTI*RAK
+        T1R = T1R - CONER
+        K = K - 1
+   60 CONTINUE
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zs1s2.f
@@ -0,0 +1,49 @@
+      SUBROUTINE ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NZ, ASCLE, ALIM,
+     * IUF)
+C***BEGIN PROLOGUE  ZS1S2
+C***REFER TO  ZBESK,ZAIRY
+C
+C     ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE
+C     ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON-
+C     TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION.
+C     ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF
+C     MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER
+C     OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE
+C     PRECISION ABOVE THE UNDERFLOW LIMIT.
+C
+C***ROUTINES CALLED  XZABS,XZEXP,XZLOG
+C***END PROLOGUE  ZS1S2
+C     COMPLEX CZERO,C1,S1,S1D,S2,ZR
+      DOUBLE PRECISION AA, ALIM, ALN, ASCLE, AS1, AS2, C1I, C1R, S1DI,
+     * S1DR, S1I, S1R, S2I, S2R, ZEROI, ZEROR, ZRI, ZRR, XZABS
+      INTEGER IUF, IDUM, NZ
+      DATA ZEROR,ZEROI  / 0.0D0 , 0.0D0 /
+      NZ = 0
+      AS1 = XZABS(S1R,S1I)
+      AS2 = XZABS(S2R,S2I)
+      IF (S1R.EQ.0.0D0 .AND. S1I.EQ.0.0D0) GO TO 10
+      IF (AS1.EQ.0.0D0) GO TO 10
+      ALN = -ZRR - ZRR + DLOG(AS1)
+      S1DR = S1R
+      S1DI = S1I
+      S1R = ZEROR
+      S1I = ZEROI
+      AS1 = ZEROR
+      IF (ALN.LT.(-ALIM)) GO TO 10
+      CALL XZLOG(S1DR, S1DI, C1R, C1I, IDUM)
+      C1R = C1R - ZRR - ZRR
+      C1I = C1I - ZRI - ZRI
+      CALL XZEXP(C1R, C1I, S1R, S1I)
+      AS1 = XZABS(S1R,S1I)
+      IUF = IUF + 1
+   10 CONTINUE
+      AA = DMAX1(AS1,AS2)
+      IF (AA.GT.ASCLE) RETURN
+      S1R = ZEROR
+      S1I = ZEROI
+      S2R = ZEROR
+      S2I = ZEROI
+      NZ = 1
+      IUF = 0
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zseri.f
@@ -0,0 +1,190 @@
+      SUBROUTINE ZSERI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM,
+     * ALIM)
+C***BEGIN PROLOGUE  ZSERI
+C***REFER TO  ZBESI,ZBESK
+C
+C     ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
+C     MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE
+C     REGION CABS(Z).LE.2*SQRT(FNU+1). NZ=0 IS A NORMAL RETURN.
+C     NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO
+C     DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE
+C     CONDITION CABS(Z).LE.2*SQRT(FNU+1) WAS VIOLATED AND THE
+C     COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).
+C
+C***ROUTINES CALLED  DGAMLN,D1MACH,ZUCHK,XZABS,ZDIV,XZLOG,ZMLT
+C***END PROLOGUE  ZSERI
+C     COMPLEX AK1,CK,COEF,CONE,CRSC,CSCL,CZ,CZERO,HZ,RZ,S1,S2,Y,Z
+      DOUBLE PRECISION AA, ACZ, AK, AK1I, AK1R, ALIM, ARM, ASCLE, ATOL,
+     * AZ, CKI, CKR, COEFI, COEFR, CONEI, CONER, CRSCR, CZI, CZR, DFNU,
+     * ELIM, FNU, FNUP, HZI, HZR, RAZ, RS, RTR1, RZI, RZR, S, SS, STI,
+     * STR, S1I, S1R, S2I, S2R, TOL, YI, YR, WI, WR, ZEROI, ZEROR, ZI,
+     * ZR, DGAMLN, D1MACH, XZABS
+      INTEGER I, IB, IDUM, IFLAG, IL, K, KODE, L, M, N, NN, NZ, NW
+      DIMENSION YR(N), YI(N), WR(2), WI(2)
+      DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
+C
+      NZ = 0
+      AZ = XZABS(ZR,ZI)
+      IF (AZ.EQ.0.0D0) GO TO 160
+      ARM = 1.0D+3*D1MACH(1)
+      RTR1 = DSQRT(ARM)
+      CRSCR = 1.0D0
+      IFLAG = 0
+      IF (AZ.LT.ARM) GO TO 150
+      HZR = 0.5D0*ZR
+      HZI = 0.5D0*ZI
+      CZR = ZEROR
+      CZI = ZEROI
+      IF (AZ.LE.RTR1) GO TO 10
+      CALL ZMLT(HZR, HZI, HZR, HZI, CZR, CZI)
+   10 CONTINUE
+      ACZ = XZABS(CZR,CZI)
+      NN = N
+      CALL XZLOG(HZR, HZI, CKR, CKI, IDUM)
+   20 CONTINUE
+      DFNU = FNU + DBLE(FLOAT(NN-1))
+      FNUP = DFNU + 1.0D0
+C-----------------------------------------------------------------------
+C     UNDERFLOW TEST
+C-----------------------------------------------------------------------
+      AK1R = CKR*DFNU
+      AK1I = CKI*DFNU
+      AK = DGAMLN(FNUP,IDUM)
+      AK1R = AK1R - AK
+      IF (KODE.EQ.2) AK1R = AK1R - ZR
+      IF (AK1R.GT.(-ELIM)) GO TO 40
+   30 CONTINUE
+      NZ = NZ + 1
+      YR(NN) = ZEROR
+      YI(NN) = ZEROI
+      IF (ACZ.GT.DFNU) GO TO 190
+      NN = NN - 1
+      IF (NN.EQ.0) RETURN
+      GO TO 20
+   40 CONTINUE
+      IF (AK1R.GT.(-ALIM)) GO TO 50
+      IFLAG = 1
+      SS = 1.0D0/TOL
+      CRSCR = TOL
+      ASCLE = ARM*SS
+   50 CONTINUE
+      AA = DEXP(AK1R)
+      IF (IFLAG.EQ.1) AA = AA*SS
+      COEFR = AA*DCOS(AK1I)
+      COEFI = AA*DSIN(AK1I)
+      ATOL = TOL*ACZ/FNUP
+      IL = MIN0(2,NN)
+      DO 90 I=1,IL
+        DFNU = FNU + DBLE(FLOAT(NN-I))
+        FNUP = DFNU + 1.0D0
+        S1R = CONER
+        S1I = CONEI
+        IF (ACZ.LT.TOL*FNUP) GO TO 70
+        AK1R = CONER
+        AK1I = CONEI
+        AK = FNUP + 2.0D0
+        S = FNUP
+        AA = 2.0D0
+   60   CONTINUE
+        RS = 1.0D0/S
+        STR = AK1R*CZR - AK1I*CZI
+        STI = AK1R*CZI + AK1I*CZR
+        AK1R = STR*RS
+        AK1I = STI*RS
+        S1R = S1R + AK1R
+        S1I = S1I + AK1I
+        S = S + AK
+        AK = AK + 2.0D0
+        AA = AA*ACZ*RS
+        IF (AA.GT.ATOL) GO TO 60
+   70   CONTINUE
+        S2R = S1R*COEFR - S1I*COEFI
+        S2I = S1R*COEFI + S1I*COEFR
+        WR(I) = S2R
+        WI(I) = S2I
+        IF (IFLAG.EQ.0) GO TO 80
+        CALL ZUCHK(S2R, S2I, NW, ASCLE, TOL)
+        IF (NW.NE.0) GO TO 30
+   80   CONTINUE
+        M = NN - I + 1
+        YR(M) = S2R*CRSCR
+        YI(M) = S2I*CRSCR
+        IF (I.EQ.IL) GO TO 90
+        CALL ZDIV(COEFR, COEFI, HZR, HZI, STR, STI)
+        COEFR = STR*DFNU
+        COEFI = STI*DFNU
+   90 CONTINUE
+      IF (NN.LE.2) RETURN
+      K = NN - 2
+      AK = DBLE(FLOAT(K))
+      RAZ = 1.0D0/AZ
+      STR = ZR*RAZ
+      STI = -ZI*RAZ
+      RZR = (STR+STR)*RAZ
+      RZI = (STI+STI)*RAZ
+      IF (IFLAG.EQ.1) GO TO 120
+      IB = 3
+  100 CONTINUE
+      DO 110 I=IB,NN
+        YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
+        YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
+        AK = AK - 1.0D0
+        K = K - 1
+  110 CONTINUE
+      RETURN
+C-----------------------------------------------------------------------
+C     RECUR BACKWARD WITH SCALED VALUES
+C-----------------------------------------------------------------------
+  120 CONTINUE
+C-----------------------------------------------------------------------
+C     EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION ABOVE THE
+C     UNDERFLOW LIMIT = ASCLE = D1MACH(1)*SS*1.0D+3
+C-----------------------------------------------------------------------
+      S1R = WR(1)
+      S1I = WI(1)
+      S2R = WR(2)
+      S2I = WI(2)
+      DO 130 L=3,NN
+        CKR = S2R
+        CKI = S2I
+        S2R = S1R + (AK+FNU)*(RZR*CKR-RZI*CKI)
+        S2I = S1I + (AK+FNU)*(RZR*CKI+RZI*CKR)
+        S1R = CKR
+        S1I = CKI
+        CKR = S2R*CRSCR
+        CKI = S2I*CRSCR
+        YR(K) = CKR
+        YI(K) = CKI
+        AK = AK - 1.0D0
+        K = K - 1
+        IF (XZABS(CKR,CKI).GT.ASCLE) GO TO 140
+  130 CONTINUE
+      RETURN
+  140 CONTINUE
+      IB = L + 1
+      IF (IB.GT.NN) RETURN
+      GO TO 100
+  150 CONTINUE
+      NZ = N
+      IF (FNU.EQ.0.0D0) NZ = NZ - 1
+  160 CONTINUE
+      YR(1) = ZEROR
+      YI(1) = ZEROI
+      IF (FNU.NE.0.0D0) GO TO 170
+      YR(1) = CONER
+      YI(1) = CONEI
+  170 CONTINUE
+      IF (N.EQ.1) RETURN
+      DO 180 I=2,N
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+  180 CONTINUE
+      RETURN
+C-----------------------------------------------------------------------
+C     RETURN WITH NZ.LT.0 IF CABS(Z*Z/4).GT.FNU+N-NZ-1 COMPLETE
+C     THE CALCULATION IN CBINU WITH N=N-IABS(NZ)
+C-----------------------------------------------------------------------
+  190 CONTINUE
+      NZ = -NZ
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zshch.f
@@ -0,0 +1,22 @@
+      SUBROUTINE ZSHCH(ZR, ZI, CSHR, CSHI, CCHR, CCHI)
+C***BEGIN PROLOGUE  ZSHCH
+C***REFER TO  ZBESK,ZBESH
+C
+C     ZSHCH COMPUTES THE COMPLEX HYPERBOLIC FUNCTIONS CSH=SINH(X+I*Y)
+C     AND CCH=COSH(X+I*Y), WHERE I**2=-1.
+C
+C***ROUTINES CALLED  (NONE)
+C***END PROLOGUE  ZSHCH
+C
+      DOUBLE PRECISION CCHI, CCHR, CH, CN, CSHI, CSHR, SH, SN, ZI, ZR,
+     * DCOSH, DSINH
+      SH = DSINH(ZR)
+      CH = DCOSH(ZR)
+      SN = DSIN(ZI)
+      CN = DCOS(ZI)
+      CSHR = SH*CN
+      CSHI = CH*SN
+      CCHR = CH*CN
+      CCHI = SH*SN
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zuchk.f
@@ -0,0 +1,28 @@
+      SUBROUTINE ZUCHK(YR, YI, NZ, ASCLE, TOL)
+C***BEGIN PROLOGUE  ZUCHK
+C***REFER TO ZSERI,ZUOIK,ZUNK1,ZUNK2,ZUNI1,ZUNI2,ZKSCL
+C
+C      Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN
+C      EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL. THE TEST IS MADE TO SEE
+C      IF THE MAGNITUDE OF THE REAL OR IMAGINARY PART WOULD UNDERFLOW
+C      WHEN Y IS SCALED (BY TOL) TO ITS PROPER VALUE. Y IS ACCEPTED
+C      IF THE UNDERFLOW IS AT LEAST ONE PRECISION BELOW THE MAGNITUDE
+C      OF THE LARGEST COMPONENT; OTHERWISE THE PHASE ANGLE DOES NOT HAVE
+C      ABSOLUTE ACCURACY AND AN UNDERFLOW IS ASSUMED.
+C
+C***ROUTINES CALLED  (NONE)
+C***END PROLOGUE  ZUCHK
+C
+C     COMPLEX Y
+      DOUBLE PRECISION ASCLE, SS, ST, TOL, WR, WI, YR, YI
+      INTEGER NZ
+      NZ = 0
+      WR = DABS(YR)
+      WI = DABS(YI)
+      ST = DMIN1(WR,WI)
+      IF (ST.GT.ASCLE) RETURN
+      SS = DMAX1(WR,WI)
+      ST = ST/TOL
+      IF (SS.LT.ST) NZ = 1
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zunhj.f
@@ -0,0 +1,714 @@
+      SUBROUTINE ZUNHJ(ZR, ZI, FNU, IPMTR, TOL, PHIR, PHII, ARGR, ARGI,
+     * ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
+C***BEGIN PROLOGUE  ZUNHJ
+C***REFER TO  ZBESI,ZBESK
+C
+C     REFERENCES
+C         HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ AND I.A.
+C         STEGUN, AMS55, NATIONAL BUREAU OF STANDARDS, 1965, CHAPTER 9.
+C
+C         ASYMPTOTICS AND SPECIAL FUNCTIONS BY F.W.J. OLVER, ACADEMIC
+C         PRESS, N.Y., 1974, PAGE 420
+C
+C     ABSTRACT
+C         ZUNHJ COMPUTES PARAMETERS FOR BESSEL FUNCTIONS C(FNU,Z) =
+C         J(FNU,Z), Y(FNU,Z) OR H(I,FNU,Z) I=1,2 FOR LARGE ORDERS FNU
+C         BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION
+C
+C         C(FNU,Z)=C1*PHI*( ASUM*AIRY(ARG) + C2*BSUM*DAIRY(ARG) )
+C
+C         FOR PROPER CHOICES OF C1, C2, AIRY AND DAIRY WHERE AIRY IS
+C         AN AIRY FUNCTION AND DAIRY IS ITS DERIVATIVE.
+C
+C               (2/3)*FNU*ZETA**1.5 = ZETA1-ZETA2,
+C
+C         ZETA1=0.5*FNU*CLOG((1+W)/(1-W)), ZETA2=FNU*W FOR SCALING
+C         PURPOSES IN AIRY FUNCTIONS FROM CAIRY OR CBIRY.
+C
+C         MCONJ=SIGN OF AIMAG(Z), BUT IS AMBIGUOUS WHEN Z IS REAL AND
+C         MUST BE SPECIFIED. IPMTR=0 RETURNS ALL PARAMETERS. IPMTR=
+C         1 COMPUTES ALL EXCEPT ASUM AND BSUM.
+C
+C***ROUTINES CALLED  XZABS,ZDIV,XZLOG,XZSQRT,D1MACH
+C***END PROLOGUE  ZUNHJ
+C     COMPLEX ARG,ASUM,BSUM,CFNU,CONE,CR,CZERO,DR,P,PHI,PRZTH,PTFN,
+C    *RFN13,RTZTA,RZTH,SUMA,SUMB,TFN,T2,UP,W,W2,Z,ZA,ZB,ZC,ZETA,ZETA1,
+C    *ZETA2,ZTH
+      DOUBLE PRECISION ALFA, ANG, AP, AR, ARGI, ARGR, ASUMI, ASUMR,
+     * ATOL, AW2, AZTH, BETA, BR, BSUMI, BSUMR, BTOL, C, CONEI, CONER,
+     * CRI, CRR, DRI, DRR, EX1, EX2, FNU, FN13, FN23, GAMA, GPI, HPI,
+     * PHII, PHIR, PI, PP, PR, PRZTHI, PRZTHR, PTFNI, PTFNR, RAW, RAW2,
+     * RAZTH, RFNU, RFNU2, RFN13, RTZTI, RTZTR, RZTHI, RZTHR, STI, STR,
+     * SUMAI, SUMAR, SUMBI, SUMBR, TEST, TFNI, TFNR, THPI, TOL, TZAI,
+     * TZAR, T2I, T2R, UPI, UPR, WI, WR, W2I, W2R, ZAI, ZAR, ZBI, ZBR,
+     * ZCI, ZCR, ZEROI, ZEROR, ZETAI, ZETAR, ZETA1I, ZETA1R, ZETA2I,
+     * ZETA2R, ZI, ZR, ZTHI, ZTHR, XZABS, AC, D1MACH
+      INTEGER IAS, IBS, IPMTR, IS, J, JR, JU, K, KMAX, KP1, KS, L, LR,
+     * LRP1, L1, L2, M, IDUM
+      DIMENSION AR(14), BR(14), C(105), ALFA(180), BETA(210), GAMA(30),
+     * AP(30), PR(30), PI(30), UPR(14), UPI(14), CRR(14), CRI(14),
+     * DRR(14), DRI(14)
+      DATA AR(1), AR(2), AR(3), AR(4), AR(5), AR(6), AR(7), AR(8),
+     1     AR(9), AR(10), AR(11), AR(12), AR(13), AR(14)/
+     2     1.00000000000000000D+00,     1.04166666666666667D-01,
+     3     8.35503472222222222D-02,     1.28226574556327160D-01,
+     4     2.91849026464140464D-01,     8.81627267443757652D-01,
+     5     3.32140828186276754D+00,     1.49957629868625547D+01,
+     6     7.89230130115865181D+01,     4.74451538868264323D+02,
+     7     3.20749009089066193D+03,     2.40865496408740049D+04,
+     8     1.98923119169509794D+05,     1.79190200777534383D+06/
+      DATA BR(1), BR(2), BR(3), BR(4), BR(5), BR(6), BR(7), BR(8),
+     1     BR(9), BR(10), BR(11), BR(12), BR(13), BR(14)/
+     2     1.00000000000000000D+00,    -1.45833333333333333D-01,
+     3    -9.87413194444444444D-02,    -1.43312053915895062D-01,
+     4    -3.17227202678413548D-01,    -9.42429147957120249D-01,
+     5    -3.51120304082635426D+00,    -1.57272636203680451D+01,
+     6    -8.22814390971859444D+01,    -4.92355370523670524D+02,
+     7    -3.31621856854797251D+03,    -2.48276742452085896D+04,
+     8    -2.04526587315129788D+05,    -1.83844491706820990D+06/
+      DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10),
+     1     C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18),
+     2     C(19), C(20), C(21), C(22), C(23), C(24)/
+     3     1.00000000000000000D+00,    -2.08333333333333333D-01,
+     4     1.25000000000000000D-01,     3.34201388888888889D-01,
+     5    -4.01041666666666667D-01,     7.03125000000000000D-02,
+     6    -1.02581259645061728D+00,     1.84646267361111111D+00,
+     7    -8.91210937500000000D-01,     7.32421875000000000D-02,
+     8     4.66958442342624743D+00,    -1.12070026162229938D+01,
+     9     8.78912353515625000D+00,    -2.36408691406250000D+00,
+     A     1.12152099609375000D-01,    -2.82120725582002449D+01,
+     B     8.46362176746007346D+01,    -9.18182415432400174D+01,
+     C     4.25349987453884549D+01,    -7.36879435947963170D+00,
+     D     2.27108001708984375D-01,     2.12570130039217123D+02,
+     E    -7.65252468141181642D+02,     1.05999045252799988D+03/
+      DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32),
+     1     C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40),
+     2     C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/
+     3    -6.99579627376132541D+02,     2.18190511744211590D+02,
+     4    -2.64914304869515555D+01,     5.72501420974731445D-01,
+     5    -1.91945766231840700D+03,     8.06172218173730938D+03,
+     6    -1.35865500064341374D+04,     1.16553933368645332D+04,
+     7    -5.30564697861340311D+03,     1.20090291321635246D+03,
+     8    -1.08090919788394656D+02,     1.72772750258445740D+00,
+     9     2.02042913309661486D+04,    -9.69805983886375135D+04,
+     A     1.92547001232531532D+05,    -2.03400177280415534D+05,
+     B     1.22200464983017460D+05,    -4.11926549688975513D+04,
+     C     7.10951430248936372D+03,    -4.93915304773088012D+02,
+     D     6.07404200127348304D+00,    -2.42919187900551333D+05,
+     E     1.31176361466297720D+06,    -2.99801591853810675D+06/
+      DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56),
+     1     C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64),
+     2     C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/
+     3     3.76327129765640400D+06,    -2.81356322658653411D+06,
+     4     1.26836527332162478D+06,    -3.31645172484563578D+05,
+     5     4.52187689813627263D+04,    -2.49983048181120962D+03,
+     6     2.43805296995560639D+01,     3.28446985307203782D+06,
+     7    -1.97068191184322269D+07,     5.09526024926646422D+07,
+     8    -7.41051482115326577D+07,     6.63445122747290267D+07,
+     9    -3.75671766607633513D+07,     1.32887671664218183D+07,
+     A    -2.78561812808645469D+06,     3.08186404612662398D+05,
+     B    -1.38860897537170405D+04,     1.10017140269246738D+02,
+     C    -4.93292536645099620D+07,     3.25573074185765749D+08,
+     D    -9.39462359681578403D+08,     1.55359689957058006D+09,
+     E    -1.62108055210833708D+09,     1.10684281682301447D+09/
+      DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80),
+     1     C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88),
+     2     C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/
+     3    -4.95889784275030309D+08,     1.42062907797533095D+08,
+     4    -2.44740627257387285D+07,     2.24376817792244943D+06,
+     5    -8.40054336030240853D+04,     5.51335896122020586D+02,
+     6     8.14789096118312115D+08,    -5.86648149205184723D+09,
+     7     1.86882075092958249D+10,    -3.46320433881587779D+10,
+     8     4.12801855797539740D+10,    -3.30265997498007231D+10,
+     9     1.79542137311556001D+10,    -6.56329379261928433D+09,
+     A     1.55927986487925751D+09,    -2.25105661889415278D+08,
+     B     1.73951075539781645D+07,    -5.49842327572288687D+05,
+     C     3.03809051092238427D+03,    -1.46792612476956167D+10,
+     D     1.14498237732025810D+11,    -3.99096175224466498D+11,
+     E     8.19218669548577329D+11,    -1.09837515608122331D+12/
+      DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104),
+     1     C(105)/
+     2     1.00815810686538209D+12,    -6.45364869245376503D+11,
+     3     2.87900649906150589D+11,    -8.78670721780232657D+10,
+     4     1.76347306068349694D+10,    -2.16716498322379509D+09,
+     5     1.43157876718888981D+08,    -3.87183344257261262D+06,
+     6     1.82577554742931747D+04/
+      DATA ALFA(1), ALFA(2), ALFA(3), ALFA(4), ALFA(5), ALFA(6),
+     1     ALFA(7), ALFA(8), ALFA(9), ALFA(10), ALFA(11), ALFA(12),
+     2     ALFA(13), ALFA(14), ALFA(15), ALFA(16), ALFA(17), ALFA(18),
+     3     ALFA(19), ALFA(20), ALFA(21), ALFA(22)/
+     4    -4.44444444444444444D-03,    -9.22077922077922078D-04,
+     5    -8.84892884892884893D-05,     1.65927687832449737D-04,
+     6     2.46691372741792910D-04,     2.65995589346254780D-04,
+     7     2.61824297061500945D-04,     2.48730437344655609D-04,
+     8     2.32721040083232098D-04,     2.16362485712365082D-04,
+     9     2.00738858762752355D-04,     1.86267636637545172D-04,
+     A     1.73060775917876493D-04,     1.61091705929015752D-04,
+     B     1.50274774160908134D-04,     1.40503497391269794D-04,
+     C     1.31668816545922806D-04,     1.23667445598253261D-04,
+     D     1.16405271474737902D-04,     1.09798298372713369D-04,
+     E     1.03772410422992823D-04,     9.82626078369363448D-05/
+      DATA ALFA(23), ALFA(24), ALFA(25), ALFA(26), ALFA(27), ALFA(28),
+     1     ALFA(29), ALFA(30), ALFA(31), ALFA(32), ALFA(33), ALFA(34),
+     2     ALFA(35), ALFA(36), ALFA(37), ALFA(38), ALFA(39), ALFA(40),
+     3     ALFA(41), ALFA(42), ALFA(43), ALFA(44)/
+     4     9.32120517249503256D-05,     8.85710852478711718D-05,
+     5     8.42963105715700223D-05,     8.03497548407791151D-05,
+     6     7.66981345359207388D-05,     7.33122157481777809D-05,
+     7     7.01662625163141333D-05,     6.72375633790160292D-05,
+     8     6.93735541354588974D-04,     2.32241745182921654D-04,
+     9    -1.41986273556691197D-05,    -1.16444931672048640D-04,
+     A    -1.50803558053048762D-04,    -1.55121924918096223D-04,
+     B    -1.46809756646465549D-04,    -1.33815503867491367D-04,
+     C    -1.19744975684254051D-04,    -1.06184319207974020D-04,
+     D    -9.37699549891194492D-05,    -8.26923045588193274D-05,
+     E    -7.29374348155221211D-05,    -6.44042357721016283D-05/
+      DATA ALFA(45), ALFA(46), ALFA(47), ALFA(48), ALFA(49), ALFA(50),
+     1     ALFA(51), ALFA(52), ALFA(53), ALFA(54), ALFA(55), ALFA(56),
+     2     ALFA(57), ALFA(58), ALFA(59), ALFA(60), ALFA(61), ALFA(62),
+     3     ALFA(63), ALFA(64), ALFA(65), ALFA(66)/
+     4    -5.69611566009369048D-05,    -5.04731044303561628D-05,
+     5    -4.48134868008882786D-05,    -3.98688727717598864D-05,
+     6    -3.55400532972042498D-05,    -3.17414256609022480D-05,
+     7    -2.83996793904174811D-05,    -2.54522720634870566D-05,
+     8    -2.28459297164724555D-05,    -2.05352753106480604D-05,
+     9    -1.84816217627666085D-05,    -1.66519330021393806D-05,
+     A    -1.50179412980119482D-05,    -1.35554031379040526D-05,
+     B    -1.22434746473858131D-05,    -1.10641884811308169D-05,
+     C    -3.54211971457743841D-04,    -1.56161263945159416D-04,
+     D     3.04465503594936410D-05,     1.30198655773242693D-04,
+     E     1.67471106699712269D-04,     1.70222587683592569D-04/
+      DATA ALFA(67), ALFA(68), ALFA(69), ALFA(70), ALFA(71), ALFA(72),
+     1     ALFA(73), ALFA(74), ALFA(75), ALFA(76), ALFA(77), ALFA(78),
+     2     ALFA(79), ALFA(80), ALFA(81), ALFA(82), ALFA(83), ALFA(84),
+     3     ALFA(85), ALFA(86), ALFA(87), ALFA(88)/
+     4     1.56501427608594704D-04,     1.36339170977445120D-04,
+     5     1.14886692029825128D-04,     9.45869093034688111D-05,
+     6     7.64498419250898258D-05,     6.07570334965197354D-05,
+     7     4.74394299290508799D-05,     3.62757512005344297D-05,
+     8     2.69939714979224901D-05,     1.93210938247939253D-05,
+     9     1.30056674793963203D-05,     7.82620866744496661D-06,
+     A     3.59257485819351583D-06,     1.44040049814251817D-07,
+     B    -2.65396769697939116D-06,    -4.91346867098485910D-06,
+     C    -6.72739296091248287D-06,    -8.17269379678657923D-06,
+     D    -9.31304715093561232D-06,    -1.02011418798016441D-05,
+     E    -1.08805962510592880D-05,    -1.13875481509603555D-05/
+      DATA ALFA(89), ALFA(90), ALFA(91), ALFA(92), ALFA(93), ALFA(94),
+     1     ALFA(95), ALFA(96), ALFA(97), ALFA(98), ALFA(99), ALFA(100),
+     2     ALFA(101), ALFA(102), ALFA(103), ALFA(104), ALFA(105),
+     3     ALFA(106), ALFA(107), ALFA(108), ALFA(109), ALFA(110)/
+     4    -1.17519675674556414D-05,    -1.19987364870944141D-05,
+     5     3.78194199201772914D-04,     2.02471952761816167D-04,
+     6    -6.37938506318862408D-05,    -2.38598230603005903D-04,
+     7    -3.10916256027361568D-04,    -3.13680115247576316D-04,
+     8    -2.78950273791323387D-04,    -2.28564082619141374D-04,
+     9    -1.75245280340846749D-04,    -1.25544063060690348D-04,
+     A    -8.22982872820208365D-05,    -4.62860730588116458D-05,
+     B    -1.72334302366962267D-05,     5.60690482304602267D-06,
+     C     2.31395443148286800D-05,     3.62642745856793957D-05,
+     D     4.58006124490188752D-05,     5.24595294959114050D-05,
+     E     5.68396208545815266D-05,     5.94349820393104052D-05/
+      DATA ALFA(111), ALFA(112), ALFA(113), ALFA(114), ALFA(115),
+     1     ALFA(116), ALFA(117), ALFA(118), ALFA(119), ALFA(120),
+     2     ALFA(121), ALFA(122), ALFA(123), ALFA(124), ALFA(125),
+     3     ALFA(126), ALFA(127), ALFA(128), ALFA(129), ALFA(130)/
+     4     6.06478527578421742D-05,     6.08023907788436497D-05,
+     5     6.01577894539460388D-05,     5.89199657344698500D-05,
+     6     5.72515823777593053D-05,     5.52804375585852577D-05,
+     7     5.31063773802880170D-05,     5.08069302012325706D-05,
+     8     4.84418647620094842D-05,     4.60568581607475370D-05,
+     9    -6.91141397288294174D-04,    -4.29976633058871912D-04,
+     A     1.83067735980039018D-04,     6.60088147542014144D-04,
+     B     8.75964969951185931D-04,     8.77335235958235514D-04,
+     C     7.49369585378990637D-04,     5.63832329756980918D-04,
+     D     3.68059319971443156D-04,     1.88464535514455599D-04/
+      DATA ALFA(131), ALFA(132), ALFA(133), ALFA(134), ALFA(135),
+     1     ALFA(136), ALFA(137), ALFA(138), ALFA(139), ALFA(140),
+     2     ALFA(141), ALFA(142), ALFA(143), ALFA(144), ALFA(145),
+     3     ALFA(146), ALFA(147), ALFA(148), ALFA(149), ALFA(150)/
+     4     3.70663057664904149D-05,    -8.28520220232137023D-05,
+     5    -1.72751952869172998D-04,    -2.36314873605872983D-04,
+     6    -2.77966150694906658D-04,    -3.02079514155456919D-04,
+     7    -3.12594712643820127D-04,    -3.12872558758067163D-04,
+     8    -3.05678038466324377D-04,    -2.93226470614557331D-04,
+     9    -2.77255655582934777D-04,    -2.59103928467031709D-04,
+     A    -2.39784014396480342D-04,    -2.20048260045422848D-04,
+     B    -2.00443911094971498D-04,    -1.81358692210970687D-04,
+     C    -1.63057674478657464D-04,    -1.45712672175205844D-04,
+     D    -1.29425421983924587D-04,    -1.14245691942445952D-04/
+      DATA ALFA(151), ALFA(152), ALFA(153), ALFA(154), ALFA(155),
+     1     ALFA(156), ALFA(157), ALFA(158), ALFA(159), ALFA(160),
+     2     ALFA(161), ALFA(162), ALFA(163), ALFA(164), ALFA(165),
+     3     ALFA(166), ALFA(167), ALFA(168), ALFA(169), ALFA(170)/
+     4     1.92821964248775885D-03,     1.35592576302022234D-03,
+     5    -7.17858090421302995D-04,    -2.58084802575270346D-03,
+     6    -3.49271130826168475D-03,    -3.46986299340960628D-03,
+     7    -2.82285233351310182D-03,    -1.88103076404891354D-03,
+     8    -8.89531718383947600D-04,     3.87912102631035228D-06,
+     9     7.28688540119691412D-04,     1.26566373053457758D-03,
+     A     1.62518158372674427D-03,     1.83203153216373172D-03,
+     B     1.91588388990527909D-03,     1.90588846755546138D-03,
+     C     1.82798982421825727D-03,     1.70389506421121530D-03,
+     D     1.55097127171097686D-03,     1.38261421852276159D-03/
+      DATA ALFA(171), ALFA(172), ALFA(173), ALFA(174), ALFA(175),
+     1     ALFA(176), ALFA(177), ALFA(178), ALFA(179), ALFA(180)/
+     2     1.20881424230064774D-03,     1.03676532638344962D-03,
+     3     8.71437918068619115D-04,     7.16080155297701002D-04,
+     4     5.72637002558129372D-04,     4.42089819465802277D-04,
+     5     3.24724948503090564D-04,     2.20342042730246599D-04,
+     6     1.28412898401353882D-04,     4.82005924552095464D-05/
+      DATA BETA(1), BETA(2), BETA(3), BETA(4), BETA(5), BETA(6),
+     1     BETA(7), BETA(8), BETA(9), BETA(10), BETA(11), BETA(12),
+     2     BETA(13), BETA(14), BETA(15), BETA(16), BETA(17), BETA(18),
+     3     BETA(19), BETA(20), BETA(21), BETA(22)/
+     4     1.79988721413553309D-02,     5.59964911064388073D-03,
+     5     2.88501402231132779D-03,     1.80096606761053941D-03,
+     6     1.24753110589199202D-03,     9.22878876572938311D-04,
+     7     7.14430421727287357D-04,     5.71787281789704872D-04,
+     8     4.69431007606481533D-04,     3.93232835462916638D-04,
+     9     3.34818889318297664D-04,     2.88952148495751517D-04,
+     A     2.52211615549573284D-04,     2.22280580798883327D-04,
+     B     1.97541838033062524D-04,     1.76836855019718004D-04,
+     C     1.59316899661821081D-04,     1.44347930197333986D-04,
+     D     1.31448068119965379D-04,     1.20245444949302884D-04,
+     E     1.10449144504599392D-04,     1.01828770740567258D-04/
+      DATA BETA(23), BETA(24), BETA(25), BETA(26), BETA(27), BETA(28),
+     1     BETA(29), BETA(30), BETA(31), BETA(32), BETA(33), BETA(34),
+     2     BETA(35), BETA(36), BETA(37), BETA(38), BETA(39), BETA(40),
+     3     BETA(41), BETA(42), BETA(43), BETA(44)/
+     4     9.41998224204237509D-05,     8.74130545753834437D-05,
+     5     8.13466262162801467D-05,     7.59002269646219339D-05,
+     6     7.09906300634153481D-05,     6.65482874842468183D-05,
+     7     6.25146958969275078D-05,     5.88403394426251749D-05,
+     8    -1.49282953213429172D-03,    -8.78204709546389328D-04,
+     9    -5.02916549572034614D-04,    -2.94822138512746025D-04,
+     A    -1.75463996970782828D-04,    -1.04008550460816434D-04,
+     B    -5.96141953046457895D-05,    -3.12038929076098340D-05,
+     C    -1.26089735980230047D-05,    -2.42892608575730389D-07,
+     D     8.05996165414273571D-06,     1.36507009262147391D-05,
+     E     1.73964125472926261D-05,     1.98672978842133780D-05/
+      DATA BETA(45), BETA(46), BETA(47), BETA(48), BETA(49), BETA(50),
+     1     BETA(51), BETA(52), BETA(53), BETA(54), BETA(55), BETA(56),
+     2     BETA(57), BETA(58), BETA(59), BETA(60), BETA(61), BETA(62),
+     3     BETA(63), BETA(64), BETA(65), BETA(66)/
+     4     2.14463263790822639D-05,     2.23954659232456514D-05,
+     5     2.28967783814712629D-05,     2.30785389811177817D-05,
+     6     2.30321976080909144D-05,     2.28236073720348722D-05,
+     7     2.25005881105292418D-05,     2.20981015361991429D-05,
+     8     2.16418427448103905D-05,     2.11507649256220843D-05,
+     9     2.06388749782170737D-05,     2.01165241997081666D-05,
+     A     1.95913450141179244D-05,     1.90689367910436740D-05,
+     B     1.85533719641636667D-05,     1.80475722259674218D-05,
+     C     5.52213076721292790D-04,     4.47932581552384646D-04,
+     D     2.79520653992020589D-04,     1.52468156198446602D-04,
+     E     6.93271105657043598D-05,     1.76258683069991397D-05/
+      DATA BETA(67), BETA(68), BETA(69), BETA(70), BETA(71), BETA(72),
+     1     BETA(73), BETA(74), BETA(75), BETA(76), BETA(77), BETA(78),
+     2     BETA(79), BETA(80), BETA(81), BETA(82), BETA(83), BETA(84),
+     3     BETA(85), BETA(86), BETA(87), BETA(88)/
+     4    -1.35744996343269136D-05,    -3.17972413350427135D-05,
+     5    -4.18861861696693365D-05,    -4.69004889379141029D-05,
+     6    -4.87665447413787352D-05,    -4.87010031186735069D-05,
+     7    -4.74755620890086638D-05,    -4.55813058138628452D-05,
+     8    -4.33309644511266036D-05,    -4.09230193157750364D-05,
+     9    -3.84822638603221274D-05,    -3.60857167535410501D-05,
+     A    -3.37793306123367417D-05,    -3.15888560772109621D-05,
+     B    -2.95269561750807315D-05,    -2.75978914828335759D-05,
+     C    -2.58006174666883713D-05,    -2.41308356761280200D-05,
+     D    -2.25823509518346033D-05,    -2.11479656768912971D-05,
+     E    -1.98200638885294927D-05,    -1.85909870801065077D-05/
+      DATA BETA(89), BETA(90), BETA(91), BETA(92), BETA(93), BETA(94),
+     1     BETA(95), BETA(96), BETA(97), BETA(98), BETA(99), BETA(100),
+     2     BETA(101), BETA(102), BETA(103), BETA(104), BETA(105),
+     3     BETA(106), BETA(107), BETA(108), BETA(109), BETA(110)/
+     4    -1.74532699844210224D-05,    -1.63997823854497997D-05,
+     5    -4.74617796559959808D-04,    -4.77864567147321487D-04,
+     6    -3.20390228067037603D-04,    -1.61105016119962282D-04,
+     7    -4.25778101285435204D-05,     3.44571294294967503D-05,
+     8     7.97092684075674924D-05,     1.03138236708272200D-04,
+     9     1.12466775262204158D-04,     1.13103642108481389D-04,
+     A     1.08651634848774268D-04,     1.01437951597661973D-04,
+     B     9.29298396593363896D-05,     8.40293133016089978D-05,
+     C     7.52727991349134062D-05,     6.69632521975730872D-05,
+     D     5.92564547323194704D-05,     5.22169308826975567D-05,
+     E     4.58539485165360646D-05,     4.01445513891486808D-05/
+      DATA BETA(111), BETA(112), BETA(113), BETA(114), BETA(115),
+     1     BETA(116), BETA(117), BETA(118), BETA(119), BETA(120),
+     2     BETA(121), BETA(122), BETA(123), BETA(124), BETA(125),
+     3     BETA(126), BETA(127), BETA(128), BETA(129), BETA(130)/
+     4     3.50481730031328081D-05,     3.05157995034346659D-05,
+     5     2.64956119950516039D-05,     2.29363633690998152D-05,
+     6     1.97893056664021636D-05,     1.70091984636412623D-05,
+     7     1.45547428261524004D-05,     1.23886640995878413D-05,
+     8     1.04775876076583236D-05,     8.79179954978479373D-06,
+     9     7.36465810572578444D-04,     8.72790805146193976D-04,
+     A     6.22614862573135066D-04,     2.85998154194304147D-04,
+     B     3.84737672879366102D-06,    -1.87906003636971558D-04,
+     C    -2.97603646594554535D-04,    -3.45998126832656348D-04,
+     D    -3.53382470916037712D-04,    -3.35715635775048757D-04/
+      DATA BETA(131), BETA(132), BETA(133), BETA(134), BETA(135),
+     1     BETA(136), BETA(137), BETA(138), BETA(139), BETA(140),
+     2     BETA(141), BETA(142), BETA(143), BETA(144), BETA(145),
+     3     BETA(146), BETA(147), BETA(148), BETA(149), BETA(150)/
+     4    -3.04321124789039809D-04,    -2.66722723047612821D-04,
+     5    -2.27654214122819527D-04,    -1.89922611854562356D-04,
+     6    -1.55058918599093870D-04,    -1.23778240761873630D-04,
+     7    -9.62926147717644187D-05,    -7.25178327714425337D-05,
+     8    -5.22070028895633801D-05,    -3.50347750511900522D-05,
+     9    -2.06489761035551757D-05,    -8.70106096849767054D-06,
+     A     1.13698686675100290D-06,     9.16426474122778849D-06,
+     B     1.56477785428872620D-05,     2.08223629482466847D-05,
+     C     2.48923381004595156D-05,     2.80340509574146325D-05,
+     D     3.03987774629861915D-05,     3.21156731406700616D-05/
+      DATA BETA(151), BETA(152), BETA(153), BETA(154), BETA(155),
+     1     BETA(156), BETA(157), BETA(158), BETA(159), BETA(160),
+     2     BETA(161), BETA(162), BETA(163), BETA(164), BETA(165),
+     3     BETA(166), BETA(167), BETA(168), BETA(169), BETA(170)/
+     4    -1.80182191963885708D-03,    -2.43402962938042533D-03,
+     5    -1.83422663549856802D-03,    -7.62204596354009765D-04,
+     6     2.39079475256927218D-04,     9.49266117176881141D-04,
+     7     1.34467449701540359D-03,     1.48457495259449178D-03,
+     8     1.44732339830617591D-03,     1.30268261285657186D-03,
+     9     1.10351597375642682D-03,     8.86047440419791759D-04,
+     A     6.73073208165665473D-04,     4.77603872856582378D-04,
+     B     3.05991926358789362D-04,     1.60315694594721630D-04,
+     C     4.00749555270613286D-05,    -5.66607461635251611D-05,
+     D    -1.32506186772982638D-04,    -1.90296187989614057D-04/
+      DATA BETA(171), BETA(172), BETA(173), BETA(174), BETA(175),
+     1     BETA(176), BETA(177), BETA(178), BETA(179), BETA(180),
+     2     BETA(181), BETA(182), BETA(183), BETA(184), BETA(185),
+     3     BETA(186), BETA(187), BETA(188), BETA(189), BETA(190)/
+     4    -2.32811450376937408D-04,    -2.62628811464668841D-04,
+     5    -2.82050469867598672D-04,    -2.93081563192861167D-04,
+     6    -2.97435962176316616D-04,    -2.96557334239348078D-04,
+     7    -2.91647363312090861D-04,    -2.83696203837734166D-04,
+     8    -2.73512317095673346D-04,    -2.61750155806768580D-04,
+     9     6.38585891212050914D-03,     9.62374215806377941D-03,
+     A     7.61878061207001043D-03,     2.83219055545628054D-03,
+     B    -2.09841352012720090D-03,    -5.73826764216626498D-03,
+     C    -7.70804244495414620D-03,    -8.21011692264844401D-03,
+     D    -7.65824520346905413D-03,    -6.47209729391045177D-03/
+      DATA BETA(191), BETA(192), BETA(193), BETA(194), BETA(195),
+     1     BETA(196), BETA(197), BETA(198), BETA(199), BETA(200),
+     2     BETA(201), BETA(202), BETA(203), BETA(204), BETA(205),
+     3     BETA(206), BETA(207), BETA(208), BETA(209), BETA(210)/
+     4    -4.99132412004966473D-03,    -3.45612289713133280D-03,
+     5    -2.01785580014170775D-03,    -7.59430686781961401D-04,
+     6     2.84173631523859138D-04,     1.10891667586337403D-03,
+     7     1.72901493872728771D-03,     2.16812590802684701D-03,
+     8     2.45357710494539735D-03,     2.61281821058334862D-03,
+     9     2.67141039656276912D-03,     2.65203073395980430D-03,
+     A     2.57411652877287315D-03,     2.45389126236094427D-03,
+     B     2.30460058071795494D-03,     2.13684837686712662D-03,
+     C     1.95896528478870911D-03,     1.77737008679454412D-03,
+     D     1.59690280765839059D-03,     1.42111975664438546D-03/
+      DATA GAMA(1), GAMA(2), GAMA(3), GAMA(4), GAMA(5), GAMA(6),
+     1     GAMA(7), GAMA(8), GAMA(9), GAMA(10), GAMA(11), GAMA(12),
+     2     GAMA(13), GAMA(14), GAMA(15), GAMA(16), GAMA(17), GAMA(18),
+     3     GAMA(19), GAMA(20), GAMA(21), GAMA(22)/
+     4     6.29960524947436582D-01,     2.51984209978974633D-01,
+     5     1.54790300415655846D-01,     1.10713062416159013D-01,
+     6     8.57309395527394825D-02,     6.97161316958684292D-02,
+     7     5.86085671893713576D-02,     5.04698873536310685D-02,
+     8     4.42600580689154809D-02,     3.93720661543509966D-02,
+     9     3.54283195924455368D-02,     3.21818857502098231D-02,
+     A     2.94646240791157679D-02,     2.71581677112934479D-02,
+     B     2.51768272973861779D-02,     2.34570755306078891D-02,
+     C     2.19508390134907203D-02,     2.06210828235646240D-02,
+     D     1.94388240897880846D-02,     1.83810633800683158D-02,
+     E     1.74293213231963172D-02,     1.65685837786612353D-02/
+      DATA GAMA(23), GAMA(24), GAMA(25), GAMA(26), GAMA(27), GAMA(28),
+     1     GAMA(29), GAMA(30)/
+     2     1.57865285987918445D-02,     1.50729501494095594D-02,
+     3     1.44193250839954639D-02,     1.38184805735341786D-02,
+     4     1.32643378994276568D-02,     1.27517121970498651D-02,
+     5     1.22761545318762767D-02,     1.18338262398482403D-02/
+      DATA EX1, EX2, HPI, GPI, THPI /
+     1     3.33333333333333333D-01,     6.66666666666666667D-01,
+     2     1.57079632679489662D+00,     3.14159265358979324D+00,
+     3     4.71238898038468986D+00/
+      DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
+C
+      RFNU = 1.0D0/FNU
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST (Z/FNU TOO SMALL)
+C-----------------------------------------------------------------------
+      TEST = D1MACH(1)*1.0D+3
+      AC = FNU*TEST
+      IF (DABS(ZR).GT.AC .OR. DABS(ZI).GT.AC) GO TO 15
+      ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
+      ZETA1I = 0.0D0
+      ZETA2R = FNU
+      ZETA2I = 0.0D0
+      PHIR = 1.0D0
+      PHII = 0.0D0
+      ARGR = 1.0D0
+      ARGI = 0.0D0
+      RETURN
+   15 CONTINUE
+      ZBR = ZR*RFNU
+      ZBI = ZI*RFNU
+      RFNU2 = RFNU*RFNU
+C-----------------------------------------------------------------------
+C     COMPUTE IN THE FOURTH QUADRANT
+C-----------------------------------------------------------------------
+      FN13 = FNU**EX1
+      FN23 = FN13*FN13
+      RFN13 = 1.0D0/FN13
+      W2R = CONER - ZBR*ZBR + ZBI*ZBI
+      W2I = CONEI - ZBR*ZBI - ZBR*ZBI
+      AW2 = XZABS(W2R,W2I)
+      IF (AW2.GT.0.25D0) GO TO 130
+C-----------------------------------------------------------------------
+C     POWER SERIES FOR CABS(W2).LE.0.25D0
+C-----------------------------------------------------------------------
+      K = 1
+      PR(1) = CONER
+      PI(1) = CONEI
+      SUMAR = GAMA(1)
+      SUMAI = ZEROI
+      AP(1) = 1.0D0
+      IF (AW2.LT.TOL) GO TO 20
+      DO 10 K=2,30
+        PR(K) = PR(K-1)*W2R - PI(K-1)*W2I
+        PI(K) = PR(K-1)*W2I + PI(K-1)*W2R
+        SUMAR = SUMAR + PR(K)*GAMA(K)
+        SUMAI = SUMAI + PI(K)*GAMA(K)
+        AP(K) = AP(K-1)*AW2
+        IF (AP(K).LT.TOL) GO TO 20
+   10 CONTINUE
+      K = 30
+   20 CONTINUE
+      KMAX = K
+      ZETAR = W2R*SUMAR - W2I*SUMAI
+      ZETAI = W2R*SUMAI + W2I*SUMAR
+      ARGR = ZETAR*FN23
+      ARGI = ZETAI*FN23
+      CALL XZSQRT(SUMAR, SUMAI, ZAR, ZAI)
+      CALL XZSQRT(W2R, W2I, STR, STI)
+      ZETA2R = STR*FNU
+      ZETA2I = STI*FNU
+      STR = CONER + EX2*(ZETAR*ZAR-ZETAI*ZAI)
+      STI = CONEI + EX2*(ZETAR*ZAI+ZETAI*ZAR)
+      ZETA1R = STR*ZETA2R - STI*ZETA2I
+      ZETA1I = STR*ZETA2I + STI*ZETA2R
+      ZAR = ZAR + ZAR
+      ZAI = ZAI + ZAI
+      CALL XZSQRT(ZAR, ZAI, STR, STI)
+      PHIR = STR*RFN13
+      PHII = STI*RFN13
+      IF (IPMTR.EQ.1) GO TO 120
+C-----------------------------------------------------------------------
+C     SUM SERIES FOR ASUM AND BSUM
+C-----------------------------------------------------------------------
+      SUMBR = ZEROR
+      SUMBI = ZEROI
+      DO 30 K=1,KMAX
+        SUMBR = SUMBR + PR(K)*BETA(K)
+        SUMBI = SUMBI + PI(K)*BETA(K)
+   30 CONTINUE
+      ASUMR = ZEROR
+      ASUMI = ZEROI
+      BSUMR = SUMBR
+      BSUMI = SUMBI
+      L1 = 0
+      L2 = 30
+      BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
+      ATOL = TOL
+      PP = 1.0D0
+      IAS = 0
+      IBS = 0
+      IF (RFNU2.LT.TOL) GO TO 110
+      DO 100 IS=2,7
+        ATOL = ATOL/RFNU2
+        PP = PP*RFNU2
+        IF (IAS.EQ.1) GO TO 60
+        SUMAR = ZEROR
+        SUMAI = ZEROI
+        DO 40 K=1,KMAX
+          M = L1 + K
+          SUMAR = SUMAR + PR(K)*ALFA(M)
+          SUMAI = SUMAI + PI(K)*ALFA(M)
+          IF (AP(K).LT.ATOL) GO TO 50
+   40   CONTINUE
+   50   CONTINUE
+        ASUMR = ASUMR + SUMAR*PP
+        ASUMI = ASUMI + SUMAI*PP
+        IF (PP.LT.TOL) IAS = 1
+   60   CONTINUE
+        IF (IBS.EQ.1) GO TO 90
+        SUMBR = ZEROR
+        SUMBI = ZEROI
+        DO 70 K=1,KMAX
+          M = L2 + K
+          SUMBR = SUMBR + PR(K)*BETA(M)
+          SUMBI = SUMBI + PI(K)*BETA(M)
+          IF (AP(K).LT.ATOL) GO TO 80
+   70   CONTINUE
+   80   CONTINUE
+        BSUMR = BSUMR + SUMBR*PP
+        BSUMI = BSUMI + SUMBI*PP
+        IF (PP.LT.BTOL) IBS = 1
+   90   CONTINUE
+        IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 110
+        L1 = L1 + 30
+        L2 = L2 + 30
+  100 CONTINUE
+  110 CONTINUE
+      ASUMR = ASUMR + CONER
+      PP = RFNU*RFN13
+      BSUMR = BSUMR*PP
+      BSUMI = BSUMI*PP
+  120 CONTINUE
+      RETURN
+C-----------------------------------------------------------------------
+C     CABS(W2).GT.0.25D0
+C-----------------------------------------------------------------------
+  130 CONTINUE
+      CALL XZSQRT(W2R, W2I, WR, WI)
+      IF (WR.LT.0.0D0) WR = 0.0D0
+      IF (WI.LT.0.0D0) WI = 0.0D0
+      STR = CONER + WR
+      STI = WI
+      CALL ZDIV(STR, STI, ZBR, ZBI, ZAR, ZAI)
+      CALL XZLOG(ZAR, ZAI, ZCR, ZCI, IDUM)
+      IF (ZCI.LT.0.0D0) ZCI = 0.0D0
+      IF (ZCI.GT.HPI) ZCI = HPI
+      IF (ZCR.LT.0.0D0) ZCR = 0.0D0
+      ZTHR = (ZCR-WR)*1.5D0
+      ZTHI = (ZCI-WI)*1.5D0
+      ZETA1R = ZCR*FNU
+      ZETA1I = ZCI*FNU
+      ZETA2R = WR*FNU
+      ZETA2I = WI*FNU
+      AZTH = XZABS(ZTHR,ZTHI)
+      ANG = THPI
+      IF (ZTHR.GE.0.0D0 .AND. ZTHI.LT.0.0D0) GO TO 140
+      ANG = HPI
+      IF (ZTHR.EQ.0.0D0) GO TO 140
+      ANG = DATAN(ZTHI/ZTHR)
+      IF (ZTHR.LT.0.0D0) ANG = ANG + GPI
+  140 CONTINUE
+      PP = AZTH**EX2
+      ANG = ANG*EX2
+      ZETAR = PP*DCOS(ANG)
+      ZETAI = PP*DSIN(ANG)
+      IF (ZETAI.LT.0.0D0) ZETAI = 0.0D0
+      ARGR = ZETAR*FN23
+      ARGI = ZETAI*FN23
+      CALL ZDIV(ZTHR, ZTHI, ZETAR, ZETAI, RTZTR, RTZTI)
+      CALL ZDIV(RTZTR, RTZTI, WR, WI, ZAR, ZAI)
+      TZAR = ZAR + ZAR
+      TZAI = ZAI + ZAI
+      CALL XZSQRT(TZAR, TZAI, STR, STI)
+      PHIR = STR*RFN13
+      PHII = STI*RFN13
+      IF (IPMTR.EQ.1) GO TO 120
+      RAW = 1.0D0/DSQRT(AW2)
+      STR = WR*RAW
+      STI = -WI*RAW
+      TFNR = STR*RFNU*RAW
+      TFNI = STI*RFNU*RAW
+      RAZTH = 1.0D0/AZTH
+      STR = ZTHR*RAZTH
+      STI = -ZTHI*RAZTH
+      RZTHR = STR*RAZTH*RFNU
+      RZTHI = STI*RAZTH*RFNU
+      ZCR = RZTHR*AR(2)
+      ZCI = RZTHI*AR(2)
+      RAW2 = 1.0D0/AW2
+      STR = W2R*RAW2
+      STI = -W2I*RAW2
+      T2R = STR*RAW2
+      T2I = STI*RAW2
+      STR = T2R*C(2) + C(3)
+      STI = T2I*C(2)
+      UPR(2) = STR*TFNR - STI*TFNI
+      UPI(2) = STR*TFNI + STI*TFNR
+      BSUMR = UPR(2) + ZCR
+      BSUMI = UPI(2) + ZCI
+      ASUMR = ZEROR
+      ASUMI = ZEROI
+      IF (RFNU.LT.TOL) GO TO 220
+      PRZTHR = RZTHR
+      PRZTHI = RZTHI
+      PTFNR = TFNR
+      PTFNI = TFNI
+      UPR(1) = CONER
+      UPI(1) = CONEI
+      PP = 1.0D0
+      BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
+      KS = 0
+      KP1 = 2
+      L = 3
+      IAS = 0
+      IBS = 0
+      DO 210 LR=2,12,2
+        LRP1 = LR + 1
+C-----------------------------------------------------------------------
+C     COMPUTE TWO ADDITIONAL CR, DR, AND UP FOR TWO MORE TERMS IN
+C     NEXT SUMA AND SUMB
+C-----------------------------------------------------------------------
+        DO 160 K=LR,LRP1
+          KS = KS + 1
+          KP1 = KP1 + 1
+          L = L + 1
+          ZAR = C(L)
+          ZAI = ZEROI
+          DO 150 J=2,KP1
+            L = L + 1
+            STR = ZAR*T2R - T2I*ZAI + C(L)
+            ZAI = ZAR*T2I + ZAI*T2R
+            ZAR = STR
+  150     CONTINUE
+          STR = PTFNR*TFNR - PTFNI*TFNI
+          PTFNI = PTFNR*TFNI + PTFNI*TFNR
+          PTFNR = STR
+          UPR(KP1) = PTFNR*ZAR - PTFNI*ZAI
+          UPI(KP1) = PTFNI*ZAR + PTFNR*ZAI
+          CRR(KS) = PRZTHR*BR(KS+1)
+          CRI(KS) = PRZTHI*BR(KS+1)
+          STR = PRZTHR*RZTHR - PRZTHI*RZTHI
+          PRZTHI = PRZTHR*RZTHI + PRZTHI*RZTHR
+          PRZTHR = STR
+          DRR(KS) = PRZTHR*AR(KS+2)
+          DRI(KS) = PRZTHI*AR(KS+2)
+  160   CONTINUE
+        PP = PP*RFNU2
+        IF (IAS.EQ.1) GO TO 180
+        SUMAR = UPR(LRP1)
+        SUMAI = UPI(LRP1)
+        JU = LRP1
+        DO 170 JR=1,LR
+          JU = JU - 1
+          SUMAR = SUMAR + CRR(JR)*UPR(JU) - CRI(JR)*UPI(JU)
+          SUMAI = SUMAI + CRR(JR)*UPI(JU) + CRI(JR)*UPR(JU)
+  170   CONTINUE
+        ASUMR = ASUMR + SUMAR
+        ASUMI = ASUMI + SUMAI
+        TEST = DABS(SUMAR) + DABS(SUMAI)
+        IF (PP.LT.TOL .AND. TEST.LT.TOL) IAS = 1
+  180   CONTINUE
+        IF (IBS.EQ.1) GO TO 200
+        SUMBR = UPR(LR+2) + UPR(LRP1)*ZCR - UPI(LRP1)*ZCI
+        SUMBI = UPI(LR+2) + UPR(LRP1)*ZCI + UPI(LRP1)*ZCR
+        JU = LRP1
+        DO 190 JR=1,LR
+          JU = JU - 1
+          SUMBR = SUMBR + DRR(JR)*UPR(JU) - DRI(JR)*UPI(JU)
+          SUMBI = SUMBI + DRR(JR)*UPI(JU) + DRI(JR)*UPR(JU)
+  190   CONTINUE
+        BSUMR = BSUMR + SUMBR
+        BSUMI = BSUMI + SUMBI
+        TEST = DABS(SUMBR) + DABS(SUMBI)
+        IF (PP.LT.BTOL .AND. TEST.LT.BTOL) IBS = 1
+  200   CONTINUE
+        IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 220
+  210 CONTINUE
+  220 CONTINUE
+      ASUMR = ASUMR + CONER
+      STR = -BSUMR*RFN13
+      STI = -BSUMI*RFN13
+      CALL ZDIV(STR, STI, RTZTR, RTZTI, BSUMR, BSUMI)
+      GO TO 120
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zuni1.f
@@ -0,0 +1,204 @@
+      SUBROUTINE ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL,
+     * TOL, ELIM, ALIM)
+C***BEGIN PROLOGUE  ZUNI1
+C***REFER TO  ZBESI,ZBESK
+C
+C     ZUNI1 COMPUTES I(FNU,Z)  BY MEANS OF THE UNIFORM ASYMPTOTIC
+C     EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.
+C
+C     FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
+C     EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
+C     NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
+C     FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
+C     Y(I)=CZERO FOR I=NLAST+1,N
+C
+C***ROUTINES CALLED  ZUCHK,ZUNIK,ZUOIK,D1MACH,XZABS
+C***END PROLOGUE  ZUNI1
+C     COMPLEX CFN,CONE,CRSC,CSCL,CSR,CSS,CWRK,CZERO,C1,C2,PHI,RZ,SUM,S1,
+C    *S2,Y,Z,ZETA1,ZETA2
+      DOUBLE PRECISION ALIM, APHI, ASCLE, BRY, CONER, CRSC,
+     * CSCL, CSRR, CSSR, CWRKI, CWRKR, C1R, C2I, C2M, C2R, ELIM, FN,
+     * FNU, FNUL, PHII, PHIR, RAST, RS1, RZI, RZR, STI, STR, SUMI,
+     * SUMR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I,
+     * ZETA1R, ZETA2I, ZETA2R, ZI, ZR, CYR, CYI, D1MACH, XZABS
+      INTEGER I, IFLAG, INIT, K, KODE, M, N, ND, NLAST, NN, NUF, NW, NZ
+      DIMENSION BRY(3), YR(N), YI(N), CWRKR(16), CWRKI(16), CSSR(3),
+     * CSRR(3), CYR(2), CYI(2)
+      DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
+C
+      NZ = 0
+      ND = N
+      NLAST = 0
+C-----------------------------------------------------------------------
+C     COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
+C     NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
+C     EXP(ALIM)=EXP(ELIM)*TOL
+C-----------------------------------------------------------------------
+      CSCL = 1.0D0/TOL
+      CRSC = TOL
+      CSSR(1) = CSCL
+      CSSR(2) = CONER
+      CSSR(3) = CRSC
+      CSRR(1) = CRSC
+      CSRR(2) = CONER
+      CSRR(3) = CSCL
+      BRY(1) = 1.0D+3*D1MACH(1)/TOL
+C-----------------------------------------------------------------------
+C     CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
+C-----------------------------------------------------------------------
+      FN = DMAX1(FNU,1.0D0)
+      INIT = 0
+      CALL ZUNIK(ZR, ZI, FN, 1, 1, TOL, INIT, PHIR, PHII, ZETA1R,
+     * ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
+      IF (KODE.EQ.1) GO TO 10
+      STR = ZR + ZETA2R
+      STI = ZI + ZETA2I
+      RAST = FN/XZABS(STR,STI)
+      STR = STR*RAST*RAST
+      STI = -STI*RAST*RAST
+      S1R = -ZETA1R + STR
+      S1I = -ZETA1I + STI
+      GO TO 20
+   10 CONTINUE
+      S1R = -ZETA1R + ZETA2R
+      S1I = -ZETA1I + ZETA2I
+   20 CONTINUE
+      RS1 = S1R
+      IF (DABS(RS1).GT.ELIM) GO TO 130
+   30 CONTINUE
+      NN = MIN0(2,ND)
+      DO 80 I=1,NN
+        FN = FNU + DBLE(FLOAT(ND-I))
+        INIT = 0
+        CALL ZUNIK(ZR, ZI, FN, 1, 0, TOL, INIT, PHIR, PHII, ZETA1R,
+     *   ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
+        IF (KODE.EQ.1) GO TO 40
+        STR = ZR + ZETA2R
+        STI = ZI + ZETA2I
+        RAST = FN/XZABS(STR,STI)
+        STR = STR*RAST*RAST
+        STI = -STI*RAST*RAST
+        S1R = -ZETA1R + STR
+        S1I = -ZETA1I + STI + ZI
+        GO TO 50
+   40   CONTINUE
+        S1R = -ZETA1R + ZETA2R
+        S1I = -ZETA1I + ZETA2I
+   50   CONTINUE
+C-----------------------------------------------------------------------
+C     TEST FOR UNDERFLOW AND OVERFLOW
+C-----------------------------------------------------------------------
+        RS1 = S1R
+        IF (DABS(RS1).GT.ELIM) GO TO 110
+        IF (I.EQ.1) IFLAG = 2
+        IF (DABS(RS1).LT.ALIM) GO TO 60
+C-----------------------------------------------------------------------
+C     REFINE  TEST AND SCALE
+C-----------------------------------------------------------------------
+        APHI = XZABS(PHIR,PHII)
+        RS1 = RS1 + DLOG(APHI)
+        IF (DABS(RS1).GT.ELIM) GO TO 110
+        IF (I.EQ.1) IFLAG = 1
+        IF (RS1.LT.0.0D0) GO TO 60
+        IF (I.EQ.1) IFLAG = 3
+   60   CONTINUE
+C-----------------------------------------------------------------------
+C     SCALE S1 IF CABS(S1).LT.ASCLE
+C-----------------------------------------------------------------------
+        S2R = PHIR*SUMR - PHII*SUMI
+        S2I = PHIR*SUMI + PHII*SUMR
+        STR = DEXP(S1R)*CSSR(IFLAG)
+        S1R = STR*DCOS(S1I)
+        S1I = STR*DSIN(S1I)
+        STR = S2R*S1R - S2I*S1I
+        S2I = S2R*S1I + S2I*S1R
+        S2R = STR
+        IF (IFLAG.NE.1) GO TO 70
+        CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
+        IF (NW.NE.0) GO TO 110
+   70   CONTINUE
+        CYR(I) = S2R
+        CYI(I) = S2I
+        M = ND - I + 1
+        YR(M) = S2R*CSRR(IFLAG)
+        YI(M) = S2I*CSRR(IFLAG)
+   80 CONTINUE
+      IF (ND.LE.2) GO TO 100
+      RAST = 1.0D0/XZABS(ZR,ZI)
+      STR = ZR*RAST
+      STI = -ZI*RAST
+      RZR = (STR+STR)*RAST
+      RZI = (STI+STI)*RAST
+      BRY(2) = 1.0D0/BRY(1)
+      BRY(3) = D1MACH(2)
+      S1R = CYR(1)
+      S1I = CYI(1)
+      S2R = CYR(2)
+      S2I = CYI(2)
+      C1R = CSRR(IFLAG)
+      ASCLE = BRY(IFLAG)
+      K = ND - 2
+      FN = DBLE(FLOAT(K))
+      DO 90 I=3,ND
+        C2R = S2R
+        C2I = S2I
+        S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
+        S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
+        S1R = C2R
+        S1I = C2I
+        C2R = S2R*C1R
+        C2I = S2I*C1R
+        YR(K) = C2R
+        YI(K) = C2I
+        K = K - 1
+        FN = FN - 1.0D0
+        IF (IFLAG.GE.3) GO TO 90
+        STR = DABS(C2R)
+        STI = DABS(C2I)
+        C2M = DMAX1(STR,STI)
+        IF (C2M.LE.ASCLE) GO TO 90
+        IFLAG = IFLAG + 1
+        ASCLE = BRY(IFLAG)
+        S1R = S1R*C1R
+        S1I = S1I*C1R
+        S2R = C2R
+        S2I = C2I
+        S1R = S1R*CSSR(IFLAG)
+        S1I = S1I*CSSR(IFLAG)
+        S2R = S2R*CSSR(IFLAG)
+        S2I = S2I*CSSR(IFLAG)
+        C1R = CSRR(IFLAG)
+   90 CONTINUE
+  100 CONTINUE
+      RETURN
+C-----------------------------------------------------------------------
+C     SET UNDERFLOW AND UPDATE PARAMETERS
+C-----------------------------------------------------------------------
+  110 CONTINUE
+      IF (RS1.GT.0.0D0) GO TO 120
+      YR(ND) = ZEROR
+      YI(ND) = ZEROI
+      NZ = NZ + 1
+      ND = ND - 1
+      IF (ND.EQ.0) GO TO 100
+      CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
+      IF (NUF.LT.0) GO TO 120
+      ND = ND - NUF
+      NZ = NZ + NUF
+      IF (ND.EQ.0) GO TO 100
+      FN = FNU + DBLE(FLOAT(ND-1))
+      IF (FN.GE.FNUL) GO TO 30
+      NLAST = ND
+      RETURN
+  120 CONTINUE
+      NZ = -1
+      RETURN
+  130 CONTINUE
+      IF (RS1.GT.0.0D0) GO TO 120
+      NZ = N
+      DO 140 I=1,N
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+  140 CONTINUE
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zuni2.f
@@ -0,0 +1,267 @@
+      SUBROUTINE ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL,
+     * TOL, ELIM, ALIM)
+C***BEGIN PROLOGUE  ZUNI2
+C***REFER TO  ZBESI,ZBESK
+C
+C     ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF
+C     UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I
+C     OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.
+C
+C     FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
+C     EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
+C     NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
+C     FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
+C     Y(I)=CZERO FOR I=NLAST+1,N
+C
+C***ROUTINES CALLED  ZAIRY,ZUCHK,ZUNHJ,ZUOIK,D1MACH,XZABS
+C***END PROLOGUE  ZUNI2
+C     COMPLEX AI,ARG,ASUM,BSUM,CFN,CI,CID,CIP,CONE,CRSC,CSCL,CSR,CSS,
+C    *CZERO,C1,C2,DAI,PHI,RZ,S1,S2,Y,Z,ZB,ZETA1,ZETA2,ZN
+      DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGI,
+     * ARGR, ASCLE, ASUMI, ASUMR, BRY, BSUMI, BSUMR, CIDI, CIPI, CIPR,
+     * CONER, CRSC, CSCL, CSRR, CSSR, C1R, C2I, C2M, C2R, DAII,
+     * DAIR, ELIM, FN, FNU, FNUL, HPI, PHII, PHIR, RAST, RAZ, RS1, RZI,
+     * RZR, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZBI, ZBR, ZEROI,
+     * ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI, ZNI, ZNR, ZR, CYR,
+     * CYI, D1MACH, XZABS, CAR, SAR
+      INTEGER I, IFLAG, IN, INU, J, K, KODE, N, NAI, ND, NDAI, NLAST,
+     * NN, NUF, NW, NZ, IDUM
+      DIMENSION BRY(3), YR(N), YI(N), CIPR(4), CIPI(4), CSSR(3),
+     * CSRR(3), CYR(2), CYI(2)
+      DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
+      DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4),
+     * CIPI(4)/ 1.0D0,0.0D0, 0.0D0,1.0D0, -1.0D0,0.0D0, 0.0D0,-1.0D0/
+      DATA HPI, AIC  /
+     1      1.57079632679489662D+00,     1.265512123484645396D+00/
+C
+      NZ = 0
+      ND = N
+      NLAST = 0
+C-----------------------------------------------------------------------
+C     COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
+C     NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
+C     EXP(ALIM)=EXP(ELIM)*TOL
+C-----------------------------------------------------------------------
+      CSCL = 1.0D0/TOL
+      CRSC = TOL
+      CSSR(1) = CSCL
+      CSSR(2) = CONER
+      CSSR(3) = CRSC
+      CSRR(1) = CRSC
+      CSRR(2) = CONER
+      CSRR(3) = CSCL
+      BRY(1) = 1.0D+3*D1MACH(1)/TOL
+C-----------------------------------------------------------------------
+C     ZN IS IN THE RIGHT HALF PLANE AFTER ROTATION BY CI OR -CI
+C-----------------------------------------------------------------------
+      ZNR = ZI
+      ZNI = -ZR
+      ZBR = ZR
+      ZBI = ZI
+      CIDI = -CONER
+      INU = INT(SNGL(FNU))
+      ANG = HPI*(FNU-DBLE(FLOAT(INU)))
+      C2R = DCOS(ANG)
+      C2I = DSIN(ANG)
+      CAR = C2R
+      SAR = C2I
+      IN = INU + N - 1
+      IN = MOD(IN,4) + 1
+      STR = C2R*CIPR(IN) - C2I*CIPI(IN)
+      C2I = C2R*CIPI(IN) + C2I*CIPR(IN)
+      C2R = STR
+      IF (ZI.GT.0.0D0) GO TO 10
+      ZNR = -ZNR
+      ZBI = -ZBI
+      CIDI = -CIDI
+      C2I = -C2I
+   10 CONTINUE
+C-----------------------------------------------------------------------
+C     CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
+C-----------------------------------------------------------------------
+      FN = DMAX1(FNU,1.0D0)
+      CALL ZUNHJ(ZNR, ZNI, FN, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R,
+     * ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
+      IF (KODE.EQ.1) GO TO 20
+      STR = ZBR + ZETA2R
+      STI = ZBI + ZETA2I
+      RAST = FN/XZABS(STR,STI)
+      STR = STR*RAST*RAST
+      STI = -STI*RAST*RAST
+      S1R = -ZETA1R + STR
+      S1I = -ZETA1I + STI
+      GO TO 30
+   20 CONTINUE
+      S1R = -ZETA1R + ZETA2R
+      S1I = -ZETA1I + ZETA2I
+   30 CONTINUE
+      RS1 = S1R
+      IF (DABS(RS1).GT.ELIM) GO TO 150
+   40 CONTINUE
+      NN = MIN0(2,ND)
+      DO 90 I=1,NN
+        FN = FNU + DBLE(FLOAT(ND-I))
+        CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR, PHII, ARGR, ARGI,
+     *   ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
+        IF (KODE.EQ.1) GO TO 50
+        STR = ZBR + ZETA2R
+        STI = ZBI + ZETA2I
+        RAST = FN/XZABS(STR,STI)
+        STR = STR*RAST*RAST
+        STI = -STI*RAST*RAST
+        S1R = -ZETA1R + STR
+        S1I = -ZETA1I + STI + DABS(ZI)
+        GO TO 60
+   50   CONTINUE
+        S1R = -ZETA1R + ZETA2R
+        S1I = -ZETA1I + ZETA2I
+   60   CONTINUE
+C-----------------------------------------------------------------------
+C     TEST FOR UNDERFLOW AND OVERFLOW
+C-----------------------------------------------------------------------
+        RS1 = S1R
+        IF (DABS(RS1).GT.ELIM) GO TO 120
+        IF (I.EQ.1) IFLAG = 2
+        IF (DABS(RS1).LT.ALIM) GO TO 70
+C-----------------------------------------------------------------------
+C     REFINE  TEST AND SCALE
+C-----------------------------------------------------------------------
+C-----------------------------------------------------------------------
+        APHI = XZABS(PHIR,PHII)
+        AARG = XZABS(ARGR,ARGI)
+        RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
+        IF (DABS(RS1).GT.ELIM) GO TO 120
+        IF (I.EQ.1) IFLAG = 1
+        IF (RS1.LT.0.0D0) GO TO 70
+        IF (I.EQ.1) IFLAG = 3
+   70   CONTINUE
+C-----------------------------------------------------------------------
+C     SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
+C     EXPONENT EXTREMES
+C-----------------------------------------------------------------------
+        CALL ZAIRY(ARGR, ARGI, 0, 2, AIR, AII, NAI, IDUM)
+        CALL ZAIRY(ARGR, ARGI, 1, 2, DAIR, DAII, NDAI, IDUM)
+        STR = DAIR*BSUMR - DAII*BSUMI
+        STI = DAIR*BSUMI + DAII*BSUMR
+        STR = STR + (AIR*ASUMR-AII*ASUMI)
+        STI = STI + (AIR*ASUMI+AII*ASUMR)
+        S2R = PHIR*STR - PHII*STI
+        S2I = PHIR*STI + PHII*STR
+        STR = DEXP(S1R)*CSSR(IFLAG)
+        S1R = STR*DCOS(S1I)
+        S1I = STR*DSIN(S1I)
+        STR = S2R*S1R - S2I*S1I
+        S2I = S2R*S1I + S2I*S1R
+        S2R = STR
+        IF (IFLAG.NE.1) GO TO 80
+        CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
+        IF (NW.NE.0) GO TO 120
+   80   CONTINUE
+        IF (ZI.LE.0.0D0) S2I = -S2I
+        STR = S2R*C2R - S2I*C2I
+        S2I = S2R*C2I + S2I*C2R
+        S2R = STR
+        CYR(I) = S2R
+        CYI(I) = S2I
+        J = ND - I + 1
+        YR(J) = S2R*CSRR(IFLAG)
+        YI(J) = S2I*CSRR(IFLAG)
+        STR = -C2I*CIDI
+        C2I = C2R*CIDI
+        C2R = STR
+   90 CONTINUE
+      IF (ND.LE.2) GO TO 110
+      RAZ = 1.0D0/XZABS(ZR,ZI)
+      STR = ZR*RAZ
+      STI = -ZI*RAZ
+      RZR = (STR+STR)*RAZ
+      RZI = (STI+STI)*RAZ
+      BRY(2) = 1.0D0/BRY(1)
+      BRY(3) = D1MACH(2)
+      S1R = CYR(1)
+      S1I = CYI(1)
+      S2R = CYR(2)
+      S2I = CYI(2)
+      C1R = CSRR(IFLAG)
+      ASCLE = BRY(IFLAG)
+      K = ND - 2
+      FN = DBLE(FLOAT(K))
+      DO 100 I=3,ND
+        C2R = S2R
+        C2I = S2I
+        S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
+        S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
+        S1R = C2R
+        S1I = C2I
+        C2R = S2R*C1R
+        C2I = S2I*C1R
+        YR(K) = C2R
+        YI(K) = C2I
+        K = K - 1
+        FN = FN - 1.0D0
+        IF (IFLAG.GE.3) GO TO 100
+        STR = DABS(C2R)
+        STI = DABS(C2I)
+        C2M = DMAX1(STR,STI)
+        IF (C2M.LE.ASCLE) GO TO 100
+        IFLAG = IFLAG + 1
+        ASCLE = BRY(IFLAG)
+        S1R = S1R*C1R
+        S1I = S1I*C1R
+        S2R = C2R
+        S2I = C2I
+        S1R = S1R*CSSR(IFLAG)
+        S1I = S1I*CSSR(IFLAG)
+        S2R = S2R*CSSR(IFLAG)
+        S2I = S2I*CSSR(IFLAG)
+        C1R = CSRR(IFLAG)
+  100 CONTINUE
+  110 CONTINUE
+      RETURN
+  120 CONTINUE
+      IF (RS1.GT.0.0D0) GO TO 140
+C-----------------------------------------------------------------------
+C     SET UNDERFLOW AND UPDATE PARAMETERS
+C-----------------------------------------------------------------------
+      YR(ND) = ZEROR
+      YI(ND) = ZEROI
+      NZ = NZ + 1
+      ND = ND - 1
+      IF (ND.EQ.0) GO TO 110
+      CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
+      IF (NUF.LT.0) GO TO 140
+      ND = ND - NUF
+      NZ = NZ + NUF
+      IF (ND.EQ.0) GO TO 110
+      FN = FNU + DBLE(FLOAT(ND-1))
+      IF (FN.LT.FNUL) GO TO 130
+C      FN = CIDI
+C      J = NUF + 1
+C      K = MOD(J,4) + 1
+C      S1R = CIPR(K)
+C      S1I = CIPI(K)
+C      IF (FN.LT.0.0D0) S1I = -S1I
+C      STR = C2R*S1R - C2I*S1I
+C      C2I = C2R*S1I + C2I*S1R
+C      C2R = STR
+      IN = INU + ND - 1
+      IN = MOD(IN,4) + 1
+      C2R = CAR*CIPR(IN) - SAR*CIPI(IN)
+      C2I = CAR*CIPI(IN) + SAR*CIPR(IN)
+      IF (ZI.LE.0.0D0) C2I = -C2I
+      GO TO 40
+  130 CONTINUE
+      NLAST = ND
+      RETURN
+  140 CONTINUE
+      NZ = -1
+      RETURN
+  150 CONTINUE
+      IF (RS1.GT.0.0D0) GO TO 140
+      NZ = N
+      DO 160 I=1,N
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+  160 CONTINUE
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zunik.f
@@ -0,0 +1,211 @@
+      SUBROUTINE ZUNIK(ZRR, ZRI, FNU, IKFLG, IPMTR, TOL, INIT, PHIR,
+     * PHII, ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
+C***BEGIN PROLOGUE  ZUNIK
+C***REFER TO  ZBESI,ZBESK
+C
+C        ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC
+C        EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2
+C        RESPECTIVELY BY
+C
+C        W(FNU,ZR) = PHI*EXP(ZETA)*SUM
+C
+C        WHERE       ZETA=-ZETA1 + ZETA2       OR
+C                          ZETA1 - ZETA2
+C
+C        THE FIRST CALL MUST HAVE INIT=0. SUBSEQUENT CALLS WITH THE
+C        SAME ZR AND FNU WILL RETURN THE I OR K FUNCTION ON IKFLG=
+C        1 OR 2 WITH NO CHANGE IN INIT. CWRK IS A COMPLEX WORK
+C        ARRAY. IPMTR=0 COMPUTES ALL PARAMETERS. IPMTR=1 COMPUTES PHI,
+C        ZETA1,ZETA2.
+C
+C***ROUTINES CALLED  ZDIV,XZLOG,XZSQRT,D1MACH
+C***END PROLOGUE  ZUNIK
+C     COMPLEX CFN,CON,CONE,CRFN,CWRK,CZERO,PHI,S,SR,SUM,T,T2,ZETA1,
+C    *ZETA2,ZN,ZR
+      DOUBLE PRECISION AC, C, CON, CONEI, CONER, CRFNI, CRFNR, CWRKI,
+     * CWRKR, FNU, PHII, PHIR, RFN, SI, SR, SRI, SRR, STI, STR, SUMI,
+     * SUMR, TEST, TI, TOL, TR, T2I, T2R, ZEROI, ZEROR, ZETA1I, ZETA1R,
+     * ZETA2I, ZETA2R, ZNI, ZNR, ZRI, ZRR, D1MACH
+      INTEGER I, IDUM, IKFLG, INIT, IPMTR, J, K, L
+      DIMENSION C(120), CWRKR(16), CWRKI(16), CON(2)
+      DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
+      DATA CON(1), CON(2)  /
+     1 3.98942280401432678D-01,  1.25331413731550025D+00 /
+      DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10),
+     1     C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18),
+     2     C(19), C(20), C(21), C(22), C(23), C(24)/
+     3     1.00000000000000000D+00,    -2.08333333333333333D-01,
+     4     1.25000000000000000D-01,     3.34201388888888889D-01,
+     5    -4.01041666666666667D-01,     7.03125000000000000D-02,
+     6    -1.02581259645061728D+00,     1.84646267361111111D+00,
+     7    -8.91210937500000000D-01,     7.32421875000000000D-02,
+     8     4.66958442342624743D+00,    -1.12070026162229938D+01,
+     9     8.78912353515625000D+00,    -2.36408691406250000D+00,
+     A     1.12152099609375000D-01,    -2.82120725582002449D+01,
+     B     8.46362176746007346D+01,    -9.18182415432400174D+01,
+     C     4.25349987453884549D+01,    -7.36879435947963170D+00,
+     D     2.27108001708984375D-01,     2.12570130039217123D+02,
+     E    -7.65252468141181642D+02,     1.05999045252799988D+03/
+      DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32),
+     1     C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40),
+     2     C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/
+     3    -6.99579627376132541D+02,     2.18190511744211590D+02,
+     4    -2.64914304869515555D+01,     5.72501420974731445D-01,
+     5    -1.91945766231840700D+03,     8.06172218173730938D+03,
+     6    -1.35865500064341374D+04,     1.16553933368645332D+04,
+     7    -5.30564697861340311D+03,     1.20090291321635246D+03,
+     8    -1.08090919788394656D+02,     1.72772750258445740D+00,
+     9     2.02042913309661486D+04,    -9.69805983886375135D+04,
+     A     1.92547001232531532D+05,    -2.03400177280415534D+05,
+     B     1.22200464983017460D+05,    -4.11926549688975513D+04,
+     C     7.10951430248936372D+03,    -4.93915304773088012D+02,
+     D     6.07404200127348304D+00,    -2.42919187900551333D+05,
+     E     1.31176361466297720D+06,    -2.99801591853810675D+06/
+      DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56),
+     1     C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64),
+     2     C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/
+     3     3.76327129765640400D+06,    -2.81356322658653411D+06,
+     4     1.26836527332162478D+06,    -3.31645172484563578D+05,
+     5     4.52187689813627263D+04,    -2.49983048181120962D+03,
+     6     2.43805296995560639D+01,     3.28446985307203782D+06,
+     7    -1.97068191184322269D+07,     5.09526024926646422D+07,
+     8    -7.41051482115326577D+07,     6.63445122747290267D+07,
+     9    -3.75671766607633513D+07,     1.32887671664218183D+07,
+     A    -2.78561812808645469D+06,     3.08186404612662398D+05,
+     B    -1.38860897537170405D+04,     1.10017140269246738D+02,
+     C    -4.93292536645099620D+07,     3.25573074185765749D+08,
+     D    -9.39462359681578403D+08,     1.55359689957058006D+09,
+     E    -1.62108055210833708D+09,     1.10684281682301447D+09/
+      DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80),
+     1     C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88),
+     2     C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/
+     3    -4.95889784275030309D+08,     1.42062907797533095D+08,
+     4    -2.44740627257387285D+07,     2.24376817792244943D+06,
+     5    -8.40054336030240853D+04,     5.51335896122020586D+02,
+     6     8.14789096118312115D+08,    -5.86648149205184723D+09,
+     7     1.86882075092958249D+10,    -3.46320433881587779D+10,
+     8     4.12801855797539740D+10,    -3.30265997498007231D+10,
+     9     1.79542137311556001D+10,    -6.56329379261928433D+09,
+     A     1.55927986487925751D+09,    -2.25105661889415278D+08,
+     B     1.73951075539781645D+07,    -5.49842327572288687D+05,
+     C     3.03809051092238427D+03,    -1.46792612476956167D+10,
+     D     1.14498237732025810D+11,    -3.99096175224466498D+11,
+     E     8.19218669548577329D+11,    -1.09837515608122331D+12/
+      DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104),
+     1     C(105), C(106), C(107), C(108), C(109), C(110), C(111),
+     2     C(112), C(113), C(114), C(115), C(116), C(117), C(118)/
+     3     1.00815810686538209D+12,    -6.45364869245376503D+11,
+     4     2.87900649906150589D+11,    -8.78670721780232657D+10,
+     5     1.76347306068349694D+10,    -2.16716498322379509D+09,
+     6     1.43157876718888981D+08,    -3.87183344257261262D+06,
+     7     1.82577554742931747D+04,     2.86464035717679043D+11,
+     8    -2.40629790002850396D+12,     9.10934118523989896D+12,
+     9    -2.05168994109344374D+13,     3.05651255199353206D+13,
+     A    -3.16670885847851584D+13,     2.33483640445818409D+13,
+     B    -1.23204913055982872D+13,     4.61272578084913197D+12,
+     C    -1.19655288019618160D+12,     2.05914503232410016D+11,
+     D    -2.18229277575292237D+10,     1.24700929351271032D+09/
+      DATA C(119), C(120)/
+     1    -2.91883881222208134D+07,     1.18838426256783253D+05/
+C
+      IF (INIT.NE.0) GO TO 40
+C-----------------------------------------------------------------------
+C     INITIALIZE ALL VARIABLES
+C-----------------------------------------------------------------------
+      RFN = 1.0D0/FNU
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST (ZR/FNU TOO SMALL)
+C-----------------------------------------------------------------------
+      TEST = D1MACH(1)*1.0D+3
+      AC = FNU*TEST
+      IF (DABS(ZRR).GT.AC .OR. DABS(ZRI).GT.AC) GO TO 15
+      ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
+      ZETA1I = 0.0D0
+      ZETA2R = FNU
+      ZETA2I = 0.0D0
+      PHIR = 1.0D0
+      PHII = 0.0D0
+      RETURN
+   15 CONTINUE
+      TR = ZRR*RFN
+      TI = ZRI*RFN
+      SR = CONER + (TR*TR-TI*TI)
+      SI = CONEI + (TR*TI+TI*TR)
+      CALL XZSQRT(SR, SI, SRR, SRI)
+      STR = CONER + SRR
+      STI = CONEI + SRI
+      CALL ZDIV(STR, STI, TR, TI, ZNR, ZNI)
+      CALL XZLOG(ZNR, ZNI, STR, STI, IDUM)
+      ZETA1R = FNU*STR
+      ZETA1I = FNU*STI
+      ZETA2R = FNU*SRR
+      ZETA2I = FNU*SRI
+      CALL ZDIV(CONER, CONEI, SRR, SRI, TR, TI)
+      SRR = TR*RFN
+      SRI = TI*RFN
+      CALL XZSQRT(SRR, SRI, CWRKR(16), CWRKI(16))
+      PHIR = CWRKR(16)*CON(IKFLG)
+      PHII = CWRKI(16)*CON(IKFLG)
+      IF (IPMTR.NE.0) RETURN
+      CALL ZDIV(CONER, CONEI, SR, SI, T2R, T2I)
+      CWRKR(1) = CONER
+      CWRKI(1) = CONEI
+      CRFNR = CONER
+      CRFNI = CONEI
+      AC = 1.0D0
+      L = 1
+      DO 20 K=2,15
+        SR = ZEROR
+        SI = ZEROI
+        DO 10 J=1,K
+          L = L + 1
+          STR = SR*T2R - SI*T2I + C(L)
+          SI = SR*T2I + SI*T2R
+          SR = STR
+   10   CONTINUE
+        STR = CRFNR*SRR - CRFNI*SRI
+        CRFNI = CRFNR*SRI + CRFNI*SRR
+        CRFNR = STR
+        CWRKR(K) = CRFNR*SR - CRFNI*SI
+        CWRKI(K) = CRFNR*SI + CRFNI*SR
+        AC = AC*RFN
+        TEST = DABS(CWRKR(K)) + DABS(CWRKI(K))
+        IF (AC.LT.TOL .AND. TEST.LT.TOL) GO TO 30
+   20 CONTINUE
+      K = 15
+   30 CONTINUE
+      INIT = K
+   40 CONTINUE
+      IF (IKFLG.EQ.2) GO TO 60
+C-----------------------------------------------------------------------
+C     COMPUTE SUM FOR THE I FUNCTION
+C-----------------------------------------------------------------------
+      SR = ZEROR
+      SI = ZEROI
+      DO 50 I=1,INIT
+        SR = SR + CWRKR(I)
+        SI = SI + CWRKI(I)
+   50 CONTINUE
+      SUMR = SR
+      SUMI = SI
+      PHIR = CWRKR(16)*CON(1)
+      PHII = CWRKI(16)*CON(1)
+      RETURN
+   60 CONTINUE
+C-----------------------------------------------------------------------
+C     COMPUTE SUM FOR THE K FUNCTION
+C-----------------------------------------------------------------------
+      SR = ZEROR
+      SI = ZEROI
+      TR = CONER
+      DO 70 I=1,INIT
+        SR = SR + TR*CWRKR(I)
+        SI = SI + TR*CWRKI(I)
+        TR = -TR
+   70 CONTINUE
+      SUMR = SR
+      SUMI = SI
+      PHIR = CWRKR(16)*CON(2)
+      PHII = CWRKI(16)*CON(2)
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zunk1.f
@@ -0,0 +1,426 @@
+      SUBROUTINE ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM,
+     * ALIM)
+C***BEGIN PROLOGUE  ZUNK1
+C***REFER TO  ZBESK
+C
+C     ZUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
+C     RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
+C     UNIFORM ASYMPTOTIC EXPANSION.
+C     MR INDICATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
+C     NZ=-1 MEANS AN OVERFLOW WILL OCCUR
+C
+C***ROUTINES CALLED  ZKSCL,ZS1S2,ZUCHK,ZUNIK,D1MACH,XZABS
+C***END PROLOGUE  ZUNK1
+C     COMPLEX CFN,CK,CONE,CRSC,CS,CSCL,CSGN,CSPN,CSR,CSS,CWRK,CY,CZERO,
+C    *C1,C2,PHI,PHID,RZ,SUM,SUMD,S1,S2,Y,Z,ZETA1,ZETA1D,ZETA2,ZETA2D,ZR
+      DOUBLE PRECISION ALIM, ANG, APHI, ASC, ASCLE, BRY, CKI, CKR,
+     * CONER, CRSC, CSCL, CSGNI, CSPNI, CSPNR, CSR, CSRR, CSSR,
+     * CWRKI, CWRKR, CYI, CYR, C1I, C1R, C2I, C2M, C2R, ELIM, FMR, FN,
+     * FNF, FNU, PHIDI, PHIDR, PHII, PHIR, PI, RAST, RAZR, RS1, RZI,
+     * RZR, SGN, STI, STR, SUMDI, SUMDR, SUMI, SUMR, S1I, S1R, S2I,
+     * S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R,
+     * ZET1DI, ZET1DR, ZET2DI, ZET2DR, ZI, ZR, ZRI, ZRR, D1MACH, XZABS
+      INTEGER I, IB, IFLAG, IFN, IL, INIT, INU, IUF, K, KDFLG, KFLAG,
+     * KK, KODE, MR, N, NW, NZ, INITD, IC, IPARD, J
+      DIMENSION BRY(3), INIT(2), YR(N), YI(N), SUMR(2), SUMI(2),
+     * ZETA1R(2), ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2),
+     * CWRKR(16,3), CWRKI(16,3), CSSR(3), CSRR(3), PHIR(2), PHII(2)
+      DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
+      DATA PI / 3.14159265358979324D0 /
+C
+      KDFLG = 1
+      NZ = 0
+C-----------------------------------------------------------------------
+C     EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
+C     THE UNDERFLOW LIMIT
+C-----------------------------------------------------------------------
+      CSCL = 1.0D0/TOL
+      CRSC = TOL
+      CSSR(1) = CSCL
+      CSSR(2) = CONER
+      CSSR(3) = CRSC
+      CSRR(1) = CRSC
+      CSRR(2) = CONER
+      CSRR(3) = CSCL
+      BRY(1) = 1.0D+3*D1MACH(1)/TOL
+      BRY(2) = 1.0D0/BRY(1)
+      BRY(3) = D1MACH(2)
+      ZRR = ZR
+      ZRI = ZI
+      IF (ZR.GE.0.0D0) GO TO 10
+      ZRR = -ZR
+      ZRI = -ZI
+   10 CONTINUE
+      J = 2
+      DO 70 I=1,N
+C-----------------------------------------------------------------------
+C     J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
+C-----------------------------------------------------------------------
+        J = 3 - J
+        FN = FNU + DBLE(FLOAT(I-1))
+        INIT(J) = 0
+        CALL ZUNIK(ZRR, ZRI, FN, 2, 0, TOL, INIT(J), PHIR(J), PHII(J),
+     *   ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), SUMR(J), SUMI(J),
+     *   CWRKR(1,J), CWRKI(1,J))
+        IF (KODE.EQ.1) GO TO 20
+        STR = ZRR + ZETA2R(J)
+        STI = ZRI + ZETA2I(J)
+        RAST = FN/XZABS(STR,STI)
+        STR = STR*RAST*RAST
+        STI = -STI*RAST*RAST
+        S1R = ZETA1R(J) - STR
+        S1I = ZETA1I(J) - STI
+        GO TO 30
+   20   CONTINUE
+        S1R = ZETA1R(J) - ZETA2R(J)
+        S1I = ZETA1I(J) - ZETA2I(J)
+   30   CONTINUE
+        RS1 = S1R
+C-----------------------------------------------------------------------
+C     TEST FOR UNDERFLOW AND OVERFLOW
+C-----------------------------------------------------------------------
+        IF (DABS(RS1).GT.ELIM) GO TO 60
+        IF (KDFLG.EQ.1) KFLAG = 2
+        IF (DABS(RS1).LT.ALIM) GO TO 40
+C-----------------------------------------------------------------------
+C     REFINE  TEST AND SCALE
+C-----------------------------------------------------------------------
+        APHI = XZABS(PHIR(J),PHII(J))
+        RS1 = RS1 + DLOG(APHI)
+        IF (DABS(RS1).GT.ELIM) GO TO 60
+        IF (KDFLG.EQ.1) KFLAG = 1
+        IF (RS1.LT.0.0D0) GO TO 40
+        IF (KDFLG.EQ.1) KFLAG = 3
+   40   CONTINUE
+C-----------------------------------------------------------------------
+C     SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
+C     EXPONENT EXTREMES
+C-----------------------------------------------------------------------
+        S2R = PHIR(J)*SUMR(J) - PHII(J)*SUMI(J)
+        S2I = PHIR(J)*SUMI(J) + PHII(J)*SUMR(J)
+        STR = DEXP(S1R)*CSSR(KFLAG)
+        S1R = STR*DCOS(S1I)
+        S1I = STR*DSIN(S1I)
+        STR = S2R*S1R - S2I*S1I
+        S2I = S1R*S2I + S2R*S1I
+        S2R = STR
+        IF (KFLAG.NE.1) GO TO 50
+        CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
+        IF (NW.NE.0) GO TO 60
+   50   CONTINUE
+        CYR(KDFLG) = S2R
+        CYI(KDFLG) = S2I
+        YR(I) = S2R*CSRR(KFLAG)
+        YI(I) = S2I*CSRR(KFLAG)
+        IF (KDFLG.EQ.2) GO TO 75
+        KDFLG = 2
+        GO TO 70
+   60   CONTINUE
+        IF (RS1.GT.0.0D0) GO TO 300
+C-----------------------------------------------------------------------
+C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
+C-----------------------------------------------------------------------
+        IF (ZR.LT.0.0D0) GO TO 300
+        KDFLG = 1
+        YR(I)=ZEROR
+        YI(I)=ZEROI
+        NZ=NZ+1
+        IF (I.EQ.1) GO TO 70
+        IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 70
+        YR(I-1)=ZEROR
+        YI(I-1)=ZEROI
+        NZ=NZ+1
+   70 CONTINUE
+      I = N
+   75 CONTINUE
+      RAZR = 1.0D0/XZABS(ZRR,ZRI)
+      STR = ZRR*RAZR
+      STI = -ZRI*RAZR
+      RZR = (STR+STR)*RAZR
+      RZI = (STI+STI)*RAZR
+      CKR = FN*RZR
+      CKI = FN*RZI
+      IB = I + 1
+      IF (N.LT.IB) GO TO 160
+C-----------------------------------------------------------------------
+C     TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
+C     ON UNDERFLOW.
+C-----------------------------------------------------------------------
+      FN = FNU + DBLE(FLOAT(N-1))
+      IPARD = 1
+      IF (MR.NE.0) IPARD = 0
+      INITD = 0
+      CALL ZUNIK(ZRR, ZRI, FN, 2, IPARD, TOL, INITD, PHIDR, PHIDI,
+     * ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI, CWRKR(1,3),
+     * CWRKI(1,3))
+      IF (KODE.EQ.1) GO TO 80
+      STR = ZRR + ZET2DR
+      STI = ZRI + ZET2DI
+      RAST = FN/XZABS(STR,STI)
+      STR = STR*RAST*RAST
+      STI = -STI*RAST*RAST
+      S1R = ZET1DR - STR
+      S1I = ZET1DI - STI
+      GO TO 90
+   80 CONTINUE
+      S1R = ZET1DR - ZET2DR
+      S1I = ZET1DI - ZET2DI
+   90 CONTINUE
+      RS1 = S1R
+      IF (DABS(RS1).GT.ELIM) GO TO 95
+      IF (DABS(RS1).LT.ALIM) GO TO 100
+C----------------------------------------------------------------------------
+C     REFINE ESTIMATE AND TEST
+C-------------------------------------------------------------------------
+      APHI = XZABS(PHIDR,PHIDI)
+      RS1 = RS1+DLOG(APHI)
+      IF (DABS(RS1).LT.ELIM) GO TO 100
+   95 CONTINUE
+      IF (DABS(RS1).GT.0.0D0) GO TO 300
+C-----------------------------------------------------------------------
+C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
+C-----------------------------------------------------------------------
+      IF (ZR.LT.0.0D0) GO TO 300
+      NZ = N
+      DO 96 I=1,N
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+   96 CONTINUE
+      RETURN
+C---------------------------------------------------------------------------
+C     FORWARD RECUR FOR REMAINDER OF THE SEQUENCE
+C----------------------------------------------------------------------------
+  100 CONTINUE
+      S1R = CYR(1)
+      S1I = CYI(1)
+      S2R = CYR(2)
+      S2I = CYI(2)
+      C1R = CSRR(KFLAG)
+      ASCLE = BRY(KFLAG)
+      DO 120 I=IB,N
+        C2R = S2R
+        C2I = S2I
+        S2R = CKR*C2R - CKI*C2I + S1R
+        S2I = CKR*C2I + CKI*C2R + S1I
+        S1R = C2R
+        S1I = C2I
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        C2R = S2R*C1R
+        C2I = S2I*C1R
+        YR(I) = C2R
+        YI(I) = C2I
+        IF (KFLAG.GE.3) GO TO 120
+        STR = DABS(C2R)
+        STI = DABS(C2I)
+        C2M = DMAX1(STR,STI)
+        IF (C2M.LE.ASCLE) GO TO 120
+        KFLAG = KFLAG + 1
+        ASCLE = BRY(KFLAG)
+        S1R = S1R*C1R
+        S1I = S1I*C1R
+        S2R = C2R
+        S2I = C2I
+        S1R = S1R*CSSR(KFLAG)
+        S1I = S1I*CSSR(KFLAG)
+        S2R = S2R*CSSR(KFLAG)
+        S2I = S2I*CSSR(KFLAG)
+        C1R = CSRR(KFLAG)
+  120 CONTINUE
+  160 CONTINUE
+      IF (MR.EQ.0) RETURN
+C-----------------------------------------------------------------------
+C     ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
+C-----------------------------------------------------------------------
+      NZ = 0
+      FMR = DBLE(FLOAT(MR))
+      SGN = -DSIGN(PI,FMR)
+C-----------------------------------------------------------------------
+C     CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
+C-----------------------------------------------------------------------
+      CSGNI = SGN
+      INU = INT(SNGL(FNU))
+      FNF = FNU - DBLE(FLOAT(INU))
+      IFN = INU + N - 1
+      ANG = FNF*SGN
+      CSPNR = DCOS(ANG)
+      CSPNI = DSIN(ANG)
+      IF (MOD(IFN,2).EQ.0) GO TO 170
+      CSPNR = -CSPNR
+      CSPNI = -CSPNI
+  170 CONTINUE
+      ASC = BRY(1)
+      IUF = 0
+      KK = N
+      KDFLG = 1
+      IB = IB - 1
+      IC = IB - 1
+      DO 270 K=1,N
+        FN = FNU + DBLE(FLOAT(KK-1))
+C-----------------------------------------------------------------------
+C     LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
+C     FUNCTION ABOVE
+C-----------------------------------------------------------------------
+        M=3
+        IF (N.GT.2) GO TO 175
+  172   CONTINUE
+        INITD = INIT(J)
+        PHIDR = PHIR(J)
+        PHIDI = PHII(J)
+        ZET1DR = ZETA1R(J)
+        ZET1DI = ZETA1I(J)
+        ZET2DR = ZETA2R(J)
+        ZET2DI = ZETA2I(J)
+        SUMDR = SUMR(J)
+        SUMDI = SUMI(J)
+        M = J
+        J = 3 - J
+        GO TO 180
+  175   CONTINUE
+        IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 180
+        IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
+        INITD = 0
+  180   CONTINUE
+        CALL ZUNIK(ZRR, ZRI, FN, 1, 0, TOL, INITD, PHIDR, PHIDI,
+     *   ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI,
+     *   CWRKR(1,M), CWRKI(1,M))
+        IF (KODE.EQ.1) GO TO 200
+        STR = ZRR + ZET2DR
+        STI = ZRI + ZET2DI
+        RAST = FN/XZABS(STR,STI)
+        STR = STR*RAST*RAST
+        STI = -STI*RAST*RAST
+        S1R = -ZET1DR + STR
+        S1I = -ZET1DI + STI
+        GO TO 210
+  200   CONTINUE
+        S1R = -ZET1DR + ZET2DR
+        S1I = -ZET1DI + ZET2DI
+  210   CONTINUE
+C-----------------------------------------------------------------------
+C     TEST FOR UNDERFLOW AND OVERFLOW
+C-----------------------------------------------------------------------
+        RS1 = S1R
+        IF (DABS(RS1).GT.ELIM) GO TO 260
+        IF (KDFLG.EQ.1) IFLAG = 2
+        IF (DABS(RS1).LT.ALIM) GO TO 220
+C-----------------------------------------------------------------------
+C     REFINE  TEST AND SCALE
+C-----------------------------------------------------------------------
+        APHI = XZABS(PHIDR,PHIDI)
+        RS1 = RS1 + DLOG(APHI)
+        IF (DABS(RS1).GT.ELIM) GO TO 260
+        IF (KDFLG.EQ.1) IFLAG = 1
+        IF (RS1.LT.0.0D0) GO TO 220
+        IF (KDFLG.EQ.1) IFLAG = 3
+  220   CONTINUE
+        STR = PHIDR*SUMDR - PHIDI*SUMDI
+        STI = PHIDR*SUMDI + PHIDI*SUMDR
+        S2R = -CSGNI*STI
+        S2I = CSGNI*STR
+        STR = DEXP(S1R)*CSSR(IFLAG)
+        S1R = STR*DCOS(S1I)
+        S1I = STR*DSIN(S1I)
+        STR = S2R*S1R - S2I*S1I
+        S2I = S2R*S1I + S2I*S1R
+        S2R = STR
+        IF (IFLAG.NE.1) GO TO 230
+        CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
+        IF (NW.EQ.0) GO TO 230
+        S2R = ZEROR
+        S2I = ZEROI
+  230   CONTINUE
+        CYR(KDFLG) = S2R
+        CYI(KDFLG) = S2I
+        C2R = S2R
+        C2I = S2I
+        S2R = S2R*CSRR(IFLAG)
+        S2I = S2I*CSRR(IFLAG)
+C-----------------------------------------------------------------------
+C     ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
+C-----------------------------------------------------------------------
+        S1R = YR(KK)
+        S1I = YI(KK)
+        IF (KODE.EQ.1) GO TO 250
+        CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
+        NZ = NZ + NW
+  250   CONTINUE
+        YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
+        YI(KK) = CSPNR*S1I + CSPNI*S1R + S2I
+        KK = KK - 1
+        CSPNR = -CSPNR
+        CSPNI = -CSPNI
+        IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
+        KDFLG = 1
+        GO TO 270
+  255   CONTINUE
+        IF (KDFLG.EQ.2) GO TO 275
+        KDFLG = 2
+        GO TO 270
+  260   CONTINUE
+        IF (RS1.GT.0.0D0) GO TO 300
+        S2R = ZEROR
+        S2I = ZEROI
+        GO TO 230
+  270 CONTINUE
+      K = N
+  275 CONTINUE
+      IL = N - K
+      IF (IL.EQ.0) RETURN
+C-----------------------------------------------------------------------
+C     RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
+C     K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
+C     INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
+C-----------------------------------------------------------------------
+      S1R = CYR(1)
+      S1I = CYI(1)
+      S2R = CYR(2)
+      S2I = CYI(2)
+      CSR = CSRR(IFLAG)
+      ASCLE = BRY(IFLAG)
+      FN = DBLE(FLOAT(INU+IL))
+      DO 290 I=1,IL
+        C2R = S2R
+        C2I = S2I
+        S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
+        S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
+        S1R = C2R
+        S1I = C2I
+        FN = FN - 1.0D0
+        C2R = S2R*CSR
+        C2I = S2I*CSR
+        CKR = C2R
+        CKI = C2I
+        C1R = YR(KK)
+        C1I = YI(KK)
+        IF (KODE.EQ.1) GO TO 280
+        CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
+        NZ = NZ + NW
+  280   CONTINUE
+        YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
+        YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
+        KK = KK - 1
+        CSPNR = -CSPNR
+        CSPNI = -CSPNI
+        IF (IFLAG.GE.3) GO TO 290
+        C2R = DABS(CKR)
+        C2I = DABS(CKI)
+        C2M = DMAX1(C2R,C2I)
+        IF (C2M.LE.ASCLE) GO TO 290
+        IFLAG = IFLAG + 1
+        ASCLE = BRY(IFLAG)
+        S1R = S1R*CSR
+        S1I = S1I*CSR
+        S2R = CKR
+        S2I = CKI
+        S1R = S1R*CSSR(IFLAG)
+        S1I = S1I*CSSR(IFLAG)
+        S2R = S2R*CSSR(IFLAG)
+        S2I = S2I*CSSR(IFLAG)
+        CSR = CSRR(IFLAG)
+  290 CONTINUE
+      RETURN
+  300 CONTINUE
+      NZ = -1
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zunk2.f
@@ -0,0 +1,505 @@
+      SUBROUTINE ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM,
+     * ALIM)
+C***BEGIN PROLOGUE  ZUNK2
+C***REFER TO  ZBESK
+C
+C     ZUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
+C     RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
+C     UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN)
+C     WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR
+C     -1. HERE ZN=ZR*I OR -ZR*I WHERE ZR=Z IF Z IS IN THE RIGHT
+C     HALF PLANE OR ZR=-Z IF Z IS IN THE LEFT HALF PLANE. MR INDIC-
+C     ATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
+C     NZ=-1 MEANS AN OVERFLOW WILL OCCUR
+C
+C***ROUTINES CALLED  ZAIRY,ZKSCL,ZS1S2,ZUCHK,ZUNHJ,D1MACH,XZABS
+C***END PROLOGUE  ZUNK2
+C     COMPLEX AI,ARG,ARGD,ASUM,ASUMD,BSUM,BSUMD,CFN,CI,CIP,CK,CONE,CRSC,
+C    *CR1,CR2,CS,CSCL,CSGN,CSPN,CSR,CSS,CY,CZERO,C1,C2,DAI,PHI,PHID,RZ,
+C    *S1,S2,Y,Z,ZB,ZETA1,ZETA1D,ZETA2,ZETA2D,ZN,ZR
+      DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGDI,
+     * ARGDR, ARGI, ARGR, ASC, ASCLE, ASUMDI, ASUMDR, ASUMI, ASUMR,
+     * BRY, BSUMDI, BSUMDR, BSUMI, BSUMR, CAR, CIPI, CIPR, CKI, CKR,
+     * CONER, CRSC, CR1I, CR1R, CR2I, CR2R, CSCL, CSGNI, CSI,
+     * CSPNI, CSPNR, CSR, CSRR, CSSR, CYI, CYR, C1I, C1R, C2I, C2M,
+     * C2R, DAII, DAIR, ELIM, FMR, FN, FNF, FNU, HPI, PHIDI, PHIDR,
+     * PHII, PHIR, PI, PTI, PTR, RAST, RAZR, RS1, RZI, RZR, SAR, SGN,
+     * STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, YY, ZBI, ZBR, ZEROI,
+     * ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZET1DI, ZET1DR, ZET2DI,
+     * ZET2DR, ZI, ZNI, ZNR, ZR, ZRI, ZRR, D1MACH, XZABS
+      INTEGER I, IB, IFLAG, IFN, IL, IN, INU, IUF, K, KDFLG, KFLAG, KK,
+     * KODE, MR, N, NAI, NDAI, NW, NZ, IDUM, J, IPARD, IC
+      DIMENSION BRY(3), YR(N), YI(N), ASUMR(2), ASUMI(2), BSUMR(2),
+     * BSUMI(2), PHIR(2), PHII(2), ARGR(2), ARGI(2), ZETA1R(2),
+     * ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2), CIPR(4),
+     * CIPI(4), CSSR(3), CSRR(3)
+      DATA ZEROR,ZEROI,CONER,CR1R,CR1I,CR2R,CR2I /
+     1         0.0D0, 0.0D0, 1.0D0,
+     1 1.0D0,1.73205080756887729D0 , -0.5D0,-8.66025403784438647D-01 /
+      DATA HPI, PI, AIC /
+     1     1.57079632679489662D+00,     3.14159265358979324D+00,
+     1     1.26551212348464539D+00/
+      DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4),
+     * CIPI(4) /
+     1  1.0D0,0.0D0 ,  0.0D0,-1.0D0 ,  -1.0D0,0.0D0 ,  0.0D0,1.0D0 /
+C
+      KDFLG = 1
+      NZ = 0
+C-----------------------------------------------------------------------
+C     EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
+C     THE UNDERFLOW LIMIT
+C-----------------------------------------------------------------------
+      CSCL = 1.0D0/TOL
+      CRSC = TOL
+      CSSR(1) = CSCL
+      CSSR(2) = CONER
+      CSSR(3) = CRSC
+      CSRR(1) = CRSC
+      CSRR(2) = CONER
+      CSRR(3) = CSCL
+      BRY(1) = 1.0D+3*D1MACH(1)/TOL
+      BRY(2) = 1.0D0/BRY(1)
+      BRY(3) = D1MACH(2)
+      ZRR = ZR
+      ZRI = ZI
+      IF (ZR.GE.0.0D0) GO TO 10
+      ZRR = -ZR
+      ZRI = -ZI
+   10 CONTINUE
+      YY = ZRI
+      ZNR = ZRI
+      ZNI = -ZRR
+      ZBR = ZRR
+      ZBI = ZRI
+      INU = INT(SNGL(FNU))
+      FNF = FNU - DBLE(FLOAT(INU))
+      ANG = -HPI*FNF
+      CAR = DCOS(ANG)
+      SAR = DSIN(ANG)
+      C2R = HPI*SAR
+      C2I = -HPI*CAR
+      KK = MOD(INU,4) + 1
+      STR = C2R*CIPR(KK) - C2I*CIPI(KK)
+      STI = C2R*CIPI(KK) + C2I*CIPR(KK)
+      CSR = CR1R*STR - CR1I*STI
+      CSI = CR1R*STI + CR1I*STR
+      IF (YY.GT.0.0D0) GO TO 20
+      ZNR = -ZNR
+      ZBI = -ZBI
+   20 CONTINUE
+C-----------------------------------------------------------------------
+C     K(FNU,Z) IS COMPUTED FROM H(2,FNU,-I*Z) WHERE Z IS IN THE FIRST
+C     QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
+C     CONJUGATION SINCE THE K FUNCTION IS REAL ON THE POSITIVE REAL AXIS
+C-----------------------------------------------------------------------
+      J = 2
+      DO 80 I=1,N
+C-----------------------------------------------------------------------
+C     J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
+C-----------------------------------------------------------------------
+        J = 3 - J
+        FN = FNU + DBLE(FLOAT(I-1))
+        CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR(J), PHII(J), ARGR(J),
+     *   ARGI(J), ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), ASUMR(J),
+     *   ASUMI(J), BSUMR(J), BSUMI(J))
+        IF (KODE.EQ.1) GO TO 30
+        STR = ZBR + ZETA2R(J)
+        STI = ZBI + ZETA2I(J)
+        RAST = FN/XZABS(STR,STI)
+        STR = STR*RAST*RAST
+        STI = -STI*RAST*RAST
+        S1R = ZETA1R(J) - STR
+        S1I = ZETA1I(J) - STI
+        GO TO 40
+   30   CONTINUE
+        S1R = ZETA1R(J) - ZETA2R(J)
+        S1I = ZETA1I(J) - ZETA2I(J)
+   40   CONTINUE
+C-----------------------------------------------------------------------
+C     TEST FOR UNDERFLOW AND OVERFLOW
+C-----------------------------------------------------------------------
+        RS1 = S1R
+        IF (DABS(RS1).GT.ELIM) GO TO 70
+        IF (KDFLG.EQ.1) KFLAG = 2
+        IF (DABS(RS1).LT.ALIM) GO TO 50
+C-----------------------------------------------------------------------
+C     REFINE  TEST AND SCALE
+C-----------------------------------------------------------------------
+        APHI = XZABS(PHIR(J),PHII(J))
+        AARG = XZABS(ARGR(J),ARGI(J))
+        RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
+        IF (DABS(RS1).GT.ELIM) GO TO 70
+        IF (KDFLG.EQ.1) KFLAG = 1
+        IF (RS1.LT.0.0D0) GO TO 50
+        IF (KDFLG.EQ.1) KFLAG = 3
+   50   CONTINUE
+C-----------------------------------------------------------------------
+C     SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
+C     EXPONENT EXTREMES
+C-----------------------------------------------------------------------
+        C2R = ARGR(J)*CR2R - ARGI(J)*CR2I
+        C2I = ARGR(J)*CR2I + ARGI(J)*CR2R
+        CALL ZAIRY(C2R, C2I, 0, 2, AIR, AII, NAI, IDUM)
+        CALL ZAIRY(C2R, C2I, 1, 2, DAIR, DAII, NDAI, IDUM)
+        STR = DAIR*BSUMR(J) - DAII*BSUMI(J)
+        STI = DAIR*BSUMI(J) + DAII*BSUMR(J)
+        PTR = STR*CR2R - STI*CR2I
+        PTI = STR*CR2I + STI*CR2R
+        STR = PTR + (AIR*ASUMR(J)-AII*ASUMI(J))
+        STI = PTI + (AIR*ASUMI(J)+AII*ASUMR(J))
+        PTR = STR*PHIR(J) - STI*PHII(J)
+        PTI = STR*PHII(J) + STI*PHIR(J)
+        S2R = PTR*CSR - PTI*CSI
+        S2I = PTR*CSI + PTI*CSR
+        STR = DEXP(S1R)*CSSR(KFLAG)
+        S1R = STR*DCOS(S1I)
+        S1I = STR*DSIN(S1I)
+        STR = S2R*S1R - S2I*S1I
+        S2I = S1R*S2I + S2R*S1I
+        S2R = STR
+        IF (KFLAG.NE.1) GO TO 60
+        CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
+        IF (NW.NE.0) GO TO 70
+   60   CONTINUE
+        IF (YY.LE.0.0D0) S2I = -S2I
+        CYR(KDFLG) = S2R
+        CYI(KDFLG) = S2I
+        YR(I) = S2R*CSRR(KFLAG)
+        YI(I) = S2I*CSRR(KFLAG)
+        STR = CSI
+        CSI = -CSR
+        CSR = STR
+        IF (KDFLG.EQ.2) GO TO 85
+        KDFLG = 2
+        GO TO 80
+   70   CONTINUE
+        IF (RS1.GT.0.0D0) GO TO 320
+C-----------------------------------------------------------------------
+C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
+C-----------------------------------------------------------------------
+        IF (ZR.LT.0.0D0) GO TO 320
+        KDFLG = 1
+        YR(I)=ZEROR
+        YI(I)=ZEROI
+        NZ=NZ+1
+        STR = CSI
+        CSI =-CSR
+        CSR = STR
+        IF (I.EQ.1) GO TO 80
+        IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 80
+        YR(I-1)=ZEROR
+        YI(I-1)=ZEROI
+        NZ=NZ+1
+   80 CONTINUE
+      I = N
+   85 CONTINUE
+      RAZR = 1.0D0/XZABS(ZRR,ZRI)
+      STR = ZRR*RAZR
+      STI = -ZRI*RAZR
+      RZR = (STR+STR)*RAZR
+      RZI = (STI+STI)*RAZR
+      CKR = FN*RZR
+      CKI = FN*RZI
+      IB = I + 1
+      IF (N.LT.IB) GO TO 180
+C-----------------------------------------------------------------------
+C     TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
+C     ON UNDERFLOW.
+C-----------------------------------------------------------------------
+      FN = FNU + DBLE(FLOAT(N-1))
+      IPARD = 1
+      IF (MR.NE.0) IPARD = 0
+      CALL ZUNHJ(ZNR, ZNI, FN, IPARD, TOL, PHIDR, PHIDI, ARGDR, ARGDI,
+     * ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR, ASUMDI, BSUMDR, BSUMDI)
+      IF (KODE.EQ.1) GO TO 90
+      STR = ZBR + ZET2DR
+      STI = ZBI + ZET2DI
+      RAST = FN/XZABS(STR,STI)
+      STR = STR*RAST*RAST
+      STI = -STI*RAST*RAST
+      S1R = ZET1DR - STR
+      S1I = ZET1DI - STI
+      GO TO 100
+   90 CONTINUE
+      S1R = ZET1DR - ZET2DR
+      S1I = ZET1DI - ZET2DI
+  100 CONTINUE
+      RS1 = S1R
+      IF (DABS(RS1).GT.ELIM) GO TO 105
+      IF (DABS(RS1).LT.ALIM) GO TO 120
+C----------------------------------------------------------------------------
+C     REFINE ESTIMATE AND TEST
+C-------------------------------------------------------------------------
+      APHI = XZABS(PHIDR,PHIDI)
+      RS1 = RS1+DLOG(APHI)
+      IF (DABS(RS1).LT.ELIM) GO TO 120
+  105 CONTINUE
+      IF (RS1.GT.0.0D0) GO TO 320
+C-----------------------------------------------------------------------
+C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
+C-----------------------------------------------------------------------
+      IF (ZR.LT.0.0D0) GO TO 320
+      NZ = N
+      DO 106 I=1,N
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+  106 CONTINUE
+      RETURN
+  120 CONTINUE
+      S1R = CYR(1)
+      S1I = CYI(1)
+      S2R = CYR(2)
+      S2I = CYI(2)
+      C1R = CSRR(KFLAG)
+      ASCLE = BRY(KFLAG)
+      DO 130 I=IB,N
+        C2R = S2R
+        C2I = S2I
+        S2R = CKR*C2R - CKI*C2I + S1R
+        S2I = CKR*C2I + CKI*C2R + S1I
+        S1R = C2R
+        S1I = C2I
+        CKR = CKR + RZR
+        CKI = CKI + RZI
+        C2R = S2R*C1R
+        C2I = S2I*C1R
+        YR(I) = C2R
+        YI(I) = C2I
+        IF (KFLAG.GE.3) GO TO 130
+        STR = DABS(C2R)
+        STI = DABS(C2I)
+        C2M = DMAX1(STR,STI)
+        IF (C2M.LE.ASCLE) GO TO 130
+        KFLAG = KFLAG + 1
+        ASCLE = BRY(KFLAG)
+        S1R = S1R*C1R
+        S1I = S1I*C1R
+        S2R = C2R
+        S2I = C2I
+        S1R = S1R*CSSR(KFLAG)
+        S1I = S1I*CSSR(KFLAG)
+        S2R = S2R*CSSR(KFLAG)
+        S2I = S2I*CSSR(KFLAG)
+        C1R = CSRR(KFLAG)
+  130 CONTINUE
+  180 CONTINUE
+      IF (MR.EQ.0) RETURN
+C-----------------------------------------------------------------------
+C     ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
+C-----------------------------------------------------------------------
+      NZ = 0
+      FMR = DBLE(FLOAT(MR))
+      SGN = -DSIGN(PI,FMR)
+C-----------------------------------------------------------------------
+C     CSPN AND CSGN ARE COEFF OF K AND I FUNCIONS RESP.
+C-----------------------------------------------------------------------
+      CSGNI = SGN
+      IF (YY.LE.0.0D0) CSGNI = -CSGNI
+      IFN = INU + N - 1
+      ANG = FNF*SGN
+      CSPNR = DCOS(ANG)
+      CSPNI = DSIN(ANG)
+      IF (MOD(IFN,2).EQ.0) GO TO 190
+      CSPNR = -CSPNR
+      CSPNI = -CSPNI
+  190 CONTINUE
+C-----------------------------------------------------------------------
+C     CS=COEFF OF THE J FUNCTION TO GET THE I FUNCTION. I(FNU,Z) IS
+C     COMPUTED FROM EXP(I*FNU*HPI)*J(FNU,-I*Z) WHERE Z IS IN THE FIRST
+C     QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
+C     CONJUGATION SINCE THE I FUNCTION IS REAL ON THE POSITIVE REAL AXIS
+C-----------------------------------------------------------------------
+      CSR = SAR*CSGNI
+      CSI = CAR*CSGNI
+      IN = MOD(IFN,4) + 1
+      C2R = CIPR(IN)
+      C2I = CIPI(IN)
+      STR = CSR*C2R + CSI*C2I
+      CSI = -CSR*C2I + CSI*C2R
+      CSR = STR
+      ASC = BRY(1)
+      IUF = 0
+      KK = N
+      KDFLG = 1
+      IB = IB - 1
+      IC = IB - 1
+      DO 290 K=1,N
+        FN = FNU + DBLE(FLOAT(KK-1))
+C-----------------------------------------------------------------------
+C     LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
+C     FUNCTION ABOVE
+C-----------------------------------------------------------------------
+        IF (N.GT.2) GO TO 175
+  172   CONTINUE
+        PHIDR = PHIR(J)
+        PHIDI = PHII(J)
+        ARGDR = ARGR(J)
+        ARGDI = ARGI(J)
+        ZET1DR = ZETA1R(J)
+        ZET1DI = ZETA1I(J)
+        ZET2DR = ZETA2R(J)
+        ZET2DI = ZETA2I(J)
+        ASUMDR = ASUMR(J)
+        ASUMDI = ASUMI(J)
+        BSUMDR = BSUMR(J)
+        BSUMDI = BSUMI(J)
+        J = 3 - J
+        GO TO 210
+  175   CONTINUE
+        IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 210
+        IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
+        CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIDR, PHIDI, ARGDR,
+     *   ARGDI, ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR,
+     *   ASUMDI, BSUMDR, BSUMDI)
+  210   CONTINUE
+        IF (KODE.EQ.1) GO TO 220
+        STR = ZBR + ZET2DR
+        STI = ZBI + ZET2DI
+        RAST = FN/XZABS(STR,STI)
+        STR = STR*RAST*RAST
+        STI = -STI*RAST*RAST
+        S1R = -ZET1DR + STR
+        S1I = -ZET1DI + STI
+        GO TO 230
+  220   CONTINUE
+        S1R = -ZET1DR + ZET2DR
+        S1I = -ZET1DI + ZET2DI
+  230   CONTINUE
+C-----------------------------------------------------------------------
+C     TEST FOR UNDERFLOW AND OVERFLOW
+C-----------------------------------------------------------------------
+        RS1 = S1R
+        IF (DABS(RS1).GT.ELIM) GO TO 280
+        IF (KDFLG.EQ.1) IFLAG = 2
+        IF (DABS(RS1).LT.ALIM) GO TO 240
+C-----------------------------------------------------------------------
+C     REFINE  TEST AND SCALE
+C-----------------------------------------------------------------------
+        APHI = XZABS(PHIDR,PHIDI)
+        AARG = XZABS(ARGDR,ARGDI)
+        RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
+        IF (DABS(RS1).GT.ELIM) GO TO 280
+        IF (KDFLG.EQ.1) IFLAG = 1
+        IF (RS1.LT.0.0D0) GO TO 240
+        IF (KDFLG.EQ.1) IFLAG = 3
+  240   CONTINUE
+        CALL ZAIRY(ARGDR, ARGDI, 0, 2, AIR, AII, NAI, IDUM)
+        CALL ZAIRY(ARGDR, ARGDI, 1, 2, DAIR, DAII, NDAI, IDUM)
+        STR = DAIR*BSUMDR - DAII*BSUMDI
+        STI = DAIR*BSUMDI + DAII*BSUMDR
+        STR = STR + (AIR*ASUMDR-AII*ASUMDI)
+        STI = STI + (AIR*ASUMDI+AII*ASUMDR)
+        PTR = STR*PHIDR - STI*PHIDI
+        PTI = STR*PHIDI + STI*PHIDR
+        S2R = PTR*CSR - PTI*CSI
+        S2I = PTR*CSI + PTI*CSR
+        STR = DEXP(S1R)*CSSR(IFLAG)
+        S1R = STR*DCOS(S1I)
+        S1I = STR*DSIN(S1I)
+        STR = S2R*S1R - S2I*S1I
+        S2I = S2R*S1I + S2I*S1R
+        S2R = STR
+        IF (IFLAG.NE.1) GO TO 250
+        CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
+        IF (NW.EQ.0) GO TO 250
+        S2R = ZEROR
+        S2I = ZEROI
+  250   CONTINUE
+        IF (YY.LE.0.0D0) S2I = -S2I
+        CYR(KDFLG) = S2R
+        CYI(KDFLG) = S2I
+        C2R = S2R
+        C2I = S2I
+        S2R = S2R*CSRR(IFLAG)
+        S2I = S2I*CSRR(IFLAG)
+C-----------------------------------------------------------------------
+C     ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
+C-----------------------------------------------------------------------
+        S1R = YR(KK)
+        S1I = YI(KK)
+        IF (KODE.EQ.1) GO TO 270
+        CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
+        NZ = NZ + NW
+  270   CONTINUE
+        YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
+        YI(KK) = S1R*CSPNI + S1I*CSPNR + S2I
+        KK = KK - 1
+        CSPNR = -CSPNR
+        CSPNI = -CSPNI
+        STR = CSI
+        CSI = -CSR
+        CSR = STR
+        IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
+        KDFLG = 1
+        GO TO 290
+  255   CONTINUE
+        IF (KDFLG.EQ.2) GO TO 295
+        KDFLG = 2
+        GO TO 290
+  280   CONTINUE
+        IF (RS1.GT.0.0D0) GO TO 320
+        S2R = ZEROR
+        S2I = ZEROI
+        GO TO 250
+  290 CONTINUE
+      K = N
+  295 CONTINUE
+      IL = N - K
+      IF (IL.EQ.0) RETURN
+C-----------------------------------------------------------------------
+C     RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
+C     K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
+C     INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
+C-----------------------------------------------------------------------
+      S1R = CYR(1)
+      S1I = CYI(1)
+      S2R = CYR(2)
+      S2I = CYI(2)
+      CSR = CSRR(IFLAG)
+      ASCLE = BRY(IFLAG)
+      FN = DBLE(FLOAT(INU+IL))
+      DO 310 I=1,IL
+        C2R = S2R
+        C2I = S2I
+        S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
+        S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
+        S1R = C2R
+        S1I = C2I
+        FN = FN - 1.0D0
+        C2R = S2R*CSR
+        C2I = S2I*CSR
+        CKR = C2R
+        CKI = C2I
+        C1R = YR(KK)
+        C1I = YI(KK)
+        IF (KODE.EQ.1) GO TO 300
+        CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
+        NZ = NZ + NW
+  300   CONTINUE
+        YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
+        YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
+        KK = KK - 1
+        CSPNR = -CSPNR
+        CSPNI = -CSPNI
+        IF (IFLAG.GE.3) GO TO 310
+        C2R = DABS(CKR)
+        C2I = DABS(CKI)
+        C2M = DMAX1(C2R,C2I)
+        IF (C2M.LE.ASCLE) GO TO 310
+        IFLAG = IFLAG + 1
+        ASCLE = BRY(IFLAG)
+        S1R = S1R*CSR
+        S1I = S1I*CSR
+        S2R = CKR
+        S2I = CKI
+        S1R = S1R*CSSR(IFLAG)
+        S1I = S1I*CSSR(IFLAG)
+        S2R = S2R*CSSR(IFLAG)
+        S2I = S2I*CSSR(IFLAG)
+        CSR = CSRR(IFLAG)
+  310 CONTINUE
+      RETURN
+  320 CONTINUE
+      NZ = -1
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zuoik.f
@@ -0,0 +1,194 @@
+      SUBROUTINE ZUOIK(ZR, ZI, FNU, KODE, IKFLG, N, YR, YI, NUF, TOL,
+     * ELIM, ALIM)
+C***BEGIN PROLOGUE  ZUOIK
+C***REFER TO  ZBESI,ZBESK,ZBESH
+C
+C     ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
+C     EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
+C     (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
+C     WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
+C     EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
+C     THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
+C     MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE
+C     EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
+C     EXP(-ELIM)/TOL
+C
+C     IKFLG=1 MEANS THE I SEQUENCE IS TESTED
+C          =2 MEANS THE K SEQUENCE IS TESTED
+C     NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
+C         =-1 MEANS AN OVERFLOW WOULD OCCUR
+C     IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
+C             THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
+C     IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
+C     IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
+C             ANOTHER ROUTINE
+C
+C***ROUTINES CALLED  ZUCHK,ZUNHJ,ZUNIK,D1MACH,XZABS,XZLOG
+C***END PROLOGUE  ZUOIK
+C     COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN,
+C    *ZR
+      DOUBLE PRECISION AARG, AIC, ALIM, APHI, ARGI, ARGR, ASUMI, ASUMR,
+     * ASCLE, AX, AY, BSUMI, BSUMR, CWRKI, CWRKR, CZI, CZR, ELIM, FNN,
+     * FNU, GNN, GNU, PHII, PHIR, RCZ, STR, STI, SUMI, SUMR, TOL, YI,
+     * YR, ZBI, ZBR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI,
+     * ZNI, ZNR, ZR, ZRI, ZRR, D1MACH, XZABS
+      INTEGER I, IDUM, IFORM, IKFLG, INIT, KODE, N, NN, NUF, NW
+      DIMENSION YR(N), YI(N), CWRKR(16), CWRKI(16)
+      DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
+      DATA AIC / 1.265512123484645396D+00 /
+      NUF = 0
+      NN = N
+      ZRR = ZR
+      ZRI = ZI
+      IF (ZR.GE.0.0D0) GO TO 10
+      ZRR = -ZR
+      ZRI = -ZI
+   10 CONTINUE
+      ZBR = ZRR
+      ZBI = ZRI
+      AX = DABS(ZR)*1.7321D0
+      AY = DABS(ZI)
+      IFORM = 1
+      IF (AY.GT.AX) IFORM = 2
+      GNU = DMAX1(FNU,1.0D0)
+      IF (IKFLG.EQ.1) GO TO 20
+      FNN = DBLE(FLOAT(NN))
+      GNN = FNU + FNN - 1.0D0
+      GNU = DMAX1(GNN,FNN)
+   20 CONTINUE
+C-----------------------------------------------------------------------
+C     ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
+C     REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
+C     THE SIGN OF THE IMAGINARY PART CORRECT.
+C-----------------------------------------------------------------------
+      IF (IFORM.EQ.2) GO TO 30
+      INIT = 0
+      CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII,
+     * ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
+      CZR = -ZETA1R + ZETA2R
+      CZI = -ZETA1I + ZETA2I
+      GO TO 50
+   30 CONTINUE
+      ZNR = ZRI
+      ZNI = -ZRR
+      IF (ZI.GT.0.0D0) GO TO 40
+      ZNR = -ZNR
+   40 CONTINUE
+      CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R,
+     * ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
+      CZR = -ZETA1R + ZETA2R
+      CZI = -ZETA1I + ZETA2I
+      AARG = XZABS(ARGR,ARGI)
+   50 CONTINUE
+      IF (KODE.EQ.1) GO TO 60
+      CZR = CZR - ZBR
+      CZI = CZI - ZBI
+   60 CONTINUE
+      IF (IKFLG.EQ.1) GO TO 70
+      CZR = -CZR
+      CZI = -CZI
+   70 CONTINUE
+      APHI = XZABS(PHIR,PHII)
+      RCZ = CZR
+C-----------------------------------------------------------------------
+C     OVERFLOW TEST
+C-----------------------------------------------------------------------
+      IF (RCZ.GT.ELIM) GO TO 210
+      IF (RCZ.LT.ALIM) GO TO 80
+      RCZ = RCZ + DLOG(APHI)
+      IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
+      IF (RCZ.GT.ELIM) GO TO 210
+      GO TO 130
+   80 CONTINUE
+C-----------------------------------------------------------------------
+C     UNDERFLOW TEST
+C-----------------------------------------------------------------------
+      IF (RCZ.LT.(-ELIM)) GO TO 90
+      IF (RCZ.GT.(-ALIM)) GO TO 130
+      RCZ = RCZ + DLOG(APHI)
+      IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
+      IF (RCZ.GT.(-ELIM)) GO TO 110
+   90 CONTINUE
+      DO 100 I=1,NN
+        YR(I) = ZEROR
+        YI(I) = ZEROI
+  100 CONTINUE
+      NUF = NN
+      RETURN
+  110 CONTINUE
+      ASCLE = 1.0D+3*D1MACH(1)/TOL
+      CALL XZLOG(PHIR, PHII, STR, STI, IDUM)
+      CZR = CZR + STR
+      CZI = CZI + STI
+      IF (IFORM.EQ.1) GO TO 120
+      CALL XZLOG(ARGR, ARGI, STR, STI, IDUM)
+      CZR = CZR - 0.25D0*STR - AIC
+      CZI = CZI - 0.25D0*STI
+  120 CONTINUE
+      AX = DEXP(RCZ)/TOL
+      AY = CZI
+      CZR = AX*DCOS(AY)
+      CZI = AX*DSIN(AY)
+      CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
+      IF (NW.NE.0) GO TO 90
+  130 CONTINUE
+      IF (IKFLG.EQ.2) RETURN
+      IF (N.EQ.1) RETURN
+C-----------------------------------------------------------------------
+C     SET UNDERFLOWS ON I SEQUENCE
+C-----------------------------------------------------------------------
+  140 CONTINUE
+      GNU = FNU + DBLE(FLOAT(NN-1))
+      IF (IFORM.EQ.2) GO TO 150
+      INIT = 0
+      CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII,
+     * ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
+      CZR = -ZETA1R + ZETA2R
+      CZI = -ZETA1I + ZETA2I
+      GO TO 160
+  150 CONTINUE
+      CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R,
+     * ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
+      CZR = -ZETA1R + ZETA2R
+      CZI = -ZETA1I + ZETA2I
+      AARG = XZABS(ARGR,ARGI)
+  160 CONTINUE
+      IF (KODE.EQ.1) GO TO 170
+      CZR = CZR - ZBR
+      CZI = CZI - ZBI
+  170 CONTINUE
+      APHI = XZABS(PHIR,PHII)
+      RCZ = CZR
+      IF (RCZ.LT.(-ELIM)) GO TO 180
+      IF (RCZ.GT.(-ALIM)) RETURN
+      RCZ = RCZ + DLOG(APHI)
+      IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
+      IF (RCZ.GT.(-ELIM)) GO TO 190
+  180 CONTINUE
+      YR(NN) = ZEROR
+      YI(NN) = ZEROI
+      NN = NN - 1
+      NUF = NUF + 1
+      IF (NN.EQ.0) RETURN
+      GO TO 140
+  190 CONTINUE
+      ASCLE = 1.0D+3*D1MACH(1)/TOL
+      CALL XZLOG(PHIR, PHII, STR, STI, IDUM)
+      CZR = CZR + STR
+      CZI = CZI + STI
+      IF (IFORM.EQ.1) GO TO 200
+      CALL XZLOG(ARGR, ARGI, STR, STI, IDUM)
+      CZR = CZR - 0.25D0*STR - AIC
+      CZI = CZI - 0.25D0*STI
+  200 CONTINUE
+      AX = DEXP(RCZ)/TOL
+      AY = CZI
+      CZR = AX*DCOS(AY)
+      CZI = AX*DSIN(AY)
+      CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
+      IF (NW.NE.0) GO TO 180
+      RETURN
+  210 CONTINUE
+      NUF = -1
+      RETURN
+      END
new file mode 100644
--- /dev/null
+++ b/libcruft/amos/zwrsk.f
@@ -0,0 +1,94 @@
+      SUBROUTINE ZWRSK(ZRR, ZRI, FNU, KODE, N, YR, YI, NZ, CWR, CWI,
+     * TOL, ELIM, ALIM)
+C***BEGIN PROLOGUE  ZWRSK
+C***REFER TO  ZBESI,ZBESK
+C
+C     ZWRSK COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY
+C     NORMALIZING THE I FUNCTION RATIOS FROM ZRATI BY THE WRONSKIAN
+C
+C***ROUTINES CALLED  D1MACH,ZBKNU,ZRATI,XZABS
+C***END PROLOGUE  ZWRSK
+C     COMPLEX CINU,CSCL,CT,CW,C1,C2,RCT,ST,Y,ZR
+      DOUBLE PRECISION ACT, ACW, ALIM, ASCLE, CINUI, CINUR, CSCLR, CTI,
+     * CTR, CWI, CWR, C1I, C1R, C2I, C2R, ELIM, FNU, PTI, PTR, RACT,
+     * STI, STR, TOL, YI, YR, ZRI, ZRR, XZABS, D1MACH
+      INTEGER I, KODE, N, NW, NZ
+      DIMENSION YR(N), YI(N), CWR(2), CWI(2)
+C-----------------------------------------------------------------------
+C     I(FNU+I-1,Z) BY BACKWARD RECURRENCE FOR RATIOS
+C     Y(I)=I(FNU+I,Z)/I(FNU+I-1,Z) FROM CRATI NORMALIZED BY THE
+C     WRONSKIAN WITH K(FNU,Z) AND K(FNU+1,Z) FROM CBKNU.
+C-----------------------------------------------------------------------
+      NZ = 0
+      CALL ZBKNU(ZRR, ZRI, FNU, KODE, 2, CWR, CWI, NW, TOL, ELIM, ALIM)
+      IF (NW.NE.0) GO TO 50
+      CALL ZRATI(ZRR, ZRI, FNU, N, YR, YI, TOL)
+C-----------------------------------------------------------------------
+C     RECUR FORWARD ON I(FNU+1,Z) = R(FNU,Z)*I(FNU,Z),
+C     R(FNU+J-1,Z)=Y(J),  J=1,...,N
+C-----------------------------------------------------------------------
+      CINUR = 1.0D0
+      CINUI = 0.0D0
+      IF (KODE.EQ.1) GO TO 10
+      CINUR = DCOS(ZRI)
+      CINUI = DSIN(ZRI)
+   10 CONTINUE
+C-----------------------------------------------------------------------
+C     ON LOW EXPONENT MACHINES THE K FUNCTIONS CAN BE CLOSE TO BOTH
+C     THE UNDER AND OVERFLOW LIMITS AND THE NORMALIZATION MUST BE
+C     SCALED TO PREVENT OVER OR UNDERFLOW. CUOIK HAS DETERMINED THAT
+C     THE RESULT IS ON SCALE.
+C-----------------------------------------------------------------------
+      ACW = XZABS(CWR(2),CWI(2))
+      ASCLE = 1.0D+3*D1MACH(1)/TOL
+      CSCLR = 1.0D0
+      IF (ACW.GT.ASCLE) GO TO 20
+      CSCLR = 1.0D0/TOL
+      GO TO 30
+   20 CONTINUE
+      ASCLE = 1.0D0/ASCLE
+      IF (ACW.LT.ASCLE) GO TO 30
+      CSCLR = TOL
+   30 CONTINUE
+      C1R = CWR(1)*CSCLR
+      C1I = CWI(1)*CSCLR
+      C2R = CWR(2)*CSCLR
+      C2I = CWI(2)*CSCLR
+      STR = YR(1)
+      STI = YI(1)
+C-----------------------------------------------------------------------
+C     CINU=CINU*(CONJG(CT)/CABS(CT))*(1.0D0/CABS(CT) PREVENTS
+C     UNDER- OR OVERFLOW PREMATURELY BY SQUARING CABS(CT)
+C-----------------------------------------------------------------------
+      PTR = STR*C1R - STI*C1I
+      PTI = STR*C1I + STI*C1R
+      PTR = PTR + C2R
+      PTI = PTI + C2I
+      CTR = ZRR*PTR - ZRI*PTI
+      CTI = ZRR*PTI + ZRI*PTR
+      ACT = XZABS(CTR,CTI)
+      RACT = 1.0D0/ACT
+      CTR = CTR*RACT
+      CTI = -CTI*RACT
+      PTR = CINUR*RACT
+      PTI = CINUI*RACT
+      CINUR = PTR*CTR - PTI*CTI
+      CINUI = PTR*CTI + PTI*CTR
+      YR(1) = CINUR*CSCLR
+      YI(1) = CINUI*CSCLR
+      IF (N.EQ.1) RETURN
+      DO 40 I=2,N
+        PTR = STR*CINUR - STI*CINUI
+        CINUI = STR*CINUI + STI*CINUR
+        CINUR = PTR
+        STR = YR(I)
+        STI = YI(I)
+        YR(I) = CINUR*CSCLR
+        YI(I) = CINUI*CSCLR
+   40 CONTINUE
+      RETURN
+   50 CONTINUE
+      NZ = -1
+      IF(NW.EQ.(-2)) NZ=-2
+      RETURN
+      END
deleted file mode 100644
--- a/libcruft/specfun/Makefile.in
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# Makefile for octave's libcruft/specfun directory
-#
-# John W. Eaton
-# jwe@bevo.che.wisc.edu
-# University of Wisconsin-Madison
-# Department of Chemical Engineering
-
-TOPDIR = ../..
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-
-EXTERNAL_DISTFILES = $(DISTFILES)
-
-include $(TOPDIR)/Makeconf
-
-include ../Makerules
deleted file mode 100644
--- a/libcruft/specfun/ribesl.f
+++ /dev/null
@@ -1,441 +0,0 @@
-      SUBROUTINE RIBESL(X,ALPHA,NB,IZE,B,NCALC)
-C-------------------------------------------------------------------
-C
-C  This routine calculates Bessel functions I SUB(N+ALPHA) (X)
-C  for non-negative argument X, and non-negative order N+ALPHA,
-C  with or without exponential scaling.
-C
-C
-C Explanation of variables in the calling sequence
-C
-C X     - Working precision non-negative real argument for which
-C         I's or exponentially scaled I's (I*EXP(-X))
-C         are to be calculated.  If I's are to be calculated,
-C         X must be less than EXPARG (see below).
-C ALPHA - Working precision fractional part of order for which
-C         I's or exponentially scaled I's (I*EXP(-X)) are
-C         to be calculated.  0 .LE. ALPHA .LT. 1.0.
-C NB    - Integer number of functions to be calculated, NB .GT. 0.
-C         The first function calculated is of order ALPHA, and the 
-C         last is of order (NB - 1 + ALPHA).
-C IZE   - Integer type.  IZE = 1 if unscaled I's are to calculated,
-C         and 2 if exponentially scaled I's are to be calculated.
-C B     - Working precision output vector of length NB.  If the routine
-C         terminates normally (NCALC=NB), the vector B contains the 
-C         functions I(ALPHA,X) through I(NB-1+ALPHA,X), or the
-C         corresponding exponentially scaled functions.
-C NCALC - Integer output variable indicating possible errors.
-C         Before using the vector B, the user should check that
-C         NCALC=NB, i.e., all orders have been calculated to
-C         the desired accuracy.  See error returns below.
-C 
-C
-C*******************************************************************
-C*******************************************************************
-C
-C Explanation of machine-dependent constants
-C
-C   beta   = Radix for the floating-point system
-C   minexp = Smallest representable power of beta
-C   maxexp = Smallest power of beta that overflows
-C   it     = Number of bits in the mantissa of a working precision
-C            variable
-C   NSIG   = Decimal significance desired.  Should be set to
-C            INT(LOG10(2)*it+1).  Setting NSIG lower will result
-C            in decreased accuracy while setting NSIG higher will
-C            increase CPU time without increasing accuracy.  The
-C            truncation error is limited to a relative error of
-C            T=.5*10**(-NSIG).
-C   ENTEN  = 10.0 ** K, where K is the largest integer such that
-C            ENTEN is machine-representable in working precision
-C   ENSIG  = 10.0 ** NSIG
-C   RTNSIG = 10.0 ** (-K) for the smallest integer K such that
-C            K .GE. NSIG/4
-C   ENMTEN = Smallest ABS(X) such that X/4 does not underflow
-C   XLARGE = Upper limit on the magnitude of X when IZE=2.  Bear
-C            in mind that if ABS(X)=N, then at least N iterations
-C            of the backward recursion will be executed.  The value
-C            of 10.0 ** 4 is used on every machine.
-C   EXPARG = Largest working precision argument that the library
-C            EXP routine can handle and upper limit on the
-C            magnitude of X when IZE=1; approximately 
-C            LOG(beta**maxexp)
-C
-C
-C     Approximate values for some important machines are:
-C
-C                        beta       minexp      maxexp       it
-C
-C  CRAY-1        (S.P.)    2        -8193        8191        48
-C  Cyber 180/855
-C    under NOS   (S.P.)    2         -975        1070        48
-C  IEEE (IBM/XT,
-C    SUN, etc.)  (S.P.)    2         -126         128        24
-C  IEEE (IBM/XT,
-C    SUN, etc.)  (D.P.)    2        -1022        1024        53
-C  IBM 3033      (D.P.)   16          -65          63        14
-C  VAX           (S.P.)    2         -128         127        24
-C  VAX D-Format  (D.P.)    2         -128         127        56
-C  VAX G-Format  (D.P.)    2        -1024        1023        53
-C
-C
-C                        NSIG       ENTEN       ENSIG      RTNSIG
-C
-C CRAY-1        (S.P.)    15       1.0E+2465   1.0E+15     1.0E-4
-C Cyber 180/855
-C   under NOS   (S.P.)    15       1.0E+322    1.0E+15     1.0E-4
-C IEEE (IBM/XT,
-C   SUN, etc.)  (S.P.)     8       1.0E+38     1.0E+8      1.0E-2
-C IEEE (IBM/XT,
-C   SUN, etc.)  (D.P.)    16       1.0D+308    1.0D+16     1.0D-4
-C IBM 3033      (D.P.)     5       1.0D+75     1.0D+5      1.0D-2
-C VAX           (S.P.)     8       1.0E+38     1.0E+8      1.0E-2
-C VAX D-Format  (D.P.)    17       1.0D+38     1.0D+17     1.0D-5
-C VAX G-Format  (D.P.)    16       1.0D+307    1.0D+16     1.0D-4
-C
-C
-C                         ENMTEN      XLARGE   EXPARG 
-C
-C CRAY-1        (S.P.)   1.84E-2466   1.0E+4    5677 
-C Cyber 180/855
-C   under NOS   (S.P.)   1.25E-293    1.0E+4     741
-C IEEE (IBM/XT,
-C   SUN, etc.)  (S.P.)   4.70E-38     1.0E+4      88  
-C IEEE (IBM/XT,
-C   SUN, etc.)  (D.P.)   8.90D-308    1.0D+4     709
-C IBM 3033      (D.P.)   2.16D-78     1.0D+4     174
-C VAX           (S.P.)   1.17E-38     1.0E+4      88
-C VAX D-Format  (D.P.)   1.17D-38     1.0D+4      88
-C VAX G-Format  (D.P.)   2.22D-308    1.0D+4     709
-C
-C*******************************************************************
-C*******************************************************************
-C
-C Error returns
-C
-C  In case of an error,  NCALC .NE. NB, and not all I's are
-C  calculated to the desired accuracy.
-C
-C  NCALC .LT. 0:  An argument is out of range. For example,
-C     NB .LE. 0, IZE is not 1 or 2, or IZE=1 and ABS(X) .GE. EXPARG.
-C     In this case, the B-vector is not calculated, and NCALC is
-C     set to MIN0(NB,0)-1 so that NCALC .NE. NB.
-C
-C  NB .GT. NCALC .GT. 0: Not all requested function values could
-C     be calculated accurately.  This usually occurs because NB is
-C     much larger than ABS(X).  In this case, B(N) is calculated
-C     to the desired accuracy for N .LE. NCALC, but precision
-C     is lost for NCALC .LT. N .LE. NB.  If B(N) does not vanish
-C     for N .GT. NCALC (because it is too small to be represented),
-C     and B(N)/B(NCALC) = 10**(-K), then only the first NSIG-K
-C     significant figures of B(N) can be trusted.
-C
-C
-C Intrinsic functions required are:
-C
-C     DBLE, EXP, DGAMMA, GAMMA, INT, MAX, MIN, REAL, SQRT
-C
-C
-C Acknowledgement
-C
-C  This program is based on a program written by David J.
-C  Sookne (2) that computes values of the Bessel functions J or
-C  I of real argument and integer order.  Modifications include
-C  the restriction of the computation to the I Bessel function
-C  of non-negative real argument, the extension of the computation
-C  to arbitrary positive order, the inclusion of optional
-C  exponential scaling, and the elimination of most underflow.
-C  An earlier version was published in (3).
-C
-C References: "A Note on Backward Recurrence Algorithms," Olver,
-C              F. W. J., and Sookne, D. J., Math. Comp. 26, 1972,
-C              pp 941-947.
-C
-C             "Bessel Functions of Real Argument and Integer Order,"
-C              Sookne, D. J., NBS Jour. of Res. B. 77B, 1973, pp
-C              125-132.
-C
-C             "ALGORITHM 597, Sequence of Modified Bessel Functions
-C              of the First Kind," Cody, W. J., Trans. Math. Soft.,
-C              1983, pp. 242-245.
-C
-C  Latest modification: May 30, 1989
-C
-C  Modified by: W. J. Cody and L. Stoltz
-C               Applied Mathematics Division
-C               Argonne National Laboratory
-C               Argonne, IL  60439
-C
-C-------------------------------------------------------------------
-      LOGICAL FIRST
-      INTEGER IZE,K,L,MAGX,N,NB,NBMX,NCALC,NEND,NSIG,NSTART
-      DOUBLE PRECISION DGAMMA, D1MACH,
-     1 ALPHA,B,CONST,CONV,EM,EMPAL,EMP2AL,EN,ENMTEN,ENSIG,
-     2 ENTEN,EXPARG,FUNC,HALF,HALFX,ONE,P,PLAST,POLD,PSAVE,PSAVEL,
-     3 RTNSIG,SUM,TEMPA,TEMPB,TEMPC,TEST,TOVER,TWO,X,XLARGE,ZERO
-      DIMENSION B(NB)
-C-------------------------------------------------------------------
-C  Mathematical constants
-C-------------------------------------------------------------------
-      PARAMETER (ONE = 1.0D0, TWO = 2.0D0, ZERO = 0.0D0)
-      PARAMETER (HALF = 0.5D0, CONST = 1.585D0)
-C-------------------------------------------------------------------
-      DATA FIRST /.TRUE./
-C-------------------------------------------------------------------
-      SAVE FIRST, NSIG, ENTEN, ENSIG, RTNSIG, ENMTEN, EXPARG, XLARGE
-C-------------------------------------------------------------------
-C  Statement functions for conversion
-C-------------------------------------------------------------------
-      CONV(N) = DBLE(N)
-      FUNC(X) = DGAMMA(X)
-C-------------------------------------------------------------------
-C  Machine-dependent parameters
-C-------------------------------------------------------------------
-      IF (FIRST) THEN
-        NSIG = NINT (-LOG (D1MACH (4)))
-        ENTEN = 1.0D1 ** (INT (LOG10 (D1MACH (2))))
-        ENSIG = 1.0D1 ** NSIG
-        RTNSIG = 1.0D1 ** (-NINT (NSIG / 4.0))
-        ENMTEN = 4.0D0 * D1MACH (1)
-        EXPARG = LOG (D1MACH (2))
-        XLARGE = 1.0D4
-        FIRST = .FALSE.
-      ENDIF
-C-------------------------------------------------------------------
-C Check for X, NB, OR IZE out of range.
-C-------------------------------------------------------------------
-      IF ((NB.GT.0) .AND. (X .GE. ZERO) .AND.
-     1    (ALPHA .GE. ZERO) .AND. (ALPHA .LT. ONE) .AND.
-     2    (((IZE .EQ. 1) .AND. (X .LE. EXPARG)) .OR.
-     3     ((IZE .EQ. 2) .AND. (X .LE. XLARGE)))) THEN
-C-------------------------------------------------------------------
-C Use 2-term ascending series for small X
-C-------------------------------------------------------------------
-            NCALC = NB
-            MAGX = INT(X)
-            IF (X .GE. RTNSIG) THEN
-C-------------------------------------------------------------------
-C Initialize the forward sweep, the P-sequence of Olver
-C-------------------------------------------------------------------
-                  NBMX = NB-MAGX
-                  N = MAGX+1
-                  EN = CONV(N+N) + (ALPHA+ALPHA)
-                  PLAST = ONE
-                  P = EN / X
-C-------------------------------------------------------------------
-C Calculate general significance test
-C-------------------------------------------------------------------
-                  TEST = ENSIG + ENSIG
-                  IF (2*MAGX .GT. 5*NSIG) THEN
-                        TEST = SQRT(TEST*P)
-                     ELSE
-                        TEST = TEST / CONST**MAGX
-                  END IF
-                  IF (NBMX .GE. 3) THEN
-C-------------------------------------------------------------------
-C Calculate P-sequence until N = NB-1.  Check for possible overflow.
-C-------------------------------------------------------------------
-                     TOVER = ENTEN / ENSIG
-                     NSTART = MAGX+2
-                     NEND = NB - 1
-                     DO 100 K = NSTART, NEND
-                        N = K
-                        EN = EN + TWO
-                        POLD = PLAST
-                        PLAST = P
-                        P = EN * PLAST/X + POLD
-                        IF (P .GT. TOVER) THEN
-C-------------------------------------------------------------------
-C To avoid overflow, divide P-sequence by TOVER.  Calculate
-C P-sequence until ABS(P) .GT. 1.
-C-------------------------------------------------------------------
-                           TOVER = ENTEN
-                           P = P / TOVER
-                           PLAST = PLAST / TOVER
-                           PSAVE = P
-                           PSAVEL = PLAST
-                           NSTART = N + 1
-   60                      N = N + 1
-                              EN = EN + TWO
-                              POLD = PLAST
-                              PLAST = P
-                              P = EN * PLAST/X + POLD
-                           IF (P .LE. ONE) GO TO 60
-                           TEMPB = EN / X
-C-------------------------------------------------------------------
-C Calculate backward test, and find NCALC, the highest N
-C such that the test is passed.
-C-------------------------------------------------------------------
-                           TEST = POLD*PLAST / ENSIG
-                           TEST = TEST*(HALF-HALF/(TEMPB*TEMPB))
-                           P = PLAST * TOVER
-                           N = N - 1
-                           EN = EN - TWO
-                           NEND = MIN0(NB,N)
-                           DO 80 L = NSTART, NEND
-                              NCALC = L
-                              POLD = PSAVEL
-                              PSAVEL = PSAVE
-                              PSAVE = EN * PSAVEL/X + POLD
-                              IF (PSAVE*PSAVEL .GT. TEST) GO TO 90
-   80                      CONTINUE
-                           NCALC = NEND + 1
-   90                      NCALC = NCALC - 1
-                           GO TO 120
-                        END IF
-  100                CONTINUE
-                     N = NEND
-                     EN = CONV(N+N) + (ALPHA+ALPHA)
-C-------------------------------------------------------------------
-C Calculate special significance test for NBMX .GT. 2.
-C-------------------------------------------------------------------
-                     TEST = MAX(TEST,SQRT(PLAST*ENSIG)*SQRT(P+P))
-                  END IF
-C-------------------------------------------------------------------
-C Calculate P-sequence until significance test passed.
-C-------------------------------------------------------------------
-  110             N = N + 1
-                     EN = EN + TWO
-                     POLD = PLAST
-                     PLAST = P
-                     P = EN * PLAST/X + POLD
-                  IF (P .LT. TEST) GO TO 110
-C-------------------------------------------------------------------
-C Initialize the backward recursion and the normalization sum.
-C-------------------------------------------------------------------
-  120             N = N + 1
-                  EN = EN + TWO
-                  TEMPB = ZERO
-                  TEMPA = ONE / P
-                  EM = CONV(N) - ONE
-                  EMPAL = EM + ALPHA
-                  EMP2AL = (EM - ONE) + (ALPHA + ALPHA)
-                  SUM = TEMPA * EMPAL * EMP2AL / EM
-                  NEND = N - NB
-                  IF (NEND .LT. 0) THEN
-C-------------------------------------------------------------------
-C N .LT. NB, so store B(N) and set higher orders to zero.
-C-------------------------------------------------------------------
-                        B(N) = TEMPA
-                        NEND = -NEND
-                        DO 130 L = 1, NEND
-  130                      B(N+L) = ZERO
-                     ELSE
-                        IF (NEND .GT. 0) THEN
-C-------------------------------------------------------------------
-C Recur backward via difference equation, calculating (but
-C not storing) B(N), until N = NB.
-C-------------------------------------------------------------------
-                           DO 140 L = 1, NEND
-                              N = N - 1
-                              EN = EN - TWO
-                              TEMPC = TEMPB
-                              TEMPB = TEMPA
-                              TEMPA = (EN*TEMPB) / X + TEMPC
-                              EM = EM - ONE
-                              EMP2AL = EMP2AL - ONE
-                              IF (N .EQ. 1) GO TO 150
-                              IF (N .EQ. 2) EMP2AL = ONE
-                              EMPAL = EMPAL - ONE
-                              SUM = (SUM + TEMPA*EMPAL) * EMP2AL / EM
-  140                      CONTINUE
-                        END IF
-C-------------------------------------------------------------------
-C Store B(NB)
-C-------------------------------------------------------------------
-  150                   B(N) = TEMPA
-                        IF (NB .LE. 1) THEN
-                           SUM = (SUM + SUM) + TEMPA
-                           GO TO 230
-                        END IF
-C-------------------------------------------------------------------
-C Calculate and Store B(NB-1)
-C-------------------------------------------------------------------
-                        N = N - 1
-                        EN = EN - TWO
-                        B(N)  = (EN*TEMPA) / X + TEMPB
-                        IF (N .EQ. 1) GO TO 220
-                        EM = EM - ONE
-                        EMP2AL = EMP2AL - ONE
-                        IF (N .EQ. 2) EMP2AL = ONE
-                        EMPAL = EMPAL - ONE
-                        SUM = (SUM + B(N)*EMPAL) * EMP2AL / EM
-                  END IF
-                  NEND = N - 2
-                  IF (NEND .GT. 0) THEN
-C-------------------------------------------------------------------
-C Calculate via difference equation and store B(N), until N = 2.
-C-------------------------------------------------------------------
-                     DO 200 L = 1, NEND
-                        N = N - 1
-                        EN = EN - TWO
-                        B(N) = (EN*B(N+1)) / X +B(N+2)
-                        EM = EM - ONE
-                        EMP2AL = EMP2AL - ONE
-                        IF (N .EQ. 2) EMP2AL = ONE
-                        EMPAL = EMPAL - ONE
-                        SUM = (SUM + B(N)*EMPAL) * EMP2AL / EM
-  200                CONTINUE
-                  END IF
-C-------------------------------------------------------------------
-C Calculate B(1)
-C-------------------------------------------------------------------
-                  B(1) = TWO*EMPAL*B(2) / X + B(3)
-  220             SUM = (SUM + SUM) + B(1)
-C-------------------------------------------------------------------
-C Normalize.  Divide all B(N) by sum.
-C-------------------------------------------------------------------
-  230             IF (ALPHA .NE. ZERO)
-     1               SUM = SUM * FUNC(ONE+ALPHA) * (X*HALF)**(-ALPHA)
-                  IF (IZE .EQ. 1) SUM = SUM * EXP(-X)
-                  TEMPA = ENMTEN
-                  IF (SUM .GT. ONE) TEMPA = TEMPA * SUM
-                  DO 260 N = 1, NB
-                     IF (B(N) .LT. TEMPA) B(N) = ZERO
-                     B(N) = B(N) / SUM
-  260             CONTINUE
-                  RETURN
-C-------------------------------------------------------------------
-C Two-term ascending series for small X.
-C-------------------------------------------------------------------
-               ELSE
-                  TEMPA = ONE
-                  EMPAL = ONE + ALPHA
-                  HALFX = ZERO
-                  IF (X .GT. ENMTEN) HALFX = HALF * X
-                  IF (ALPHA .NE. ZERO) TEMPA = HALFX**ALPHA /FUNC(EMPAL)
-                  IF (IZE .EQ. 2) TEMPA = TEMPA * EXP(-X)
-                  TEMPB = ZERO
-                  IF ((X+ONE) .GT. ONE) TEMPB = HALFX * HALFX
-                  B(1) = TEMPA + TEMPA*TEMPB / EMPAL
-                  IF ((X .NE. ZERO) .AND. (B(1) .EQ. ZERO)) NCALC = 0
-                  IF (NB .GT. 1) THEN
-                     IF (X .EQ. ZERO) THEN
-                           DO 310 N = 2, NB
-                              B(N) = ZERO
-  310                      CONTINUE
-                        ELSE
-C-------------------------------------------------------------------
-C Calculate higher-order functions.
-C-------------------------------------------------------------------
-                           TEMPC = HALFX
-                           TOVER = (ENMTEN + ENMTEN) / X
-                           IF (TEMPB .NE. ZERO) TOVER = ENMTEN / TEMPB
-                           DO 340 N = 2, NB
-                              TEMPA = TEMPA / EMPAL
-                              EMPAL = EMPAL + ONE
-                              TEMPA = TEMPA * TEMPC
-                              IF (TEMPA .LE. TOVER*EMPAL) TEMPA = ZERO
-                              B(N) = TEMPA + TEMPA*TEMPB / EMPAL
-                              IF ((B(N) .EQ. ZERO) .AND. (NCALC .GT. N))
-     1                             NCALC = N-1
-  340                      CONTINUE
-                     END IF
-                  END IF
-            END IF
-         ELSE
-            NCALC = MIN0(NB,0)-1
-      END IF
-      RETURN
-C---------- Last line of RIBESL ----------
-      END
deleted file mode 100644
--- a/libcruft/specfun/rjbesl.f
+++ /dev/null
@@ -1,504 +0,0 @@
-      SUBROUTINE RJBESL(X, ALPHA, NB, B, NCALC)
-C---------------------------------------------------------------------
-C This routine calculates Bessel functions J sub(N+ALPHA) (X)
-C   for non-negative argument X, and non-negative order N+ALPHA.
-C
-C
-C  Explanation of variables in the calling sequence.
-C
-C   X     - working precision non-negative real argument for which
-C           J's are to be calculated.
-C   ALPHA - working precision fractional part of order for which
-C           J's or exponentially scaled J'r (J*exp(X)) are
-C           to be calculated.  0 <= ALPHA < 1.0.
-C   NB  - integer number of functions to be calculated, NB > 0.
-C           The first function calculated is of order ALPHA, and the
-C           last is of order (NB - 1 + ALPHA).
-C   B  - working precision output vector of length NB.  If RJBESL
-C           terminates normally (NCALC=NB), the vector B contains the
-C           functions J/ALPHA/(X) through J/NB-1+ALPHA/(X), or the
-C           corresponding exponentially scaled functions.
-C   NCALC - integer output variable indicating possible errors.
-C           Before using the vector B, the user should check that
-C           NCALC=NB, i.e., all orders have been calculated to
-C           the desired accuracy.  See Error Returns below.
-C
-C
-C*******************************************************************
-C*******************************************************************
-C
-C  Explanation of machine-dependent constants
-C
-C   it     = Number of bits in the mantissa of a working precision
-C            variable
-C   NSIG   = Decimal significance desired.  Should be set to
-C            INT(LOG10(2)*it+1).  Setting NSIG lower will result
-C            in decreased accuracy while setting NSIG higher will
-C            increase CPU time without increasing accuracy.  The
-C            truncation error is limited to a relative error of
-C            T=.5*10**(-NSIG).
-C   ENTEN  = 10.0 ** K, where K is the largest integer such that
-C            ENTEN is machine-representable in working precision
-C   ENSIG  = 10.0 ** NSIG
-C   RTNSIG = 10.0 ** (-K) for the smallest integer K such that
-C            K .GE. NSIG/4
-C   ENMTEN = Smallest ABS(X) such that X/4 does not underflow
-C   XLARGE = Upper limit on the magnitude of X.  If ABS(X)=N,
-C            then at least N iterations of the backward recursion
-C            will be executed.  The value of 10.0 ** 4 is used on
-C            every machine.
-C
-C
-C     Approximate values for some important machines are:
-C
-C
-C                            it    NSIG    ENTEN       ENSIG
-C
-C   CRAY-1        (S.P.)     48     15    1.0E+2465   1.0E+15
-C   Cyber 180/855
-C     under NOS   (S.P.)     48     15    1.0E+322    1.0E+15
-C   IEEE (IBM/XT,
-C     SUN, etc.)  (S.P.)     24      8    1.0E+38     1.0E+8
-C   IEEE (IBM/XT,
-C     SUN, etc.)  (D.P.)     53     16    1.0D+308    1.0D+16
-C   IBM 3033      (D.P.)     14      5    1.0D+75     1.0D+5
-C   VAX           (S.P.)     24      8    1.0E+38     1.0E+8
-C   VAX D-Format  (D.P.)     56     17    1.0D+38     1.0D+17
-C   VAX G-Format  (D.P.)     53     16    1.0D+307    1.0D+16
-C
-C
-C                           RTNSIG      ENMTEN      XLARGE
-C
-C   CRAY-1        (S.P.)    1.0E-4    1.84E-2466   1.0E+4
-C   Cyber 180/855
-C     under NOS   (S.P.)    1.0E-4    1.25E-293    1.0E+4
-C   IEEE (IBM/XT,
-C     SUN, etc.)  (S.P.)    1.0E-2    4.70E-38     1.0E+4
-C   IEEE (IBM/XT,
-C     SUN, etc.)  (D.P.)    1.0E-4    8.90D-308    1.0D+4
-C   IBM 3033      (D.P.)    1.0E-2    2.16D-78     1.0D+4
-C   VAX           (S.P.)    1.0E-2    1.17E-38     1.0E+4
-C   VAX D-Format  (D.P.)    1.0E-5    1.17D-38     1.0D+4
-C   VAX G-Format  (D.P.)    1.0E-4    2.22D-308    1.0D+4
-C
-C*******************************************************************
-C*******************************************************************
-C
-C  Error returns
-C
-C    In case of an error,  NCALC .NE. NB, and not all J's are
-C    calculated to the desired accuracy.
-C
-C    NCALC .LT. 0:  An argument is out of range. For example,
-C       NBES .LE. 0, ALPHA .LT. 0 or .GT. 1, or X is too large.
-C       In this case, B(1) is set to zero, the remainder of the
-C       B-vector is not calculated, and NCALC is set to
-C       MIN(NB,0)-1 so that NCALC .NE. NB.
-C
-C    NB .GT. NCALC .GT. 0: Not all requested function values could
-C       be calculated accurately.  This usually occurs because NB is
-C       much larger than ABS(X).  In this case, B(N) is calculated
-C       to the desired accuracy for N .LE. NCALC, but precision
-C       is lost for NCALC .LT. N .LE. NB.  If B(N) does not vanish
-C       for N .GT. NCALC (because it is too small to be represented),
-C       and B(N)/B(NCALC) = 10**(-K), then only the first NSIG-K
-C       significant figures of B(N) can be trusted.
-C
-C
-C  Intrinsic and other functions required are:
-C
-C     ABS, AINT, COS, DBLE, GAMMA (or DGAMMA), INT, MAX, MIN,
-C
-C     REAL, SIN, SQRT
-C
-C
-C  Acknowledgement
-C
-C   This program is based on a program written by David J. Sookne
-C   (2) that computes values of the Bessel functions J or I of real
-C   argument and integer order.  Modifications include the restriction
-C   of the computation to the J Bessel function of non-negative real
-C   argument, the extension of the computation to arbitrary positive
-C   order, and the elimination of most underflow.
-C
-C  References: "A Note on Backward Recurrence Algorithms," Olver,
-C               F. W. J., and Sookne, D. J., Math. Comp. 26, 1972,
-C               pp 941-947.
-C
-C              "Bessel Functions of Real Argument and Integer Order,"
-C               Sookne, D. J., NBS Jour. of Res. B. 77B, 1973, pp
-C               125-132.
-C
-C  Latest modification: March 19, 1990
-C
-C  Author: W. J. Cody
-C          Applied Mathematics Division
-C          Argonne National Laboratory
-C          Argonne, IL  60439
-C
-C---------------------------------------------------------------------
-      LOGICAL FIRST
-      INTEGER I,J,K,L,M,MAGX,N,NB,NBMX,NCALC,NEND,NSIG,NSTART
-      DOUBLE PRECISION  DGAMMA, D1MACH,
-     1 ALPHA,ALPEM,ALP2EM,B,CAPP,CAPQ,CONV,EIGHTH,EM,EN,ENMTEN,ENSIG,
-     2 ENTEN,FACT,FOUR,FUNC,GNU,HALF,HALFX,ONE,ONE30,P,PI2,PLAST,
-     3 POLD,PSAVE,PSAVEL,RTNSIG,S,SUM,T,T1,TEMPA,TEMPB,TEMPC,TEST,
-     4 THREE,THREE5,TOVER,TWO,TWOFIV,TWOPI1,TWOPI2,X,XC,XIN,XK,XLARGE,
-     5 XM,VCOS,VSIN,Z,ZERO
-      DIMENSION B(NB), FACT(25)
-C---------------------------------------------------------------------
-C  Mathematical constants
-C
-C   PI2    - 2 / PI
-C   TWOPI1 - first few significant digits of 2 * PI
-C   TWOPI2 - (2*PI - TWOPI) to working precision, i.e.,
-C            TWOPI1 + TWOPI2 = 2 * PI to extra precision.
-C---------------------------------------------------------------------
-      PARAMETER (PI2 = 0.636619772367581343075535D0)
-      PARAMETER (TWOPI1 = 6.28125D0)
-      PARAMETER (TWOPI2 = 1.935307179586476925286767D-3)
-      PARAMETER (ZERO = 0.0D0, EIGHTH = 0.125D0, HALF = 0.5D0)
-      PARAMETER (ONE = 1.0D0, TWO = 2.0D0, THREE = 3.0D0)
-      PARAMETER (FOUR = 4.0D0, TWOFIV = 2.5D1, ONE30 = 1.3D2)
-      PARAMETER (THREE5 = 3.5D1)
-C---------------------------------------------------------------------
-C     Factorial(N)
-C---------------------------------------------------------------------
-      DATA FACT /1.0D0,1.0D0,2.0D0,6.0D0,24.0D0,1.2D2,7.2D2,5.04D3,
-     1 4.032D4,3.6288D5,3.6288D6,3.99168D7,4.790016D8,6.2270208D9,
-     2 8.71782912D10,1.307674368D12,2.0922789888D13,3.55687428096D14,
-     3 6.402373705728D15,1.21645100408832D17,2.43290200817664D18,
-     4 5.109094217170944D19,1.12400072777760768D21,
-     5 2.585201673888497664D22,6.2044840173323943936D23/
-C---------------------------------------------------------------------
-      DATA FIRST /.TRUE./
-C---------------------------------------------------------------------
-      SAVE FACT, FIRST, NSIG, ENTEN, ENSIG, RTNSIG, ENMTEN, XLARGE
-C---------------------------------------------------------------------
-C Statement functions for conversion and the gamma function.
-C---------------------------------------------------------------------
-      CONV(I) = DBLE(I)
-      FUNC(X) = DGAMMA(X)
-C---------------------------------------------------------------------
-C  Machine-dependent parameters
-C---------------------------------------------------------------------
-      IF (FIRST) THEN
-        NSIG = NINT (-LOG (D1MACH (4)))
-        ENTEN = 1.0D1 ** (INT (LOG10 (D1MACH (2))))
-        ENSIG = 1.0D1 ** NSIG
-        RTNSIG = 1.0D1 ** (-NINT (NSIG / 4.0))
-        ENMTEN = 4.0D0 * D1MACH (1)
-        XLARGE = 1.0D4
-        FIRST = .FALSE.
-      ENDIF
-C---------------------------------------------------------------------
-C Check for out of range arguments.
-C---------------------------------------------------------------------
-      MAGX = INT(X)
-      IF ((NB.GT.0) .AND. (X.GE.ZERO) .AND. (X.LE.XLARGE) 
-     1       .AND. (ALPHA.GE.ZERO) .AND. (ALPHA.LT.ONE))  
-     2   THEN
-C---------------------------------------------------------------------
-C Initialize result array to zero.
-C---------------------------------------------------------------------
-            NCALC = NB
-            DO 20 I=1,NB
-              B(I) = ZERO
-   20       CONTINUE
-C---------------------------------------------------------------------
-C Branch to use 2-term ascending series for small X and asymptotic
-C form for large X when NB is not too large.
-C---------------------------------------------------------------------
-            IF (X.LT.RTNSIG) THEN
-C---------------------------------------------------------------------
-C Two-term ascending series for small X.
-C---------------------------------------------------------------------
-               TEMPA = ONE
-               ALPEM = ONE + ALPHA
-               HALFX = ZERO
-               IF (X.GT.ENMTEN) HALFX = HALF*X
-               IF (ALPHA.NE.ZERO)
-     1            TEMPA = HALFX**ALPHA/(ALPHA*FUNC(ALPHA))
-               TEMPB = ZERO
-               IF ((X+ONE).GT.ONE) TEMPB = -HALFX*HALFX
-               B(1) = TEMPA + TEMPA*TEMPB/ALPEM
-               IF ((X.NE.ZERO) .AND. (B(1).EQ.ZERO)) NCALC = 0
-               IF (NB .NE. 1) THEN
-                  IF (X .LE. ZERO) THEN
-                        DO 30 N=2,NB
-                          B(N) = ZERO
-   30                   CONTINUE
-                     ELSE
-C---------------------------------------------------------------------
-C Calculate higher order functions.
-C---------------------------------------------------------------------
-                        TEMPC = HALFX
-                        TOVER = (ENMTEN+ENMTEN)/X
-                        IF (TEMPB.NE.ZERO) TOVER = ENMTEN/TEMPB
-                        DO 50 N=2,NB
-                          TEMPA = TEMPA/ALPEM
-                          ALPEM = ALPEM + ONE
-                          TEMPA = TEMPA*TEMPC
-                          IF (TEMPA.LE.TOVER*ALPEM) TEMPA = ZERO
-                          B(N) = TEMPA + TEMPA*TEMPB/ALPEM
-                          IF ((B(N).EQ.ZERO) .AND. (NCALC.GT.N))
-     1                       NCALC = N-1
-   50                   CONTINUE
-                  END IF
-               END IF
-            ELSE IF ((X.GT.TWOFIV) .AND. (NB.LE.MAGX+1)) THEN
-C---------------------------------------------------------------------
-C Asymptotic series for X .GT. 21.0.
-C---------------------------------------------------------------------
-               XC = SQRT(PI2/X)
-               XIN = (EIGHTH/X)**2
-               M = 11
-               IF (X.GE.THREE5) M = 8
-               IF (X.GE.ONE30) M = 4
-               XM = FOUR*CONV(M)
-C---------------------------------------------------------------------
-C Argument reduction for SIN and COS routines.
-C---------------------------------------------------------------------
-               T = AINT(X/(TWOPI1+TWOPI2)+HALF)
-               Z = ((X-T*TWOPI1)-T*TWOPI2) - (ALPHA+HALF)/PI2
-               VSIN = SIN(Z)
-               VCOS = COS(Z)
-               GNU = ALPHA + ALPHA
-               DO 80 I=1,2
-                 S = ((XM-ONE)-GNU)*((XM-ONE)+GNU)*XIN*HALF
-                 T = (GNU-(XM-THREE))*(GNU+(XM-THREE))
-                 CAPP = S*T/FACT(2*M+1)
-                 T1 = (GNU-(XM+ONE))*(GNU+(XM+ONE))
-                 CAPQ = S*T1/FACT(2*M+2)
-                 XK = XM
-                 K = M + M
-                 T1 = T
-                 DO 70 J=2,M
-                   XK = XK - FOUR
-                   S = ((XK-ONE)-GNU)*((XK-ONE)+GNU)
-                   T = (GNU-(XK-THREE))*(GNU+(XK-THREE))
-                   CAPP = (CAPP+ONE/FACT(K-1))*S*T*XIN
-                   CAPQ = (CAPQ+ONE/FACT(K))*S*T1*XIN
-                   K = K - 2
-                   T1 = T
-   70            CONTINUE
-                 CAPP = CAPP + ONE
-                 CAPQ = (CAPQ+ONE)*(GNU*GNU-ONE)*(EIGHTH/X)
-                 B(I) = XC*(CAPP*VCOS-CAPQ*VSIN)
-                 IF (NB.EQ.1) GO TO 300
-                 T = VSIN
-                 VSIN = -VCOS
-                 VCOS = T
-                 GNU = GNU + TWO
-   80         CONTINUE
-C---------------------------------------------------------------------
-C If  NB .GT. 2, compute J(X,ORDER+I)  I = 2, NB-1
-C---------------------------------------------------------------------
-               IF (NB .GT. 2) THEN
-                  GNU = ALPHA + ALPHA + TWO
-                  DO 90 J=3,NB
-                    B(J) = GNU*B(J-1)/X - B(J-2)
-                    GNU = GNU + TWO
-   90             CONTINUE
-               END IF
-C---------------------------------------------------------------------
-C Use recurrence to generate results.  First initialize the
-C calculation of P*S.
-C---------------------------------------------------------------------
-            ELSE
-               NBMX = NB - MAGX
-               N = MAGX + 1
-               EN = CONV(N+N) + (ALPHA+ALPHA)
-               PLAST = ONE
-               P = EN/X
-C---------------------------------------------------------------------
-C Calculate general significance test.
-C---------------------------------------------------------------------
-               TEST = ENSIG + ENSIG
-               IF (NBMX .GE. 3) THEN
-C---------------------------------------------------------------------
-C Calculate P*S until N = NB-1.  Check for possible overflow.
-C---------------------------------------------------------------------
-                  TOVER = ENTEN/ENSIG
-                  NSTART = MAGX + 2
-                  NEND = NB - 1
-                  EN = CONV(NSTART+NSTART) - TWO + (ALPHA+ALPHA)
-                  DO 130 K=NSTART,NEND
-                     N = K
-                     EN = EN + TWO
-                     POLD = PLAST
-                     PLAST = P
-                     P = EN*PLAST/X - POLD
-                     IF (P.GT.TOVER) THEN
-C---------------------------------------------------------------------
-C To avoid overflow, divide P*S by TOVER.  Calculate P*S until
-C ABS(P) .GT. 1.
-C---------------------------------------------------------------------
-                        TOVER = ENTEN
-                        P = P/TOVER
-                        PLAST = PLAST/TOVER
-                        PSAVE = P
-                        PSAVEL = PLAST
-                        NSTART = N + 1
-  100                   N = N + 1
-                           EN = EN + TWO
-                           POLD = PLAST
-                           PLAST = P
-                           P = EN*PLAST/X - POLD
-                        IF (P.LE.ONE) GO TO 100
-                        TEMPB = EN/X
-C---------------------------------------------------------------------
-C Calculate backward test and find NCALC, the highest N such that
-C the test is passed.
-C---------------------------------------------------------------------
-                        TEST = POLD*PLAST*(HALF-HALF/(TEMPB*TEMPB))
-                        TEST = TEST/ENSIG
-                        P = PLAST*TOVER
-                        N = N - 1
-                        EN = EN - TWO
-                        NEND = MIN(NB,N)
-                        DO 110 L=NSTART,NEND
-                           POLD = PSAVEL
-                           PSAVEL = PSAVE
-                           PSAVE = EN*PSAVEL/X - POLD
-                           IF (PSAVE*PSAVEL.GT.TEST) THEN
-                              NCALC = L - 1
-                              GO TO 190
-                           END IF
-  110                   CONTINUE
-                        NCALC = NEND
-                        GO TO 190
-                     END IF
-  130             CONTINUE
-                  N = NEND
-                  EN = CONV(N+N) + (ALPHA+ALPHA)
-C---------------------------------------------------------------------
-C Calculate special significance test for NBMX .GT. 2.
-C---------------------------------------------------------------------
-                  TEST = MAX(TEST,SQRT(PLAST*ENSIG)*SQRT(P+P))
-               END IF
-C---------------------------------------------------------------------
-C Calculate P*S until significance test passes.
-C---------------------------------------------------------------------
-  140          N = N + 1
-                  EN = EN + TWO
-                  POLD = PLAST
-                  PLAST = P
-                  P = EN*PLAST/X - POLD
-               IF (P.LT.TEST) GO TO 140
-C---------------------------------------------------------------------
-C Initialize the backward recursion and the normalization sum.
-C---------------------------------------------------------------------
-  190          N = N + 1
-               EN = EN + TWO
-               TEMPB = ZERO
-               TEMPA = ONE/P
-               M = 2*N - 4*(N/2)
-               SUM = ZERO
-               EM = CONV(N/2)
-               ALPEM = (EM-ONE) + ALPHA
-               ALP2EM = (EM+EM) + ALPHA
-               IF (M .NE. 0) SUM = TEMPA*ALPEM*ALP2EM/EM
-               NEND = N - NB
-               IF (NEND .GT. 0) THEN
-C---------------------------------------------------------------------
-C Recur backward via difference equation, calculating (but not
-C storing) B(N), until N = NB.
-C---------------------------------------------------------------------
-                  DO 200 L=1,NEND
-                     N = N - 1
-                     EN = EN - TWO
-                     TEMPC = TEMPB
-                     TEMPB = TEMPA
-                     TEMPA = (EN*TEMPB)/X - TEMPC
-                     M = 2 - M
-                     IF (M .NE. 0) THEN
-                        EM = EM - ONE
-                        ALP2EM = (EM+EM) + ALPHA
-                        IF (N.EQ.1) GO TO 210
-                        ALPEM = (EM-ONE) + ALPHA
-                        IF (ALPEM.EQ.ZERO) ALPEM = ONE
-                        SUM = (SUM+TEMPA*ALP2EM)*ALPEM/EM
-                     END IF
-  200             CONTINUE
-               END IF
-C---------------------------------------------------------------------
-C Store B(NB).
-C---------------------------------------------------------------------
-  210          B(N) = TEMPA
-               IF (NEND .GE. 0) THEN
-                  IF (NB .LE. 1) THEN
-                        ALP2EM = ALPHA
-                        IF ((ALPHA+ONE).EQ.ONE) ALP2EM = ONE
-                        SUM = SUM + B(1)*ALP2EM
-                        GO TO 250
-                     ELSE
-C---------------------------------------------------------------------
-C Calculate and store B(NB-1).
-C---------------------------------------------------------------------
-                        N = N - 1
-                        EN = EN - TWO
-                        B(N) = (EN*TEMPA)/X - TEMPB
-                        IF (N.EQ.1) GO TO 240
-                        M = 2 - M
-                        IF (M .NE. 0) THEN
-                           EM = EM - ONE
-                           ALP2EM = (EM+EM) + ALPHA
-                           ALPEM = (EM-ONE) + ALPHA
-                           IF (ALPEM.EQ.ZERO) ALPEM = ONE
-                           SUM = (SUM+B(N)*ALP2EM)*ALPEM/EM
-                        END IF
-                  END IF
-               END IF
-               NEND = N - 2
-               IF (NEND .NE. 0) THEN
-C---------------------------------------------------------------------
-C Calculate via difference equation and store B(N), until N = 2.
-C---------------------------------------------------------------------
-                  DO 230 L=1,NEND
-                     N = N - 1
-                     EN = EN - TWO
-                     B(N) = (EN*B(N+1))/X - B(N+2)
-                     M = 2 - M
-                     IF (M .NE. 0) THEN
-                        EM = EM - ONE
-                        ALP2EM = (EM+EM) + ALPHA
-                        ALPEM = (EM-ONE) + ALPHA
-                        IF (ALPEM.EQ.ZERO) ALPEM = ONE
-                        SUM = (SUM+B(N)*ALP2EM)*ALPEM/EM
-                     END IF
-  230             CONTINUE
-               END IF
-C---------------------------------------------------------------------
-C Calculate B(1).
-C---------------------------------------------------------------------
-               B(1) = TWO*(ALPHA+ONE)*B(2)/X - B(3)
-  240          EM = EM - ONE
-               ALP2EM = (EM+EM) + ALPHA
-               IF (ALP2EM.EQ.ZERO) ALP2EM = ONE
-               SUM = SUM + B(1)*ALP2EM
-C---------------------------------------------------------------------
-C Normalize.  Divide all B(N) by sum.
-C---------------------------------------------------------------------
-  250          IF ((ALPHA+ONE).NE.ONE)
-     1              SUM = SUM*FUNC(ALPHA)*(X*HALF)**(-ALPHA)
-               TEMPA = ENMTEN
-               IF (SUM.GT.ONE) TEMPA = TEMPA*SUM
-               DO 260 N=1,NB
-                 IF (ABS(B(N)).LT.TEMPA) B(N) = ZERO
-                 B(N) = B(N)/SUM
-  260          CONTINUE
-            END IF
-C---------------------------------------------------------------------
-C Error return -- X, NB, or ALPHA is out of range.
-C---------------------------------------------------------------------
-         ELSE
-            B(1) = ZERO
-            NCALC = MIN(NB,0) - 1
-      END IF
-C---------------------------------------------------------------------
-C Exit
-C---------------------------------------------------------------------
-  300 RETURN
-C ---------- Last line of RJBESL ----------
-      END
deleted file mode 100644
--- a/libcruft/specfun/rkbesl.f
+++ /dev/null
@@ -1,479 +0,0 @@
-      SUBROUTINE RKBESL(X,ALPHA,NB,IZE,BK,NCALC)
-C-------------------------------------------------------------------
-C
-C  This FORTRAN 77 routine calculates modified Bessel functions
-C  of the second kind, K SUB(N+ALPHA) (X), for non-negative
-C  argument X, and non-negative order N+ALPHA, with or without
-C  exponential scaling.
-C
-C  Explanation of variables in the calling sequence
-C
-C  Description of output values ..
-C
-C X     - Working precision non-negative real argument for which
-C         K's or exponentially scaled K's (K*EXP(X))
-C         are to be calculated.  If K's are to be calculated,
-C         X must not be greater than XMAX (see below).
-C ALPHA - Working precision fractional part of order for which 
-C         K's or exponentially scaled K's (K*EXP(X)) are
-C         to be calculated.  0 .LE. ALPHA .LT. 1.0.
-C NB    - Integer number of functions to be calculated, NB .GT. 0.
-C         The first function calculated is of order ALPHA, and the 
-C         last is of order (NB - 1 + ALPHA).
-C IZE   - Integer type.  IZE = 1 if unscaled K's are to be calculated,
-C         and 2 if exponentially scaled K's are to be calculated.
-C BK    - Working precision output vector of length NB.  If the
-C         routine terminates normally (NCALC=NB), the vector BK
-C         contains the functions K(ALPHA,X), ... , K(NB-1+ALPHA,X),
-C         or the corresponding exponentially scaled functions.
-C         If (0 .LT. NCALC .LT. NB), BK(I) contains correct function
-C         values for I .LE. NCALC, and contains the ratios
-C         K(ALPHA+I-1,X)/K(ALPHA+I-2,X) for the rest of the array.
-C NCALC - Integer output variable indicating possible errors.
-C         Before using the vector BK, the user should check that 
-C         NCALC=NB, i.e., all orders have been calculated to
-C         the desired accuracy.  See error returns below.
-C
-C
-C*******************************************************************
-C*******************************************************************
-C
-C Explanation of machine-dependent constants
-C
-C   beta   = Radix for the floating-point system
-C   minexp = Smallest representable power of beta
-C   maxexp = Smallest power of beta that overflows
-C   EPS    = The smallest positive floating-point number such that 
-C            1.0+EPS .GT. 1.0
-C   XMAX   = Upper limit on the magnitude of X when IZE=1;  Solution 
-C            to equation:
-C               W(X) * (1-1/8X+9/128X**2) = beta**minexp
-C            where  W(X) = EXP(-X)*SQRT(PI/2X)
-C   SQXMIN = Square root of beta**minexp
-C   XINF   = Largest positive machine number; approximately
-C            beta**maxexp
-C   XMIN   = Smallest positive machine number; approximately
-C            beta**minexp
-C
-C
-C     Approximate values for some important machines are:
-C
-C                          beta       minexp      maxexp      EPS
-C
-C  CRAY-1        (S.P.)      2        -8193        8191    7.11E-15
-C  Cyber 180/185 
-C    under NOS   (S.P.)      2         -975        1070    3.55E-15
-C  IEEE (IBM/XT,
-C    SUN, etc.)  (S.P.)      2         -126         128    1.19E-7
-C  IEEE (IBM/XT,
-C    SUN, etc.)  (D.P.)      2        -1022        1024    2.22D-16
-C  IBM 3033      (D.P.)     16          -65          63    2.22D-16
-C  VAX           (S.P.)      2         -128         127    5.96E-8
-C  VAX D-Format  (D.P.)      2         -128         127    1.39D-17
-C  VAX G-Format  (D.P.)      2        -1024        1023    1.11D-16
-C
-C
-C                         SQXMIN       XINF        XMIN      XMAX
-C
-C CRAY-1        (S.P.)  6.77E-1234  5.45E+2465  4.59E-2467 5674.858
-C Cyber 180/855
-C   under NOS   (S.P.)  1.77E-147   1.26E+322   3.14E-294   672.788
-C IEEE (IBM/XT,
-C   SUN, etc.)  (S.P.)  1.08E-19    3.40E+38    1.18E-38     85.337
-C IEEE (IBM/XT,
-C   SUN, etc.)  (D.P.)  1.49D-154   1.79D+308   2.23D-308   705.342
-C IBM 3033      (D.P.)  7.35D-40    7.23D+75    5.40D-79    177.852
-C VAX           (S.P.)  5.42E-20    1.70E+38    2.94E-39     86.715
-C VAX D-Format  (D.P.)  5.42D-20    1.70D+38    2.94D-39     86.715
-C VAX G-Format  (D.P.)  7.46D-155   8.98D+307   5.57D-309   706.728
-C
-C*******************************************************************
-C*******************************************************************
-C
-C Error returns
-C
-C  In case of an error, NCALC .NE. NB, and not all K's are
-C  calculated to the desired accuracy.
-C
-C  NCALC .LT. -1:  An argument is out of range. For example,
-C       NB .LE. 0, IZE is not 1 or 2, or IZE=1 and ABS(X) .GE.
-C       XMAX.  In this case, the B-vector is not calculated,
-C       and NCALC is set to MIN0(NB,0)-2  so that NCALC .NE. NB.
-C  NCALC = -1:  Either  K(ALPHA,X) .GE. XINF  or
-C       K(ALPHA+NB-1,X)/K(ALPHA+NB-2,X) .GE. XINF.  In this case,
-C       the B-vector is not calculated.  Note that again 
-C       NCALC .NE. NB.
-C
-C  0 .LT. NCALC .LT. NB: Not all requested function values could
-C       be calculated accurately.  BK(I) contains correct function
-C       values for I .LE. NCALC, and contains the ratios
-C       K(ALPHA+I-1,X)/K(ALPHA+I-2,X) for the rest of the array.
-C
-C
-C Intrinsic functions required are:
-C
-C     ABS, AINT, EXP, INT, LOG, MAX, MIN, SINH, SQRT
-C
-C
-C Acknowledgement
-C
-C  This program is based on a program written by J. B. Campbell
-C  (2) that computes values of the Bessel functions K of real
-C  argument and real order.  Modifications include the addition
-C  of non-scaled functions, parameterization of machine
-C  dependencies, and the use of more accurate approximations
-C  for SINH and SIN.
-C
-C References: "On Temme's Algorithm for the Modified Bessel
-C              Functions of the Third Kind," Campbell, J. B.,
-C              TOMS 6(4), Dec. 1980, pp. 581-586.
-C
-C             "A FORTRAN IV Subroutine for the Modified Bessel
-C              Functions of the Third Kind of Real Order and Real
-C              Argument," Campbell, J. B., Report NRC/ERB-925,
-C              National Research Council, Canada.
-C
-C  Latest modification: May 30, 1989
-C
-C  Modified by: W. J. Cody and L. Stoltz
-C               Applied Mathematics Division
-C               Argonne National Laboratory
-C               Argonne, IL  60439
-C
-C-------------------------------------------------------------------
-      LOGICAL FIRST
-      INTEGER I,IEND,ITEMP,IZE,J,K,M,MPLUS1,NB,NCALC
-      DOUBLE PRECISION D1MACH
-      DOUBLE PRECISION  
-     1    A,ALPHA,BLPHA,BK,BK1,BK2,C,D,DM,D1,D2,D3,ENU,EPS,ESTF,ESTM,
-     2    EX,FOUR,F0,F1,F2,HALF,ONE,P,P0,Q,Q0,R,RATIO,S,SQXMIN,T,TINYX,
-     3    TWO,TWONU,TWOX,T1,T2,WMINF,X,XINF,XMAX,XMIN,X2BY4,ZERO
-      DIMENSION BK(1),P(8),Q(7),R(5),S(4),T(6),ESTM(6),ESTF(7)
-C---------------------------------------------------------------------
-C  Mathematical constants
-C    A = LOG(2.D0) - Euler's constant
-C    D = SQRT(2.D0/PI)
-C---------------------------------------------------------------------
-      PARAMETER (HALF = 0.5D0, ONE = 1.0D0, TWO = 2.0D0, ZERO = 0.0D0)
-      PARAMETER (FOUR = 4.0D0, TINYX = 1.0D-10)
-      PARAMETER (A = 0.11593151565841244881D0)
-      PARAMETER (D = 0.797884560802865364D0)
-C---------------------------------------------------------------------
-C  P, Q - Approximation for LOG(GAMMA(1+ALPHA))/ALPHA
-C                                         + Euler's constant
-C         Coefficients converted from hex to decimal and modified
-C         by W. J. Cody, 2/26/82
-C  R, S - Approximation for (1-ALPHA*PI/SIN(ALPHA*PI))/(2.D0*ALPHA)
-C  T    - Approximation for SINH(Y)/Y
-C---------------------------------------------------------------------
-      DATA P/ 0.805629875690432845D00,    0.204045500205365151D02,
-     1        0.157705605106676174D03,    0.536671116469207504D03,
-     2        0.900382759291288778D03,    0.730923886650660393D03,
-     3        0.229299301509425145D03,    0.822467033424113231D00/
-      DATA Q/ 0.294601986247850434D02,    0.277577868510221208D03,
-     1        0.120670325591027438D04,    0.276291444159791519D04,
-     2        0.344374050506564618D04,    0.221063190113378647D04,
-     3        0.572267338359892221D03/
-      DATA R/-0.48672575865218401848D+0,  0.13079485869097804016D+2,
-     1       -0.10196490580880537526D+3,  0.34765409106507813131D+3,
-     2        0.34958981245219347820D-3/
-      DATA S/-0.25579105509976461286D+2,  0.21257260432226544008D+3,
-     1       -0.61069018684944109624D+3,  0.42269668805777760407D+3/
-      DATA T/ 0.16125990452916363814D-9, 0.25051878502858255354D-7,
-     1        0.27557319615147964774D-5, 0.19841269840928373686D-3,
-     2        0.83333333333334751799D-2, 0.16666666666666666446D+0/
-      DATA ESTM/5.20583D1, 5.7607D0, 2.7782D0, 1.44303D1, 1.853004D2,
-     1          9.3715D0/
-      DATA ESTF/4.18341D1, 7.1075D0, 6.4306D0, 4.25110D1, 1.35633D0,
-     1          8.45096D1, 2.0D1/
-C---------------------------------------------------------------------
-      DATA FIRST /.TRUE./
-C---------------------------------------------------------------------
-      SAVE P, Q, R, S, T, ESTM, ESTF
-      SAVE FIRST, EPS, XINF, XMIN, SQXMIN, XMAX
-C---------------------------------------------------------------------
-C  Machine dependent parameters
-C---------------------------------------------------------------------
-      IF (FIRST) THEN
-        EPS = D1MACH (4)
-        XINF = D1MACH (2)
-        XMIN = D1MACH (1)
-        SQXMIN = SQRT (XMIN)
-        XMAX = 0.99D0 * LOG (XINF)
-        FIRST = .FALSE.
-      ENDIF
-C---------------------------------------------------------------------
-      EX = X
-      ENU = ALPHA
-      NCALC = MIN(NB,0)-2
-      IF ((NB .GT. 0) .AND. ((ENU .GE. ZERO) .AND. (ENU .LT. ONE))
-     1     .AND. ((IZE .GE. 1) .AND. (IZE .LE. 2)) .AND.
-     2     ((IZE .NE. 1) .OR. (EX .LE. XMAX)) .AND.
-     3     (EX .GT. ZERO))  THEN
-            K = 0
-            IF (ENU .LT. SQXMIN) ENU = ZERO
-            IF (ENU .GT. HALF) THEN
-                  K = 1
-                  ENU = ENU - ONE
-            END IF
-            TWONU = ENU+ENU
-            IEND = NB+K-1
-            C = ENU*ENU
-            D3 = -C
-            IF (EX .LE. ONE) THEN
-C---------------------------------------------------------------------
-C  Calculation of P0 = GAMMA(1+ALPHA) * (2/X)**ALPHA
-C                 Q0 = GAMMA(1-ALPHA) * (X/2)**ALPHA
-C---------------------------------------------------------------------
-                  D1 = ZERO
-                  D2 = P(1)
-                  T1 = ONE
-                  T2 = Q(1)
-                  DO 10 I = 2,7,2
-                     D1 = C*D1+P(I)
-                     D2 = C*D2+P(I+1)
-                     T1 = C*T1+Q(I)
-                     T2 = C*T2+Q(I+1)
-   10             CONTINUE
-                  D1 = ENU*D1
-                  T1 = ENU*T1
-                  F1 = LOG(EX)
-                  F0 = A+ENU*(P(8)-ENU*(D1+D2)/(T1+T2))-F1
-                  Q0 = EXP(-ENU*(A-ENU*(P(8)+ENU*(D1-D2)/(T1-T2))-F1))
-                  F1 = ENU*F0
-                  P0 = EXP(F1)
-C---------------------------------------------------------------------
-C  Calculation of F0 = 
-C---------------------------------------------------------------------
-                  D1 = R(5)
-                  T1 = ONE
-                  DO 20 I = 1,4
-                     D1 = C*D1+R(I)
-                     T1 = C*T1+S(I)
-   20             CONTINUE
-                  IF (ABS(F1) .LE. HALF) THEN
-                        F1 = F1*F1
-                        D2 = ZERO
-                        DO 30 I = 1,6
-                           D2 = F1*D2+T(I)
-   30                   CONTINUE
-                        D2 = F0+F0*F1*D2
-                     ELSE
-                        D2 = SINH(F1)/ENU
-                  END IF
-                  F0 = D2-ENU*D1/(T1*P0)
-                  IF (EX .LE. TINYX) THEN
-C--------------------------------------------------------------------
-C  X.LE.1.0E-10
-C  Calculation of K(ALPHA,X) and X*K(ALPHA+1,X)/K(ALPHA,X)
-C--------------------------------------------------------------------
-                        BK(1) = F0+EX*F0
-                        IF (IZE .EQ. 1) BK(1) = BK(1)-EX*BK(1)
-                        RATIO = P0/F0
-                        C = EX*XINF
-                        IF (K .NE. 0) THEN
-C--------------------------------------------------------------------
-C  Calculation of K(ALPHA,X) and X*K(ALPHA+1,X)/K(ALPHA,X),
-C  ALPHA .GE. 1/2
-C--------------------------------------------------------------------
-                              NCALC = -1
-                              IF (BK(1) .GE. C/RATIO) GO TO 500
-                              BK(1) = RATIO*BK(1)/EX
-                              TWONU = TWONU+TWO
-                              RATIO = TWONU
-                        END IF
-                        NCALC = 1
-                        IF (NB .EQ. 1) GO TO 500
-C--------------------------------------------------------------------
-C  Calculate  K(ALPHA+L,X)/K(ALPHA+L-1,X),  L  =  1, 2, ... , NB-1
-C--------------------------------------------------------------------
-                        NCALC = -1
-                        DO 80 I = 2,NB
-                           IF (RATIO .GE. C) GO TO 500
-                           BK(I) = RATIO/EX
-                           TWONU = TWONU+TWO
-                           RATIO = TWONU
-   80                   CONTINUE
-                        NCALC = 1
-                        GO TO 420
-                     ELSE
-C--------------------------------------------------------------------
-C  1.0E-10 .LT. X .LE. 1.0
-C--------------------------------------------------------------------
-                        C = ONE
-                        X2BY4 = EX*EX/FOUR
-                        P0 = HALF*P0
-                        Q0 = HALF*Q0
-                        D1 = -ONE
-                        D2 = ZERO
-                        BK1 = ZERO
-                        BK2 = ZERO
-                        F1 = F0
-                        F2 = P0
-  100                   D1 = D1+TWO
-                        D2 = D2+ONE
-                        D3 = D1+D3
-                        C = X2BY4*C/D2
-                        F0 = (D2*F0+P0+Q0)/D3
-                        P0 = P0/(D2-ENU)
-                        Q0 = Q0/(D2+ENU)
-                        T1 = C*F0
-                        T2 = C*(P0-D2*F0)
-                        BK1 = BK1+T1
-                        BK2 = BK2+T2
-                        IF ((ABS(T1/(F1+BK1)) .GT. EPS) .OR.
-     1                     (ABS(T2/(F2+BK2)) .GT. EPS))  GO TO 100
-                        BK1 = F1+BK1
-                        BK2 = TWO*(F2+BK2)/EX
-                        IF (IZE .EQ. 2) THEN
-                              D1 = EXP(EX)
-                              BK1 = BK1*D1
-                              BK2 = BK2*D1
-                        END IF
-                        WMINF = ESTF(1)*EX+ESTF(2)
-                  END IF
-               ELSE IF (EPS*EX .GT. ONE) THEN
-C--------------------------------------------------------------------
-C  X .GT. ONE/EPS
-C--------------------------------------------------------------------
-                  NCALC = NB
-                  BK1 = ONE / (D*SQRT(EX))
-                  DO 110 I = 1, NB
-                     BK(I) = BK1
-  110             CONTINUE
-                  GO TO 500
-               ELSE
-C--------------------------------------------------------------------
-C  X .GT. 1.0
-C--------------------------------------------------------------------
-                  TWOX = EX+EX
-                  BLPHA = ZERO
-                  RATIO = ZERO
-                  IF (EX .LE. FOUR) THEN
-C--------------------------------------------------------------------
-C  Calculation of K(ALPHA+1,X)/K(ALPHA,X),  1.0 .LE. X .LE. 4.0
-C--------------------------------------------------------------------
-                        D2 = AINT(ESTM(1)/EX+ESTM(2))
-                        M = INT(D2)
-                        D1 = D2+D2
-                        D2 = D2-HALF
-                        D2 = D2*D2
-                        DO 120 I = 2,M
-                           D1 = D1-TWO
-                           D2 = D2-D1
-                           RATIO = (D3+D2)/(TWOX+D1-RATIO)
-  120                   CONTINUE
-C--------------------------------------------------------------------
-C  Calculation of I(|ALPHA|,X) and I(|ALPHA|+1,X) by backward
-C    recurrence and K(ALPHA,X) from the wronskian
-C--------------------------------------------------------------------
-                        D2 = AINT(ESTM(3)*EX+ESTM(4))
-                        M = INT(D2)
-                        C = ABS(ENU)
-                        D3 = C+C
-                        D1 = D3-ONE
-                        F1 = XMIN
-                        F0 = (TWO*(C+D2)/EX+HALF*EX/(C+D2+ONE))*XMIN
-                        DO 130 I = 3,M
-                           D2 = D2-ONE
-                           F2 = (D3+D2+D2)*F0
-                           BLPHA = (ONE+D1/D2)*(F2+BLPHA)
-                           F2 = F2/EX+F1
-                           F1 = F0
-                           F0 = F2
-  130                   CONTINUE
-                        F1 = (D3+TWO)*F0/EX+F1
-                        D1 = ZERO
-                        T1 = ONE
-                        DO 140 I = 1,7
-                           D1 = C*D1+P(I)
-                           T1 = C*T1+Q(I)
-  140                   CONTINUE
-                        P0 = EXP(C*(A+C*(P(8)-C*D1/T1)-LOG(EX)))/EX
-                        F2 = (C+HALF-RATIO)*F1/EX
-                        BK1 = P0+(D3*F0-F2+F0+BLPHA)/(F2+F1+F0)*P0
-                        IF (IZE .EQ. 1) BK1 = BK1*EXP(-EX)
-                        WMINF = ESTF(3)*EX+ESTF(4)
-                     ELSE
-C--------------------------------------------------------------------
-C  Calculation of K(ALPHA,X) and K(ALPHA+1,X)/K(ALPHA,X), by backward
-C  recurrence, for  X .GT. 4.0
-C--------------------------------------------------------------------
-                        DM = AINT(ESTM(5)/EX+ESTM(6))
-                        M = INT(DM)
-                        D2 = DM-HALF
-                        D2 = D2*D2
-                        D1 = DM+DM
-                        DO 160 I = 2,M
-                           DM = DM-ONE
-                           D1 = D1-TWO
-                           D2 = D2-D1
-                           RATIO = (D3+D2)/(TWOX+D1-RATIO)
-                           BLPHA = (RATIO+RATIO*BLPHA)/DM
-  160                   CONTINUE
-                        BK1 = ONE/((D+D*BLPHA)*SQRT(EX))
-                        IF (IZE .EQ. 1) BK1 = BK1*EXP(-EX)
-                        WMINF = ESTF(5)*(EX-ABS(EX-ESTF(7)))+ESTF(6)
-                  END IF
-C--------------------------------------------------------------------
-C  Calculation of K(ALPHA+1,X) from K(ALPHA,X) and
-C    K(ALPHA+1,X)/K(ALPHA,X)
-C--------------------------------------------------------------------
-                  BK2 = BK1+BK1*(ENU+HALF-RATIO)/EX
-            END IF
-C--------------------------------------------------------------------
-C  Calculation of 'NCALC', K(ALPHA+I,X), I  =  0, 1, ... , NCALC-1,
-C  K(ALPHA+I,X)/K(ALPHA+I-1,X), I  =  NCALC, NCALC+1, ... , NB-1
-C--------------------------------------------------------------------
-            NCALC = NB
-            BK(1) = BK1
-            IF (IEND .EQ. 0) GO TO 500
-            J = 2-K
-            IF (J .GT. 0) BK(J) = BK2
-            IF (IEND .EQ. 1) GO TO 500
-            M = MIN(INT(WMINF-ENU),IEND)
-            DO 190 I = 2,M
-               T1 = BK1
-               BK1 = BK2
-               TWONU = TWONU+TWO
-               IF (EX .LT. ONE) THEN
-                     IF (BK1 .GE. (XINF/TWONU)*EX) GO TO 195
-                     GO TO 187
-                  ELSE 
-                     IF (BK1/EX .GE. XINF/TWONU) GO TO 195
-               END IF
-  187          CONTINUE
-               BK2 = TWONU/EX*BK1+T1
-               ITEMP = I
-               J = J+1
-               IF (J .GT. 0) BK(J) = BK2
-  190       CONTINUE
-  195       M = ITEMP
-            IF (M .EQ. IEND) GO TO 500
-            RATIO = BK2/BK1
-            MPLUS1 = M+1
-            NCALC = -1
-            DO 410 I = MPLUS1,IEND
-               TWONU = TWONU+TWO
-               RATIO = TWONU/EX+ONE/RATIO
-               J = J+1
-               IF (J .GT. 1) THEN
-                     BK(J) = RATIO
-                  ELSE
-                     IF (BK2 .GE. XINF/RATIO) GO TO 500
-                     BK2 = RATIO*BK2
-               END IF
-  410       CONTINUE
-            NCALC = MAX(MPLUS1-K,1)
-            IF (NCALC .EQ. 1) BK(1) = BK2
-            IF (NB .EQ. 1) GO TO 500
-  420       J = NCALC+1
-            DO 430 I = J,NB
-               IF (BK(NCALC) .GE. XINF/BK(I)) GO TO 500
-               BK(I) = BK(NCALC)*BK(I)
-               NCALC = I
-  430       CONTINUE
-      END IF
-  500 RETURN
-C---------- Last line of RKBESL ----------
-      END
deleted file mode 100644
--- a/libcruft/specfun/rybesl.f
+++ /dev/null
@@ -1,439 +0,0 @@
-      SUBROUTINE RYBESL(X,ALPHA,NB,BY,NCALC)
-C----------------------------------------------------------------------
-C
-C  This routine calculates Bessel functions Y SUB(N+ALPHA) (X)
-C  for non-negative argument X, and non-negative order N+ALPHA.
-C
-C
-C Explanation of variables in the calling sequence
-C
-C X     - Working precision non-negative real argument for which
-C         Y's are to be calculated.
-C ALPHA - Working precision fractional part of order for which
-C         Y's are to be calculated.  0 .LE. ALPHA .LT. 1.0.
-C NB    - Integer number of functions to be calculated, NB .GT. 0.
-C         The first function calculated is of order ALPHA, and the 
-C         last is of order (NB - 1 + ALPHA).
-C BY    - Working precision output vector of length NB.  If the
-C         routine terminates normally (NCALC=NB), the vector BY
-C         contains the functions Y(ALPHA,X), ... , Y(NB-1+ALPHA,X),
-C         If (0 .LT. NCALC .LT. NB), BY(I) contains correct function
-C         values for I .LE. NCALC, and contains the ratios
-C         Y(ALPHA+I-1,X)/Y(ALPHA+I-2,X) for the rest of the array.
-C NCALC - Integer output variable indicating possible errors.
-C         Before using the vector BY, the user should check that 
-C         NCALC=NB, i.e., all orders have been calculated to
-C         the desired accuracy.  See error returns below.
-C
-C
-C*******************************************************************
-C*******************************************************************
-C
-C Explanation of machine-dependent constants
-C
-C   beta   = Radix for the floating-point system
-C   p      = Number of significant base-beta digits in the
-C            significand of a floating-point number
-C   minexp = Smallest representable power of beta
-C   maxexp = Smallest power of beta that overflows
-C   EPS    = beta ** (-p)
-C   DEL    = Machine number below which sin(x)/x = 1; approximately
-C            SQRT(EPS).
-C   XMIN   = Smallest acceptable argument for RBESY; approximately
-C            max(2*beta**minexp,2/XINF), rounded up
-C   XINF   = Largest positive machine number; approximately
-C            beta**maxexp
-C   THRESH = Lower bound for use of the asymptotic form; approximately
-C            AINT(-LOG10(EPS/2.0))+1.0
-C   XLARGE = Upper bound on X; approximately 1/DEL, because the sine
-C            and cosine functions have lost about half of their 
-C            precision at that point.
-C
-C
-C     Approximate values for some important machines are:
-C
-C                        beta    p     minexp      maxexp      EPS
-C
-C  CRAY-1        (S.P.)    2    48     -8193        8191    3.55E-15
-C  Cyber 180/185 
-C    under NOS   (S.P.)    2    48      -975        1070    3.55E-15
-C  IEEE (IBM/XT,
-C    SUN, etc.)  (S.P.)    2    24      -126         128    5.96E-8
-C  IEEE (IBM/XT,
-C    SUN, etc.)  (D.P.)    2    53     -1022        1024    1.11D-16
-C  IBM 3033      (D.P.)   16    14       -65          63    1.39D-17
-C  VAX           (S.P.)    2    24      -128         127    5.96E-8
-C  VAX D-Format  (D.P.)    2    56      -128         127    1.39D-17
-C  VAX G-Format  (D.P.)    2    53     -1024        1023    1.11D-16
-C
-C
-C                         DEL      XMIN      XINF     THRESH  XLARGE
-C
-C CRAY-1        (S.P.)  5.0E-8  3.67E-2466 5.45E+2465  15.0E0  2.0E7
-C Cyber 180/855
-C   under NOS   (S.P.)  5.0E-8  6.28E-294  1.26E+322   15.0E0  2.0E7
-C IEEE (IBM/XT,
-C   SUN, etc.)  (S.P.)  1.0E-4  2.36E-38   3.40E+38     8.0E0  1.0E4
-C IEEE (IBM/XT,
-C   SUN, etc.)  (D.P.)  1.0D-8  4.46D-308  1.79D+308   16.0D0  1.0D8
-C IBM 3033      (D.P.)  1.0D-8  2.77D-76   7.23D+75    17.0D0  1.0D8
-C VAX           (S.P.)  1.0E-4  1.18E-38   1.70E+38     8.0E0  1.0E4
-C VAX D-Format  (D.P.)  1.0D-9  1.18D-38   1.70D+38    17.0D0  1.0D9
-C VAX G-Format  (D.P.)  1.0D-8  2.23D-308  8.98D+307   16.0D0  1.0D8
-C
-C*******************************************************************
-C*******************************************************************
-C
-C Error returns
-C
-C  In case of an error, NCALC .NE. NB, and not all Y's are
-C  calculated to the desired accuracy.
-C
-C  NCALC .LT. -1:  An argument is out of range. For example,
-C       NB .LE. 0, IZE is not 1 or 2, or IZE=1 and ABS(X) .GE.
-C       XMAX.  In this case, BY(1) = 0.0, the remainder of the
-C       BY-vector is not calculated, and NCALC is set to
-C       MIN0(NB,0)-2  so that NCALC .NE. NB.
-C  NCALC = -1:  Y(ALPHA,X) .GE. XINF.  The requested function
-C       values are set to 0.0.
-C  1 .LT. NCALC .LT. NB: Not all requested function values could
-C       be calculated accurately.  BY(I) contains correct function
-C       values for I .LE. NCALC, and and the remaining NB-NCALC
-C       array elements contain 0.0.
-C
-C
-C Intrinsic functions required are:
-C
-C     DBLE, EXP, INT, MAX, MIN, REAL, SQRT
-C
-C
-C Acknowledgement
-C
-C  This program draws heavily on Temme's Algol program for Y(a,x)
-C  and Y(a+1,x) and on Campbell's programs for Y_nu(x).  Temme's
-C  scheme is used for  x < THRESH, and Campbell's scheme is used
-C  in the asymptotic region.  Segments of code from both sources
-C  have been translated into Fortran 77, merged, and heavily modified.
-C  Modifications include parameterization of machine dependencies,
-C  use of a new approximation for ln(gamma(x)), and built-in
-C  protection against over/underflow.
-C
-C References: "Bessel functions J_nu(x) and Y_nu(x) of real
-C              order and real argument," Campbell, J. B.,
-C              Comp. Phy. Comm. 18, 1979, pp. 133-142.
-C
-C             "On the numerical evaluation of the ordinary
-C              Bessel function of the second kind," Temme,
-C              N. M., J. Comput. Phys. 21, 1976, pp. 343-350.
-C
-C  Latest modification: March 19, 1990
-C
-C  Modified by: W. J. Cody
-C               Applied Mathematics Division
-C               Argonne National Laboratory
-C               Argonne, IL  60439
-C
-C----------------------------------------------------------------------
-      LOGICAL FIRST
-      INTEGER I,K,NA,NB,NCALC
-      DOUBLE PRECISION D1MACH
-      DOUBLE PRECISION
-     1  ALFA,ALPHA,AYE,B,BY,C,CH,COSMU,D,DEL,DEN,DDIV,DIV,DMU,D1,D2,
-     2  E,EIGHT,EN,ENU,EN1,EPS,EVEN,EX,F,FIVPI,G,GAMMA,H,HALF,ODD,
-     3  ONBPI,ONE,ONE5,P,PA,PA1,PI,PIBY2,PIM5,Q,QA,QA1,Q0,R,S,SINMU,
-     4  SQ2BPI,TEN9,TERM,THREE,THRESH,TWO,TWOBYX,X,XINF,XLARGE,XMIN,
-     5  XNA,X2,YA,YA1,ZERO
-      DIMENSION BY(NB),CH(21)
-C----------------------------------------------------------------------
-C  Mathematical constants
-C    FIVPI = 5*PI
-C    PIM5 = 5*PI - 15
-C    ONBPI = 1/PI
-C    PIBY2 = PI/2
-C    SQ2BPI = SQUARE ROOT OF 2/PI
-C----------------------------------------------------------------------
-      PARAMETER (ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0, TWO = 2.0D0)
-      PARAMETER (THREE = 3.0D0, EIGHT = 8.0D0, ONE5 = 1.5D1)
-      PARAMETER (TEN9 = 1.9D1, FIVPI = 1.5707963267948966192D1)
-      PARAMETER (PIBY2 = 1.5707963267948966192D0)
-      PARAMETER (PI = 3.1415926535897932385D0)
-      PARAMETER (SQ2BPI = 7.9788456080286535588D-1)
-      PARAMETER (PIM5 = 7.0796326794896619231D-1)
-      PARAMETER (ONBPI = 3.1830988618379067154D-1)
-C----------------------------------------------------------------------
-C  Coefficients for Chebyshev polynomial expansion of 
-C         1/gamma(1-x), abs(x) .le. .5
-C----------------------------------------------------------------------
-      DATA CH/-0.67735241822398840964D-23,-0.61455180116049879894D-22,
-     1         0.29017595056104745456D-20, 0.13639417919073099464D-18,
-     2         0.23826220476859635824D-17,-0.90642907957550702534D-17,
-     3        -0.14943667065169001769D-14,-0.33919078305362211264D-13,
-     4        -0.17023776642512729175D-12, 0.91609750938768647911D-11,
-     5         0.24230957900482704055D-09, 0.17451364971382984243D-08,
-     6        -0.33126119768180852711D-07,-0.86592079961391259661D-06,
-     7        -0.49717367041957398581D-05, 0.76309597585908126618D-04,
-     8         0.12719271366545622927D-02, 0.17063050710955562222D-02,
-     9        -0.76852840844786673690D-01,-0.28387654227602353814D+00,
-     A         0.92187029365045265648D+00/
-C----------------------------------------------------------------------
-      DATA FIRST /.TRUE./
-C----------------------------------------------------------------------
-      SAVE CH, FIRST, EPS, XINF, XMIN, DEL, XLARGE, THRESH
-C----------------------------------------------------------------------
-C  Machine-dependent constants
-C----------------------------------------------------------------------
-      IF (FIRST) THEN
-        EPS = D1MACH (4)
-        XINF = D1MACH (2)
-        XMIN = D1MACH (1)
-        DEL = SQRT (EPS)
-        XLARGE = ONE / DEL
-        THRESH = DINT (-LOG10 (EPS / TWO)) + ONE
-        FIRST = .FALSE.
-      ENDIF
-C----------------------------------------------------------------------
-      EX = X
-      ENU = ALPHA
-      IF ((NB .GT. 0) .AND. (X .GE. XMIN) .AND. (EX .LT. XLARGE)
-     1       .AND. (ENU .GE. ZERO) .AND. (ENU .LT. ONE))  THEN
-            XNA = AINT(ENU+HALF)
-            NA = INT(XNA)
-            IF (NA .EQ. 1) ENU = ENU - XNA
-            IF (ENU .EQ. -HALF) THEN
-                  P = SQ2BPI/SQRT(EX)
-                  YA = P * SIN(EX)
-                  YA1 = -P * COS(EX)
-               ELSE IF (EX .LT. THREE) THEN
-C----------------------------------------------------------------------
-C  Use Temme's scheme for small X
-C----------------------------------------------------------------------
-                  B = EX * HALF
-                  D = -LOG(B)
-                  F = ENU * D
-                  E = B**(-ENU)
-                  IF (ABS(ENU) .LT. DEL) THEN
-                        C = ONBPI
-                     ELSE
-                        C = ENU / SIN(ENU*PI)
-                  END IF
-C----------------------------------------------------------------------
-C  Computation of sinh(f)/f
-C----------------------------------------------------------------------
-                  IF (ABS(F) .LT. ONE) THEN
-                        X2 = F*F
-                        EN = TEN9
-                        S = ONE
-                        DO 80 I = 1, 9
-                           S = S*X2/EN/(EN-ONE)+ONE
-                           EN = EN - TWO
-   80                   CONTINUE
-                     ELSE 
-                        S = (E - ONE/E) * HALF / F
-                  END IF
-C----------------------------------------------------------------------
-C  Computation of 1/gamma(1-a) using Chebyshev polynomials
-C----------------------------------------------------------------------
-                  X2 = ENU*ENU*EIGHT
-                  AYE = CH(1)
-                  EVEN = ZERO
-                  ALFA = CH(2)
-                  ODD = ZERO
-                  DO 40 I = 3, 19, 2
-                     EVEN = -(AYE+AYE+EVEN)
-                     AYE = -EVEN*X2 - AYE + CH(I)
-                     ODD = -(ALFA+ALFA+ODD)
-                     ALFA = -ODD*X2 - ALFA + CH(I+1)
-   40             CONTINUE
-                  EVEN = (EVEN*HALF+AYE)*X2 - AYE + CH(21)
-                  ODD = (ODD+ALFA)*TWO
-                  GAMMA = ODD*ENU + EVEN
-C----------------------------------------------------------------------
-C  End of computation of 1/gamma(1-a)
-C----------------------------------------------------------------------
-                  G = E * GAMMA
-                  E = (E + ONE/E) * HALF
-                  F = TWO*C*(ODD*E+EVEN*S*D)
-                  E = ENU*ENU
-                  P = G*C
-                  Q = ONBPI / G
-                  C = ENU*PIBY2
-                  IF (ABS(C) .LT. DEL) THEN
-                        R = ONE
-                     ELSE 
-                        R = SIN(C)/C
-                  END IF
-                  R = PI*C*R*R
-                  C = ONE
-                  D = - B*B
-                  H = ZERO
-                  YA = F + R*Q
-                  YA1 = P
-                  EN = ZERO
-  100             EN = EN + ONE
-                  IF (ABS(G/(ONE+ABS(YA)))
-     1                      + ABS(H/(ONE+ABS(YA1))) .GT. EPS) THEN
-                        F = (F*EN+P+Q)/(EN*EN-E)
-                        C = C * D/EN
-                        P = P/(EN-ENU)
-                        Q = Q/(EN+ENU)
-                        G = C*(F+R*Q)
-                        H = C*P - EN*G
-                        YA = YA + G
-                        YA1 = YA1+H
-                        GO TO 100
-                  END IF
-                  YA = -YA
-                  YA1 = -YA1/B
-               ELSE IF (EX .LT. THRESH) THEN
-C----------------------------------------------------------------------
-C  Use Temme's scheme for moderate X
-C----------------------------------------------------------------------
-                  C = (HALF-ENU)*(HALF+ENU)
-                  B = EX + EX
-                  E = (EX*ONBPI*COS(ENU*PI)/EPS)
-                  E = E*E
-                  P = ONE
-                  Q = -EX
-                  R = ONE + EX*EX
-                  S = R
-                  EN = TWO
-  200             IF (R*EN*EN .LT. E) THEN
-                        EN1 = EN+ONE
-                        D = (EN-ONE+C/EN)/S
-                        P = (EN+EN-P*D)/EN1
-                        Q = (-B+Q*D)/EN1
-                        S = P*P + Q*Q
-                        R = R*S
-                        EN = EN1
-                        GO TO 200
-                  END IF
-                  F = P/S
-                  P = F
-                  G = -Q/S
-                  Q = G
-  220             EN = EN - ONE  
-                  IF (EN .GT. ZERO) THEN
-                        R = EN1*(TWO-P)-TWO
-                        S = B + EN1*Q
-                        D = (EN-ONE+C/EN)/(R*R+S*S)
-                        P = D*R
-                        Q = D*S
-                        E = F + ONE
-                        F = P*E - G*Q
-                        G = Q*E + P*G
-                        EN1 = EN
-                        GO TO 220
-                  END IF
-                  F = ONE + F
-                  D = F*F + G*G
-                  PA = F/D
-                  QA = -G/D
-                  D = ENU + HALF -P
-                  Q = Q + EX
-                  PA1 = (PA*Q-QA*D)/EX
-                  QA1 = (QA*Q+PA*D)/EX
-                  B = EX - PIBY2*(ENU+HALF)
-                  C = COS(B)
-                  S = SIN(B)
-                  D = SQ2BPI/SQRT(EX)
-                  YA = D*(PA*S+QA*C)
-                  YA1 = D*(QA1*S-PA1*C)
-               ELSE
-C----------------------------------------------------------------------
-C  Use Campbell's asymptotic scheme.
-C----------------------------------------------------------------------
-                  NA = 0
-                  D1 = AINT(EX/FIVPI)
-                  I = INT(D1)
-                  DMU = ((EX-ONE5*D1)-D1*PIM5)-(ALPHA+HALF)*PIBY2
-                  IF (I-2*(I/2) .EQ. 0) THEN
-                        COSMU = COS(DMU)
-                        SINMU = SIN(DMU)
-                     ELSE
-                        COSMU = -COS(DMU)
-                        SINMU = -SIN(DMU)
-                  END IF
-                  DDIV = EIGHT * EX
-                  DMU = ALPHA
-                  DEN = SQRT(EX)
-                  DO 350 K = 1, 2
-                     P = COSMU
-                     COSMU = SINMU
-                     SINMU = -P
-                     D1 = (TWO*DMU-ONE)*(TWO*DMU+ONE)
-                     D2 = ZERO
-                     DIV = DDIV
-                     P = ZERO
-                     Q = ZERO
-                     Q0 = D1/DIV
-                     TERM = Q0
-                     DO 310 I = 2, 20
-                        D2 = D2 + EIGHT
-                        D1 = D1 - D2
-                        DIV = DIV + DDIV
-                        TERM = -TERM*D1/DIV
-                        P = P + TERM
-                        D2 = D2 + EIGHT
-                        D1 = D1 - D2
-                        DIV = DIV + DDIV
-                        TERM = TERM*D1/DIV
-                        Q = Q + TERM
-                        IF (ABS(TERM) .LE. EPS) GO TO 320
-  310                CONTINUE
-  320                P = P + ONE
-                     Q = Q + Q0
-                     IF (K .EQ. 1) THEN
-                           YA = SQ2BPI * (P*COSMU-Q*SINMU) / DEN
-                        ELSE
-                           YA1 = SQ2BPI * (P*COSMU-Q*SINMU) / DEN
-                     END IF
-                     DMU = DMU + ONE
-  350             CONTINUE
-            END IF
-            IF (NA .EQ. 1) THEN
-               H = TWO*(ENU+ONE)/EX
-               IF (H .GT. ONE) THEN
-                  IF (ABS(YA1) .GT. XINF/H) THEN
-                     H = ZERO
-                     YA = ZERO
-                  END IF
-               END IF
-               H = H*YA1 - YA
-               YA = YA1
-               YA1 = H
-            END IF
-C----------------------------------------------------------------------
-C  Now have first one or two Y's
-C----------------------------------------------------------------------
-            BY(1) = YA
-            NCALC = 1
-            IF (NB .GT. 1) THEN
-              BY(2) = YA1
-              IF (YA1 .NE. ZERO) THEN
-                  AYE = ONE + ALPHA
-                  TWOBYX = TWO/EX
-                  NCALC = 2
-                  DO 400 I = 3, NB
-                     IF (TWOBYX .LT. ONE) THEN
-                           IF (ABS(BY(I-1))*TWOBYX .GE. XINF/AYE)
-     1                                                     GO TO 450
-                        ELSE
-                           IF (ABS(BY(I-1)) .GE. XINF/AYE/TWOBYX )
-     1                                                     GO TO 450
-                     END IF
-                     BY(I) = TWOBYX*AYE*BY(I-1) - BY(I-2) 
-                     AYE = AYE + ONE
-                     NCALC = NCALC + 1
-  400             CONTINUE
-              END IF
-            END IF
-  450       DO 460 I = NCALC+1, NB
-               BY(I) = ZERO
-  460       CONTINUE
-         ELSE
-            BY(1) = ZERO
-            NCALC = MIN(NB,0) - 1
-      END IF
-  900 RETURN
-C---------- Last line of RYBESL ----------
-      END