LCOV - code coverage report
Current view: top level - shared/common/src/28_numeric_noabirule - m_bessel2.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 3505 0
Test Date: 2026-09-20 15:27:41 Functions: 0.0 % 34 0

            Line data    Source code
       1              : !!****m* ABINIT/m_bessel2
       2              : !! NAME
       3              : !! m_bessel2
       4              : !!
       5              : !! FUNCTION
       6              : !! Computes modified Bessel functions of the first and second kind.
       7              : !! These routines were taken from https://www.netlib.org/slatec/.
       8              : !!
       9              : !! COPYRIGHT
      10              : !!  Copyright (C) 2024-2026 ABINIT group
      11              : !!  This file is distributed under the terms of the
      12              : !!  GNU General Public License, see ~abinit/COPYING
      13              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      14              : !!
      15              : !! SOURCE
      16              : 
      17              : #if defined HAVE_CONFIG_H
      18              : #include "config.h"
      19              : #endif
      20              : 
      21              : #include "abi_common.h"
      22              : 
      23              : MODULE m_bessel2
      24              : 
      25              :  use defs_basis
      26              :  use m_errors
      27              : 
      28              :  implicit none
      29              : 
      30              :  private
      31              : 
      32              :  public :: bessel_iv
      33              :  public :: bessel_kv
      34              : 
      35              : CONTAINS  !========================================================================================
      36              : !!***
      37              : 
      38              : !!****f* m_bessel2/bessel_iv
      39              : !! NAME
      40              : !! bessel_iv
      41              : !!
      42              : !! FUNCTION
      43              : !!
      44              : !! Compute modified Bessel function of the first kind for any real order
      45              : !!
      46              : !! INPUTS
      47              : !!  k= order
      48              : !!  xr= real part of the value at which to compute the Bessel function
      49              : !!  xi= real part of the value at which to compute the Bessel function
      50              : !!
      51              : !! OUTPUT
      52              : !!  ivr,ivi= real part and imaginary part of the value of the Bessel function
      53              : !!
      54              : !! SOURCE
      55              : 
      56            0 :  subroutine bessel_iv(k,xr,xi,ivr,ivi)
      57              : 
      58              : !Arguments ------------------------------------
      59              :  real(dp), intent(in) :: k,xr,xi
      60              :  real(dp), intent(out) :: ivr,ivi
      61              : !Local variables ------------------------------
      62              :  integer :: ierr,nz
      63              :  real(dp) :: s
      64              :  real(dp) :: cyi(1),cyik(1),cyr(1),cyrk(1)
      65              : !************************************************************************
      66              : 
      67            0 :  call zbesi(xr,xi,abs(k),1,1,cyr,cyi,nz,ierr)
      68            0 :  if (k >= zero) then
      69            0 :    ivr = cyr(1)
      70            0 :    ivi = cyi(1)
      71              :  else
      72            0 :    s = sin(abs(k)*pi) * two / pi
      73            0 :    call zbesk(xr,xi,abs(k),1,1,cyrk,cyik,nz,ierr)
      74            0 :    ivr = cyr(1) + s*cyrk(1)
      75            0 :    ivi = cyi(1) + s*cyik(1)
      76              :  end if
      77              : 
      78            0 :  end subroutine bessel_iv
      79              : !!***
      80              : 
      81              : !----------------------------------------------------------------------
      82              : 
      83              : !!****f* m_bessel2/bessel_kv
      84              : !! NAME
      85              : !! bessel_iv
      86              : !!
      87              : !! FUNCTION
      88              : !!
      89              : !! Compute modified Bessel function of the second kind for any real order
      90              : !!
      91              : !! INPUTS
      92              : !!  k= order
      93              : !!  xr= real part of the value at which to compute the Bessel function
      94              : !!  xi= real part of the value at which to compute the Bessel function
      95              : !!
      96              : !! OUTPUT
      97              : !!  kvr,kvi= real part and imaginary part of the value of the Bessel function
      98              : !!
      99              : !! SOURCE
     100              : 
     101            0 :  subroutine bessel_kv(k,xr,xi,kvr,kvi)
     102              : 
     103              : !Arguments ------------------------------------
     104              :  real(dp), intent(in) :: k,xi,xr
     105              :  real(dp), intent(out) :: kvi,kvr
     106              : !Local variables ------------------------------
     107              :  integer :: ierr,nz
     108              :  real(dp) :: cyi(1),cyr(1)
     109              : !************************************************************************
     110              : 
     111            0 :  call zbesk(xr,xi,abs(k),1,1,cyr,cyi,nz,ierr)
     112              : 
     113            0 :  if (xi == zero) then
     114            0 :    kvr = cyr(1)
     115            0 :    kvi = zero
     116              :  else
     117            0 :    kvr = cyr(1)
     118            0 :    kvi = cyi(1)
     119              :  end if
     120              : 
     121            0 :  end subroutine bessel_kv
     122              : !!***
     123              : 
     124              : !----------------------------------------------------------------------
     125              : 
     126            0 :       SUBROUTINE ZBESI(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
     127              : !C***BEGIN PROLOGUE  ZBESI
     128              : !C***DATE WRITTEN   830501   (YYMMDD)
     129              : !C***REVISION DATE  890801   (YYMMDD)
     130              : !C***CATEGORY NO.  B5K
     131              : !C***KEYWORDS  I-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
     132              : !C             MODIFIED BESSEL FUNCTION OF THE FIRST KIND
     133              : !C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
     134              : !C***PURPOSE  TO COMPUTE I-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
     135              : !C***DESCRIPTION
     136              : !C
     137              : !C                    ***A DOUBLE PRECISION ROUTINE***
     138              : !C         ON KODE=1, ZBESI COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
     139              : !C         BESSEL FUNCTIONS CY(J)=I(FNU+J-1,Z) FOR REAL, NONNEGATIVE
     140              : !C         ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z IN THE CUT PLANE
     141              : !C         -PI.LT.ARG(Z).LE.PI. ON KODE=2, ZBESI RETURNS THE SCALED
     142              : !C         FUNCTIONS
     143              : !C
     144              : !C         CY(J)=EXP(-ABS(X))*I(FNU+J-1,Z)   J = 1,...,N , X=REAL(Z)
     145              : !C
     146              : !C         WITH THE EXPONENTIAL GROWTH REMOVED IN BOTH THE LEFT AND
     147              : !C         RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
     148              : !C         ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
     149              : !C         (REF. 1).
     150              : !C
     151              : !C         INPUT      ZR,ZI,FNU ARE DOUBLE PRECISION
     152              : !C           ZR,ZI  - Z=CMPLX(ZR,ZI),  -PI.LT.ARG(Z).LE.PI
     153              : !C           FNU    - ORDER OF INITIAL I FUNCTION, FNU.GE.0.0D0
     154              : !C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
     155              : !C                    KODE= 1  RETURNS
     156              : !C                             CY(J)=I(FNU+J-1,Z), J=1,...,N
     157              : !C                        = 2  RETURNS
     158              : !C                             CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)), J=1,...,N
     159              : !C           N      - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
     160              : !C
     161              : !C         OUTPUT     CYR,CYI ARE DOUBLE PRECISION
     162              : !C           CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
     163              : !C                    CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
     164              : !C                    CY(J)=I(FNU+J-1,Z)  OR
     165              : !C                    CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X))  J=1,...,N
     166              : !C                    DEPENDING ON KODE, X=REAL(Z)
     167              : !C           NZ     - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
     168              : !C                    NZ= 0   , NORMAL RETURN
     169              : !C                    NZ.GT.0 , LAST NZ COMPONENTS OF CY SET TO ZERO
     170              : !C                              TO UNDERFLOW, CY(J)=CMPLX(0.0D0,0.0D0)
     171              : !C                              J = N-NZ+1,...,N
     172              : !C           IERR   - ERROR FLAG
     173              : !C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
     174              : !C                    IERR=1, INPUT ERROR   - NO COMPUTATION
     175              : !C                    IERR=2, OVERFLOW      - NO COMPUTATION, REAL(Z) TOO
     176              : !C                            LARGE ON KODE=1
     177              : !C                    IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
     178              : !C                            BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
     179              : !C                            REDUCTION PRODUCE LESS THAN HALF OF MACHINE
     180              : !C                            ACCURACY
     181              : !C                    IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
     182              : !C                            TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
     183              : !C                            CANCE BY ARGUMENT REDUCTION
     184              : !C                    IERR=5, ERROR              - NO COMPUTATION,
     185              : !C                            ALGORITHM TERMINATION CONDITION NOT MET
     186              : !C
     187              : !C***LONG DESCRIPTION
     188              : !C
     189              : !C         THE COMPUTATION IS CARRIED OUT BY THE POWER SERIES FOR
     190              : !C         SMALL CABS(Z), THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z),
     191              : !C         THE MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN AND A
     192              : !C         NEUMANN SERIES FOR IMTERMEDIATE MAGNITUDES, AND THE
     193              : !C         UNIFORM ASYMPTOTIC EXPANSIONS FOR I(FNU,Z) AND J(FNU,Z)
     194              : !C         FOR LARGE ORDERS. BACKWARD RECURRENCE IS USED TO GENERATE
     195              : !C         SEQUENCES OR REDUCE ORDERS WHEN NECESSARY.
     196              : !C
     197              : !C         THE CALCULATIONS ABOVE ARE DONE IN THE RIGHT HALF PLANE AND
     198              : !C         CONTINUED INTO THE LEFT HALF PLANE BY THE FORMULA
     199              : !C
     200              : !C         I(FNU,Z*EXP(M*PI)) = EXP(M*PI*FNU)*I(FNU,Z)  REAL(Z).GT.0.0
     201              : !C                       M = +I OR -I,  I**2=-1
     202              : !C
     203              : !C         FOR NEGATIVE ORDERS,THE FORMULA
     204              : !C
     205              : !C              I(-FNU,Z) = I(FNU,Z) + (2/PI)*SIN(PI*FNU)*K(FNU,Z)
     206              : !C
     207              : !C         CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
     208              : !C         THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
     209              : !C         INTEGER,THE MAGNITUDE OF I(-FNU,Z)=I(FNU,Z) IS A LARGE
     210              : !C         NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
     211              : !C         K(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
     212              : !C         TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
     213              : !C         UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
     214              : !C         OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
     215              : !C         LARGE MEANS FNU.GT.CABS(Z).
     216              : !C
     217              : !C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
     218              : !C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
     219              : !C         LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
     220              : !C         CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
     221              : !C         LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
     222              : !C         IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
     223              : !C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
     224              : !C         IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
     225              : !C         LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
     226              : !C         MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
     227              : !C         INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
     228              : !C         RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
     229              : !C         ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
     230              : !C         ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
     231              : !C         ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
     232              : !C         THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
     233              : !C         TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
     234              : !C         IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
     235              : !C         SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
     236              : !C
     237              : !C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
     238              : !C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
     239              : !C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
     240              : !C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
     241              : !C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
     242              : !C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
     243              : !C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
     244              : !C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
     245              : !C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
     246              : !C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
     247              : !C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
     248              : !C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
     249              : !C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
     250              : !C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
     251              : !C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
     252              : !C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
     253              : !C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
     254              : !C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
     255              : !C         OR -PI/2+P.
     256              : !C
     257              : !C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
     258              : !C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
     259              : !C                 COMMERCE, 1955.
     260              : !C
     261              : !C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
     262              : !C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
     263              : !C
     264              : !C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
     265              : !C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
     266              : !C
     267              : !C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
     268              : !C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
     269              : !C                 1018, MAY, 1985
     270              : !C
     271              : !C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
     272              : !C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
     273              : !C                 MATH. SOFTWARE, 1986
     274              : !C
     275              : !C***ROUTINES CALLED  ZBINU,I1MACH,D1MACH
     276              : !C***END PROLOGUE  ZBESI
     277              : !C     COMPLEX CONE,CSGN,CW,CY,CZERO,Z,ZN
     278              :       DOUBLE PRECISION AA, ALIM, ARG, CONEI, CONER, CSGNI, CSGNR, CYI, &
     279              :      & CYR, DIG, ELIM, FNU, FNUL, PI, RL, R1M5, STR, TOL, ZI, ZNI, ZNR, &
     280              :      & ZR, AZ, BB, FN, ASCLE, RTOL, ATOL, STI
     281              :       INTEGER I, IERR, INU, K, KODE, K1,K2,N,NZ,NN
     282              :       DIMENSION CYR(N), CYI(N)
     283              :       DATA PI /3.14159265358979324D0/
     284              :       DATA CONER, CONEI /1.0D0,0.0D0/
     285              : !C
     286              : !C***FIRST EXECUTABLE STATEMENT  ZBESI
     287            0 :       IERR = 0
     288            0 :       NZ=0
     289            0 :       IF (FNU.LT.0.0D0) IERR=1
     290            0 :       IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
     291            0 :       IF (N.LT.1) IERR=1
     292            0 :       IF (IERR.NE.0) RETURN
     293              : !C-----------------------------------------------------------------------
     294              : !C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
     295              : !C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
     296              : !C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
     297              : !C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
     298              : !C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
     299              : !C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
     300              : !C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
     301              : !C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
     302              : !C     FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
     303              : !C-----------------------------------------------------------------------
     304            0 :       TOL = DMAX1(D1MACH(4),1.0D-18)
     305            0 :       K1 = I1MACH(15)
     306            0 :       K2 = I1MACH(16)
     307            0 :       R1M5 = D1MACH(5)
     308            0 :       K = MIN0(IABS(K1),IABS(K2))
     309            0 :       ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
     310            0 :       K1 = I1MACH(14) - 1
     311            0 :       AA = R1M5*DBLE(FLOAT(K1))
     312            0 :       DIG = DMIN1(AA,18.0D0)
     313            0 :       AA = AA*2.303D0
     314            0 :       ALIM = ELIM + DMAX1(-AA,-41.45D0)
     315            0 :       RL = 1.2D0*DIG + 3.0D0
     316            0 :       FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
     317              : !C-----------------------------------------------------------------------------
     318              : !C     TEST FOR PROPER RANGE
     319              : !C-----------------------------------------------------------------------
     320            0 :       AZ = AZABS(ZR,ZI)
     321            0 :       FN = FNU+DBLE(FLOAT(N-1))
     322            0 :       AA = 0.5D0/TOL
     323            0 :       BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
     324            0 :       AA = DMIN1(AA,BB)
     325            0 :       IF (AZ.GT.AA) GO TO 260
     326            0 :       IF (FN.GT.AA) GO TO 260
     327            0 :       AA = DSQRT(AA)
     328            0 :       IF (AZ.GT.AA) IERR=3
     329            0 :       IF (FN.GT.AA) IERR=3
     330            0 :       ZNR = ZR
     331            0 :       ZNI = ZI
     332            0 :       CSGNR = CONER
     333            0 :       CSGNI = CONEI
     334            0 :       IF (ZR.GE.0.0D0) GO TO 40
     335            0 :       ZNR = -ZR
     336            0 :       ZNI = -ZI
     337              : !C-----------------------------------------------------------------------
     338              : !C     CALCULATE CSGN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
     339              : !C     WHEN FNU IS LARGE
     340              : !C-----------------------------------------------------------------------
     341            0 :       INU = INT(SNGL(FNU))
     342            0 :       ARG = (FNU-DBLE(FLOAT(INU)))*PI
     343            0 :       IF (ZI.LT.0.0D0) ARG = -ARG
     344            0 :       CSGNR = DCOS(ARG)
     345            0 :       CSGNI = DSIN(ARG)
     346            0 :       IF (MOD(INU,2).EQ.0) GO TO 40
     347            0 :       CSGNR = -CSGNR
     348            0 :       CSGNI = -CSGNI
     349              :    40 CONTINUE
     350              :       CALL ZBINU(ZNR, ZNI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, TOL, &
     351            0 :      & ELIM, ALIM)
     352            0 :       IF (NZ.LT.0) GO TO 120
     353            0 :       IF (ZR.GE.0.0D0) RETURN
     354              : !C-----------------------------------------------------------------------
     355              : !C     ANALYTIC CONTINUATION TO THE LEFT HALF PLANE
     356              : !C-----------------------------------------------------------------------
     357            0 :       NN = N - NZ
     358            0 :       IF (NN.EQ.0) RETURN
     359            0 :       RTOL = 1.0D0/TOL
     360            0 :       ASCLE = D1MACH(1)*RTOL*1.0D+3
     361            0 :       DO 50 I=1,NN
     362              : !C       STR = CYR(I)*CSGNR - CYI(I)*CSGNI
     363              : !C       CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR
     364              : !C       CYR(I) = STR
     365            0 :         AA = CYR(I)
     366            0 :         BB = CYI(I)
     367            0 :         ATOL = 1.0D0
     368            0 :         IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 55
     369            0 :           AA = AA*RTOL
     370            0 :           BB = BB*RTOL
     371            0 :           ATOL = TOL
     372              :    55   CONTINUE
     373            0 :         STR = AA*CSGNR - BB*CSGNI
     374            0 :         STI = AA*CSGNI + BB*CSGNR
     375            0 :         CYR(I) = STR*ATOL
     376            0 :         CYI(I) = STI*ATOL
     377            0 :         CSGNR = -CSGNR
     378            0 :         CSGNI = -CSGNI
     379            0 :    50 CONTINUE
     380            0 :       RETURN
     381              :   120 CONTINUE
     382            0 :       IF(NZ.EQ.(-2)) GO TO 130
     383            0 :       NZ = 0
     384            0 :       IERR=2
     385            0 :       RETURN
     386              :   130 CONTINUE
     387            0 :       NZ=0
     388            0 :       IERR=5
     389            0 :       RETURN
     390              :   260 CONTINUE
     391            0 :       NZ=0
     392            0 :       IERR=4
     393            0 :       RETURN
     394              :       END SUBROUTINE ZBESI
     395              : 
     396              : 
     397            0 :       SUBROUTINE ZBESK(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
     398              : !C***BEGIN PROLOGUE  ZBESK
     399              : !C***DATE WRITTEN   830501   (YYMMDD)
     400              : !C***REVISION DATE  890801   (YYMMDD)
     401              : !C***CATEGORY NO.  B5K
     402              : !C***KEYWORDS  K-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
     403              : !C             MODIFIED BESSEL FUNCTION OF THE SECOND KIND,
     404              : !C             BESSEL FUNCTION OF THE THIRD KIND
     405              : !C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
     406              : !C***PURPOSE  TO COMPUTE K-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
     407              : !C***DESCRIPTION
     408              : !C
     409              : !C                      ***A DOUBLE PRECISION ROUTINE***
     410              : !C
     411              : !C         ON KODE=1, CBESK COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
     412              : !C         BESSEL FUNCTIONS CY(J)=K(FNU+J-1,Z) FOR REAL, NONNEGATIVE
     413              : !C         ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z.NE.CMPLX(0.0,0.0)
     414              : !C         IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESK
     415              : !C         RETURNS THE SCALED K FUNCTIONS,
     416              : !C
     417              : !C         CY(J)=EXP(Z)*K(FNU+J-1,Z) , J=1,...,N,
     418              : !C
     419              : !C         WHICH REMOVE THE EXPONENTIAL BEHAVIOR IN BOTH THE LEFT AND
     420              : !C         RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND
     421              : !C         NOTATION ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL
     422              : !C         FUNCTIONS (REF. 1).
     423              : !C
     424              : !C         INPUT      ZR,ZI,FNU ARE DOUBLE PRECISION
     425              : !C           ZR,ZI  - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
     426              : !C                    -PI.LT.ARG(Z).LE.PI
     427              : !C           FNU    - ORDER OF INITIAL K FUNCTION, FNU.GE.0.0D0
     428              : !C           N      - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
     429              : !C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
     430              : !C                    KODE= 1  RETURNS
     431              : !C                             CY(I)=K(FNU+I-1,Z), I=1,...,N
     432              : !C                        = 2  RETURNS
     433              : !C                             CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
     434              : !C
     435              : !C         OUTPUT     CYR,CYI ARE DOUBLE PRECISION
     436              : !C           CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
     437              : !C                    CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
     438              : !C                    CY(I)=K(FNU+I-1,Z), I=1,...,N OR
     439              : !C                    CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
     440              : !C                    DEPENDING ON KODE
     441              : !C           NZ     - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW.
     442              : !C                    NZ= 0   , NORMAL RETURN
     443              : !C                    NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE
     444              : !C                              TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
     445              : !C                              I=1,...,N WHEN X.GE.0.0. WHEN X.LT.0.0
     446              : !C                              NZ STATES ONLY THE NUMBER OF UNDERFLOWS
     447              : !C                              IN THE SEQUENCE.
     448              : !C
     449              : !C           IERR   - ERROR FLAG
     450              : !C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
     451              : !C                    IERR=1, INPUT ERROR   - NO COMPUTATION
     452              : !C                    IERR=2, OVERFLOW      - NO COMPUTATION, FNU IS
     453              : !C                            TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
     454              : !C                    IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
     455              : !C                            BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
     456              : !C                            REDUCTION PRODUCE LESS THAN HALF OF MACHINE
     457              : !C                            ACCURACY
     458              : !C                    IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
     459              : !C                            TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
     460              : !C                            CANCE BY ARGUMENT REDUCTION
     461              : !C                    IERR=5, ERROR              - NO COMPUTATION,
     462              : !C                            ALGORITHM TERMINATION CONDITION NOT MET
     463              : !C
     464              : !C***LONG DESCRIPTION
     465              : !C
     466              : !C         EQUATIONS OF THE REFERENCE ARE IMPLEMENTED FOR SMALL ORDERS
     467              : !C         DNU AND DNU+1.0 IN THE RIGHT HALF PLANE X.GE.0.0. FORWARD
     468              : !C         RECURRENCE GENERATES HIGHER ORDERS. K IS CONTINUED TO THE LEFT
     469              : !C         HALF PLANE BY THE RELATION
     470              : !C
     471              : !C         K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
     472              : !C         MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
     473              : !C
     474              : !C         WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
     475              : !C
     476              : !C         FOR LARGE ORDERS, FNU.GT.FNUL, THE K FUNCTION IS COMPUTED
     477              : !C         BY MEANS OF ITS UNIFORM ASYMPTOTIC EXPANSIONS.
     478              : !C
     479              : !C         FOR NEGATIVE ORDERS, THE FORMULA
     480              : !C
     481              : !C                       K(-FNU,Z) = K(FNU,Z)
     482              : !C
     483              : !C         CAN BE USED.
     484              : !C
     485              : !C         CBESK ASSUMES THAT A SIGNIFICANT DIGIT SINH(X) FUNCTION IS
     486              : !C         AVAILABLE.
     487              : !C
     488              : !C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
     489              : !C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
     490              : !C         LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
     491              : !C         CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
     492              : !C         LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
     493              : !C         IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
     494              : !C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
     495              : !C         IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
     496              : !C         LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
     497              : !C         MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
     498              : !C         INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
     499              : !C         RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
     500              : !C         ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
     501              : !C         ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
     502              : !C         ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
     503              : !C         THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
     504              : !C         TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
     505              : !C         IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
     506              : !C         SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
     507              : !C
     508              : !C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
     509              : !C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
     510              : !C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
     511              : !C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
     512              : !C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
     513              : !C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
     514              : !C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
     515              : !C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
     516              : !C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
     517              : !C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
     518              : !C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
     519              : !C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
     520              : !C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
     521              : !C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
     522              : !C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
     523              : !C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
     524              : !C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
     525              : !C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
     526              : !C         OR -PI/2+P.
     527              : !C
     528              : !C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
     529              : !C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
     530              : !C                 COMMERCE, 1955.
     531              : !C
     532              : !C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
     533              : !C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
     534              : !C
     535              : !C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
     536              : !C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983.
     537              : !C
     538              : !C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
     539              : !C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
     540              : !C                 1018, MAY, 1985
     541              : !C
     542              : !C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
     543              : !C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
     544              : !C                 MATH. SOFTWARE, 1986
     545              : !C
     546              : !C***ROUTINES CALLED  ZACON,ZBKNU,ZBUNK,ZUOIK,AZABS,I1MACH,D1MACH
     547              : !C***END PROLOGUE  ZBESK
     548              : !C
     549              : !C     COMPLEX CY,Z
     550              :       DOUBLE PRECISION AA, ALIM, ALN, ARG, AZ, CYI, CYR, DIG, ELIM, FN, &
     551              :      & FNU, FNUL, RL, R1M5, TOL, UFL, ZI, ZR, BB !D1MACH, AZABS
     552              :       INTEGER IERR, K, KODE, K1, K2, MR, N, NN, NUF, NW, NZ!, I1MACH
     553              :       DIMENSION CYR(N), CYI(N)
     554              : !C***FIRST EXECUTABLE STATEMENT  ZBESK
     555            0 :       IERR = 0
     556            0 :       NZ=0
     557            0 :       IF (ZI.EQ.0.0E0 .AND. ZR.EQ.0.0E0) IERR=1
     558            0 :       IF (FNU.LT.0.0D0) IERR=1
     559            0 :       IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
     560            0 :       IF (N.LT.1) IERR=1
     561            0 :       IF (IERR.NE.0) RETURN
     562            0 :       NN = N
     563              : !C-----------------------------------------------------------------------
     564              : !C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
     565              : !C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
     566              : !C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
     567              : !C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
     568              : !C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
     569              : !C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
     570              : !C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
     571              : !C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
     572              : !C     FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
     573              : !C-----------------------------------------------------------------------
     574            0 :       TOL = DMAX1(D1MACH(4),1.0D-18)
     575            0 :       K1 = I1MACH(15)
     576            0 :       K2 = I1MACH(16)
     577            0 :       R1M5 = D1MACH(5)
     578            0 :       K = MIN0(IABS(K1),IABS(K2))
     579            0 :       ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
     580            0 :       K1 = I1MACH(14) - 1
     581            0 :       AA = R1M5*DBLE(FLOAT(K1))
     582            0 :       DIG = DMIN1(AA,18.0D0)
     583            0 :       AA = AA*2.303D0
     584            0 :       ALIM = ELIM + DMAX1(-AA,-41.45D0)
     585            0 :       FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
     586            0 :       RL = 1.2D0*DIG + 3.0D0
     587              : !C-----------------------------------------------------------------------------
     588              : !C     TEST FOR PROPER RANGE
     589              : !C-----------------------------------------------------------------------
     590            0 :       AZ = AZABS(ZR,ZI)
     591            0 :       FN = FNU + DBLE(FLOAT(NN-1))
     592            0 :       AA = 0.5D0/TOL
     593            0 :       BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
     594            0 :       AA = DMIN1(AA,BB)
     595            0 :       IF (AZ.GT.AA) GO TO 260
     596            0 :       IF (FN.GT.AA) GO TO 260
     597            0 :       AA = DSQRT(AA)
     598            0 :       IF (AZ.GT.AA) IERR=3
     599            0 :       IF (FN.GT.AA) IERR=3
     600              : !C-----------------------------------------------------------------------
     601              : !C     OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
     602              : !C-----------------------------------------------------------------------
     603              : !C     UFL = DEXP(-ELIM)
     604            0 :       UFL = D1MACH(1)*1.0D+3
     605            0 :       IF (AZ.LT.UFL) GO TO 180
     606            0 :       IF (FNU.GT.FNUL) GO TO 80
     607            0 :       IF (FN.LE.1.0D0) GO TO 60
     608            0 :       IF (FN.GT.2.0D0) GO TO 50
     609            0 :       IF (AZ.GT.TOL) GO TO 60
     610            0 :       ARG = 0.5D0*AZ
     611            0 :       ALN = -FN*DLOG(ARG)
     612            0 :       IF (ALN.GT.ELIM) GO TO 180
     613            0 :       GO TO 60
     614              :    50 CONTINUE
     615              :       CALL ZUOIK(ZR, ZI, FNU, KODE, 2, NN, CYR, CYI, NUF, TOL, ELIM, &
     616            0 :      & ALIM)
     617            0 :       IF (NUF.LT.0) GO TO 180
     618            0 :       NZ = NZ + NUF
     619            0 :       NN = NN - NUF
     620              : !C-----------------------------------------------------------------------
     621              : !C     HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
     622              : !C     IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
     623              : !C-----------------------------------------------------------------------
     624            0 :       IF (NN.EQ.0) GO TO 100
     625              :    60 CONTINUE
     626            0 :       IF (ZR.LT.0.0D0) GO TO 70
     627              : !C-----------------------------------------------------------------------
     628              : !C     RIGHT HALF PLANE COMPUTATION, REAL(Z).GE.0.
     629              : !C-----------------------------------------------------------------------
     630            0 :       CALL ZBKNU(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
     631            0 :       IF (NW.LT.0) GO TO 200
     632            0 :       NZ=NW
     633            0 :       RETURN
     634              : !C-----------------------------------------------------------------------
     635              : !C     LEFT HALF PLANE COMPUTATION
     636              : !C     PI/2.LT.ARG(Z).LE.PI AND -PI.LT.ARG(Z).LT.-PI/2.
     637              : !C-----------------------------------------------------------------------
     638              :    70 CONTINUE
     639            0 :       IF (NZ.NE.0) GO TO 180
     640            0 :       MR = 1
     641            0 :       IF (ZI.LT.0.0D0) MR = -1
     642              :       CALL ZACON(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, RL, FNUL, &
     643            0 :      & TOL, ELIM, ALIM)
     644            0 :       IF (NW.LT.0) GO TO 200
     645            0 :       NZ=NW
     646            0 :       RETURN
     647              : !C-----------------------------------------------------------------------
     648              : !C     UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
     649              : !C-----------------------------------------------------------------------
     650              :    80 CONTINUE
     651            0 :       MR = 0
     652            0 :       IF (ZR.GE.0.0D0) GO TO 90
     653            0 :       MR = 1
     654            0 :       IF (ZI.LT.0.0D0) MR = -1
     655              :    90 CONTINUE
     656              :       CALL ZBUNK(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, TOL, ELIM, &
     657            0 :      & ALIM)
     658            0 :       IF (NW.LT.0) GO TO 200
     659            0 :       NZ = NZ + NW
     660            0 :       RETURN
     661              :   100 CONTINUE
     662            0 :       IF (ZR.LT.0.0D0) GO TO 180
     663            0 :       RETURN
     664              :   180 CONTINUE
     665            0 :       NZ = 0
     666            0 :       IERR=2
     667            0 :       RETURN
     668              :   200 CONTINUE
     669            0 :       IF(NW.EQ.(-1)) GO TO 180
     670            0 :       NZ=0
     671            0 :       IERR=5
     672            0 :       RETURN
     673              :   260 CONTINUE
     674            0 :       NZ=0
     675            0 :       IERR=4
     676            0 :       RETURN
     677              :       END SUBROUTINE ZBESK
     678              : 
     679            0 :       DOUBLE PRECISION FUNCTION AZABS(ZR, ZI)
     680              : !C***BEGIN PROLOGUE  AZABS
     681              : !C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
     682              : !C
     683              : !C     AZABS COMPUTES THE ABSOLUTE VALUE OR MAGNITUDE OF A DOUBLE
     684              : !C     PRECISION COMPLEX VARIABLE CMPLX(ZR,ZI)
     685              : !C
     686              : !C***ROUTINES CALLED  (NONE)
     687              : !C***END PROLOGUE  AZABS
     688              :       DOUBLE PRECISION ZR, ZI, U, V, Q, S
     689            0 :       U = DABS(ZR)
     690            0 :       V = DABS(ZI)
     691            0 :       S = U + V
     692              : !C-----------------------------------------------------------------------
     693              : !C     S*1.0D0 MAKES AN UNNORMALIZED UNDERFLOW ON CDC MACHINES INTO A
     694              : !C     TRUE FLOATING ZERO
     695              : !C-----------------------------------------------------------------------
     696            0 :       S = S*1.0D+0
     697            0 :       IF (S.EQ.0.0D+0) GO TO 20
     698            0 :       IF (U.GT.V) GO TO 10
     699            0 :       Q = U/V
     700            0 :       AZABS = V*DSQRT(1.D+0+Q*Q)
     701            0 :       RETURN
     702            0 :    10 Q = V/U
     703            0 :       AZABS = U*DSQRT(1.D+0+Q*Q)
     704            0 :       RETURN
     705            0 :    20 AZABS = 0.0D+0
     706              :       RETURN
     707              :       END FUNCTION AZABS
     708              : 
     709              : 
     710              : 
     711            0 :       SUBROUTINE ZACON(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, FNUL, &
     712              :      & TOL, ELIM, ALIM)
     713              : !C***BEGIN PROLOGUE  ZACON
     714              : !C***REFER TO  ZBESK,ZBESH
     715              : !C
     716              : !C     ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA
     717              : !C
     718              : !C         K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
     719              : !C                 MP=PI*MR*CMPLX(0.0,1.0)
     720              : !C
     721              : !C     TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
     722              : !C     HALF Z PLANE
     723              : !C
     724              : !C***ROUTINES CALLED  ZBINU,ZBKNU,ZS1S2,D1MACH,AZABS,ZMLT
     725              : !C***END PROLOGUE  ZACON
     726              : !C     COMPLEX CK,CONE,CSCL,CSCR,CSGN,CSPN,CY,CZERO,C1,C2,RZ,SC1,SC2,ST,
     727              : !C    *S1,S2,Y,Z,ZN
     728              :       DOUBLE PRECISION ALIM, ARG, ASCLE, AS2, AZN, BRY, BSCLE, CKI, &
     729              :      & CKR, CONER, CPN, CSCL, CSCR, CSGNI, CSGNR, CSPNI, CSPNR, &
     730              :      & CSR, CSRR, CSSR, CYI, CYR, C1I, C1M, C1R, C2I, C2R, ELIM, FMR, &
     731              :      & FN, FNU, FNUL, PI, PTI, PTR, RAZN, RL, RZI, RZR, SC1I, SC1R, &
     732              :      & SC2I, SC2R, SGN, SPN, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, &
     733              :      & YY, ZEROR, ZI, ZNI, ZNR, ZR!, D1MACH, AZABS
     734              :       INTEGER I, INU, IUF, KFLAG, KODE, MR, N, NN, NW, NZ
     735              :       DIMENSION YR(N), YI(N), CYR(2), CYI(2), CSSR(3), CSRR(3), BRY(3)
     736              :       DATA PI / 3.14159265358979324D0 /
     737              :       DATA ZEROR,CONER / 0.0D0,1.0D0 /
     738            0 :       NZ = 0
     739            0 :       ZNR = -ZR
     740            0 :       ZNI = -ZI
     741            0 :       NN = N
     742              :       CALL ZBINU(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, FNUL, TOL, &
     743            0 :      & ELIM, ALIM)
     744            0 :       IF (NW.LT.0) GO TO 90
     745              : !C-----------------------------------------------------------------------
     746              : !C     ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
     747              : !C-----------------------------------------------------------------------
     748            0 :       NN = MIN0(2,N)
     749            0 :       CALL ZBKNU(ZNR, ZNI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
     750            0 :       IF (NW.NE.0) GO TO 90
     751            0 :       S1R = CYR(1)
     752            0 :       S1I = CYI(1)
     753            0 :       FMR = DBLE(FLOAT(MR))
     754            0 :       SGN = -DSIGN(PI,FMR)
     755            0 :       CSGNR = ZEROR
     756            0 :       CSGNI = SGN
     757            0 :       IF (KODE.EQ.1) GO TO 10
     758            0 :       YY = -ZNI
     759            0 :       CPN = DCOS(YY)
     760            0 :       SPN = DSIN(YY)
     761            0 :       CALL ZMLT(CSGNR, CSGNI, CPN, SPN, CSGNR, CSGNI)
     762              :    10 CONTINUE
     763              : !C-----------------------------------------------------------------------
     764              : !C     CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
     765              : !C     WHEN FNU IS LARGE
     766              : !C-----------------------------------------------------------------------
     767            0 :       INU = INT(SNGL(FNU))
     768            0 :       ARG = (FNU-DBLE(FLOAT(INU)))*SGN
     769            0 :       CPN = DCOS(ARG)
     770            0 :       SPN = DSIN(ARG)
     771            0 :       CSPNR = CPN
     772            0 :       CSPNI = SPN
     773            0 :       IF (MOD(INU,2).EQ.0) GO TO 20
     774            0 :       CSPNR = -CSPNR
     775            0 :       CSPNI = -CSPNI
     776              :    20 CONTINUE
     777            0 :       IUF = 0
     778            0 :       C1R = S1R
     779            0 :       C1I = S1I
     780            0 :       C2R = YR(1)
     781            0 :       C2I = YI(1)
     782            0 :       ASCLE = 1.0D+3*D1MACH(1)/TOL
     783            0 :       IF (KODE.EQ.1) GO TO 30
     784            0 :       CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
     785            0 :       NZ = NZ + NW
     786            0 :       SC1R = C1R
     787            0 :       SC1I = C1I
     788              :    30 CONTINUE
     789            0 :       CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
     790            0 :       CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
     791            0 :       YR(1) = STR + PTR
     792            0 :       YI(1) = STI + PTI
     793            0 :       IF (N.EQ.1) RETURN
     794            0 :       CSPNR = -CSPNR
     795            0 :       CSPNI = -CSPNI
     796            0 :       S2R = CYR(2)
     797            0 :       S2I = CYI(2)
     798            0 :       C1R = S2R
     799            0 :       C1I = S2I
     800            0 :       C2R = YR(2)
     801            0 :       C2I = YI(2)
     802            0 :       IF (KODE.EQ.1) GO TO 40
     803            0 :       CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
     804            0 :       NZ = NZ + NW
     805            0 :       SC2R = C1R
     806            0 :       SC2I = C1I
     807              :    40 CONTINUE
     808            0 :       CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
     809            0 :       CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
     810            0 :       YR(2) = STR + PTR
     811            0 :       YI(2) = STI + PTI
     812            0 :       IF (N.EQ.2) RETURN
     813            0 :       CSPNR = -CSPNR
     814            0 :       CSPNI = -CSPNI
     815            0 :       AZN = AZABS(ZNR,ZNI)
     816            0 :       RAZN = 1.0D0/AZN
     817            0 :       STR = ZNR*RAZN
     818            0 :       STI = -ZNI*RAZN
     819            0 :       RZR = (STR+STR)*RAZN
     820            0 :       RZI = (STI+STI)*RAZN
     821            0 :       FN = FNU + 1.0D0
     822            0 :       CKR = FN*RZR
     823            0 :       CKI = FN*RZI
     824              : !C-----------------------------------------------------------------------
     825              : !C     SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS
     826              : !C-----------------------------------------------------------------------
     827            0 :       CSCL = 1.0D0/TOL
     828            0 :       CSCR = TOL
     829            0 :       CSSR(1) = CSCL
     830            0 :       CSSR(2) = CONER
     831            0 :       CSSR(3) = CSCR
     832            0 :       CSRR(1) = CSCR
     833            0 :       CSRR(2) = CONER
     834            0 :       CSRR(3) = CSCL
     835            0 :       BRY(1) = ASCLE
     836            0 :       BRY(2) = 1.0D0/ASCLE
     837            0 :       BRY(3) = D1MACH(2)
     838            0 :       AS2 = AZABS(S2R,S2I)
     839            0 :       KFLAG = 2
     840            0 :       IF (AS2.GT.BRY(1)) GO TO 50
     841              :       KFLAG = 1
     842            0 :       GO TO 60
     843              :    50 CONTINUE
     844            0 :       IF (AS2.LT.BRY(2)) GO TO 60
     845            0 :       KFLAG = 3
     846              :    60 CONTINUE
     847            0 :       BSCLE = BRY(KFLAG)
     848            0 :       S1R = S1R*CSSR(KFLAG)
     849            0 :       S1I = S1I*CSSR(KFLAG)
     850            0 :       S2R = S2R*CSSR(KFLAG)
     851            0 :       S2I = S2I*CSSR(KFLAG)
     852            0 :       CSR = CSRR(KFLAG)
     853            0 :       DO 80 I=3,N
     854            0 :         STR = S2R
     855            0 :         STI = S2I
     856            0 :         S2R = CKR*STR - CKI*STI + S1R
     857            0 :         S2I = CKR*STI + CKI*STR + S1I
     858            0 :         S1R = STR
     859            0 :         S1I = STI
     860            0 :         C1R = S2R*CSR
     861            0 :         C1I = S2I*CSR
     862            0 :         STR = C1R
     863            0 :         STI = C1I
     864            0 :         C2R = YR(I)
     865            0 :         C2I = YI(I)
     866            0 :         IF (KODE.EQ.1) GO TO 70
     867            0 :         IF (IUF.LT.0) GO TO 70
     868            0 :         CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
     869            0 :         NZ = NZ + NW
     870            0 :         SC1R = SC2R
     871            0 :         SC1I = SC2I
     872            0 :         SC2R = C1R
     873            0 :         SC2I = C1I
     874            0 :         IF (IUF.NE.3) GO TO 70
     875            0 :         IUF = -4
     876            0 :         S1R = SC1R*CSSR(KFLAG)
     877            0 :         S1I = SC1I*CSSR(KFLAG)
     878            0 :         S2R = SC2R*CSSR(KFLAG)
     879            0 :         S2I = SC2I*CSSR(KFLAG)
     880            0 :         STR = SC2R
     881            0 :         STI = SC2I
     882              :    70   CONTINUE
     883            0 :         PTR = CSPNR*C1R - CSPNI*C1I
     884            0 :         PTI = CSPNR*C1I + CSPNI*C1R
     885            0 :         YR(I) = PTR + CSGNR*C2R - CSGNI*C2I
     886            0 :         YI(I) = PTI + CSGNR*C2I + CSGNI*C2R
     887            0 :         CKR = CKR + RZR
     888            0 :         CKI = CKI + RZI
     889            0 :         CSPNR = -CSPNR
     890            0 :         CSPNI = -CSPNI
     891            0 :         IF (KFLAG.GE.3) GO TO 80
     892            0 :         PTR = DABS(C1R)
     893            0 :         PTI = DABS(C1I)
     894            0 :         C1M = DMAX1(PTR,PTI)
     895            0 :         IF (C1M.LE.BSCLE) GO TO 80
     896            0 :         KFLAG = KFLAG + 1
     897            0 :         BSCLE = BRY(KFLAG)
     898            0 :         S1R = S1R*CSR
     899            0 :         S1I = S1I*CSR
     900              :         S2R = STR
     901              :         S2I = STI
     902            0 :         S1R = S1R*CSSR(KFLAG)
     903            0 :         S1I = S1I*CSSR(KFLAG)
     904            0 :         S2R = S2R*CSSR(KFLAG)
     905            0 :         S2I = S2I*CSSR(KFLAG)
     906            0 :         CSR = CSRR(KFLAG)
     907            0 :    80 CONTINUE
     908            0 :       RETURN
     909              :    90 CONTINUE
     910            0 :       NZ = -1
     911            0 :       IF(NW.EQ.(-2)) NZ=-2
     912              :       RETURN
     913              :       END SUBROUTINE ZACON
     914              : 
     915            0 :       SUBROUTINE ZBINU(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, &
     916              :      & TOL, ELIM, ALIM)
     917              : !C***BEGIN PROLOGUE  ZBINU
     918              : !C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZAIRY,ZBIRY
     919              : !C
     920              : !C     ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
     921              : !C
     922              : !C***ROUTINES CALLED  AZABS,ZASYI,ZBUNI,ZMLRI,ZSERI,ZUOIK,ZWRSK
     923              : !C***END PROLOGUE  ZBINU
     924              :       DOUBLE PRECISION ALIM, AZ, CWI, CWR, CYI, CYR, DFNU, ELIM, FNU, &
     925              :      & FNUL, RL, TOL, ZEROI, ZEROR, ZI, ZR!, AZABS
     926              :       INTEGER I, INW, KODE, N, NLAST, NN, NUI, NW, NZ
     927              :       DIMENSION CYR(N), CYI(N), CWR(2), CWI(2)
     928              :       DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
     929              : !C
     930            0 :       NZ = 0
     931            0 :       AZ = AZABS(ZR,ZI)
     932            0 :       NN = N
     933            0 :       DFNU = FNU + DBLE(FLOAT(N-1))
     934            0 :       IF (AZ.LE.2.0D0) GO TO 10
     935            0 :       IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
     936              :    10 CONTINUE
     937              : !C-----------------------------------------------------------------------
     938              : !C     POWER SERIES
     939              : !C-----------------------------------------------------------------------
     940            0 :       CALL ZSERI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
     941            0 :       INW = IABS(NW)
     942            0 :       NZ = NZ + INW
     943            0 :       NN = NN - INW
     944            0 :       IF (NN.EQ.0) RETURN
     945            0 :       IF (NW.GE.0) GO TO 120
     946            0 :       DFNU = FNU + DBLE(FLOAT(NN-1))
     947              :    20 CONTINUE
     948            0 :       IF (AZ.LT.RL) GO TO 40
     949            0 :       IF (DFNU.LE.1.0D0) GO TO 30
     950            0 :       IF (AZ+AZ.LT.DFNU*DFNU) GO TO 50
     951              : !C-----------------------------------------------------------------------
     952              : !C     ASYMPTOTIC EXPANSION FOR LARGE Z
     953              : !C-----------------------------------------------------------------------
     954              :    30 CONTINUE
     955              :       CALL ZASYI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, RL, TOL, ELIM, &
     956            0 :      & ALIM)
     957            0 :       IF (NW.LT.0) GO TO 130
     958            0 :       GO TO 120
     959              :    40 CONTINUE
     960            0 :       IF (DFNU.LE.1.0D0) GO TO 70
     961              :    50 CONTINUE
     962              : !C-----------------------------------------------------------------------
     963              : !C     OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
     964              : !C-----------------------------------------------------------------------
     965              :       CALL ZUOIK(ZR, ZI, FNU, KODE, 1, NN, CYR, CYI, NW, TOL, ELIM, &
     966            0 :      & ALIM)
     967            0 :       IF (NW.LT.0) GO TO 130
     968            0 :       NZ = NZ + NW
     969            0 :       NN = NN - NW
     970            0 :       IF (NN.EQ.0) RETURN
     971            0 :       DFNU = FNU+DBLE(FLOAT(NN-1))
     972            0 :       IF (DFNU.GT.FNUL) GO TO 110
     973            0 :       IF (AZ.GT.FNUL) GO TO 110
     974              :    60 CONTINUE
     975            0 :       IF (AZ.GT.RL) GO TO 80
     976              :    70 CONTINUE
     977              : !C-----------------------------------------------------------------------
     978              : !C     MILLER ALGORITHM NORMALIZED BY THE SERIES
     979              : !C-----------------------------------------------------------------------
     980            0 :       CALL ZMLRI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL)
     981            0 :       IF(NW.LT.0) GO TO 130
     982            0 :       GO TO 120
     983              :    80 CONTINUE
     984              : !C-----------------------------------------------------------------------
     985              : !C     MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
     986              : !C-----------------------------------------------------------------------
     987              : !C-----------------------------------------------------------------------
     988              : !C     OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
     989              : !C-----------------------------------------------------------------------
     990              :       CALL ZUOIK(ZR, ZI, FNU, KODE, 2, 2, CWR, CWI, NW, TOL, ELIM, &
     991            0 :      & ALIM)
     992            0 :       IF (NW.GE.0) GO TO 100
     993            0 :       NZ = NN
     994            0 :       DO 90 I=1,NN
     995            0 :         CYR(I) = ZEROR
     996            0 :         CYI(I) = ZEROI
     997            0 :    90 CONTINUE
     998            0 :       RETURN
     999              :   100 CONTINUE
    1000            0 :       IF (NW.GT.0) GO TO 130
    1001              :       CALL ZWRSK(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, CWR, CWI, TOL, &
    1002            0 :      & ELIM, ALIM)
    1003            0 :       IF (NW.LT.0) GO TO 130
    1004            0 :       GO TO 120
    1005              :   110 CONTINUE
    1006              : !C-----------------------------------------------------------------------
    1007              : !C     INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
    1008              : !C-----------------------------------------------------------------------
    1009            0 :       NUI = INT(SNGL(FNUL-DFNU)) + 1
    1010            0 :       NUI = MAX0(NUI,0)
    1011              :       CALL ZBUNI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, NUI, NLAST, FNUL, &
    1012            0 :      & TOL, ELIM, ALIM)
    1013            0 :       IF (NW.LT.0) GO TO 130
    1014            0 :       NZ = NZ + NW
    1015            0 :       IF (NLAST.EQ.0) GO TO 120
    1016            0 :       NN = NLAST
    1017            0 :       GO TO 60
    1018              :   120 CONTINUE
    1019            0 :       RETURN
    1020              :   130 CONTINUE
    1021            0 :       NZ = -1
    1022            0 :       IF(NW.EQ.(-2)) NZ=-2
    1023              :       RETURN
    1024              :       END SUBROUTINE ZBINU
    1025              : 
    1026            0 :       SUBROUTINE ZSERI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, &
    1027              :      & ALIM)
    1028              : !C***BEGIN PROLOGUE  ZSERI
    1029              : !C***REFER TO  ZBESI,ZBESK
    1030              : !C
    1031              : !C     ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
    1032              : !C     MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE
    1033              : !C     REGION CABS(Z).LE.2*SQRT(FNU+1). NZ=0 IS A NORMAL RETURN.
    1034              : !C     NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO
    1035              : !C     DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE
    1036              : !C     CONDITION CABS(Z).LE.2*SQRT(FNU+1) WAS VIOLATED AND THE
    1037              : !C     COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).
    1038              : !C
    1039              : !C***ROUTINES CALLED  DGAMLN,D1MACH,ZUCHK,AZABS,ZDIV,AZLOG,ZMLT
    1040              : !C***END PROLOGUE  ZSERI
    1041              : !C     COMPLEX AK1,CK,COEF,CONE,CRSC,CSCL,CZ,CZERO,HZ,RZ,S1,S2,Y,Z
    1042              :       DOUBLE PRECISION AA, ACZ, AK, AK1I, AK1R, ALIM, ARM, ASCLE, ATOL, &
    1043              :      & AZ, CKI, CKR, COEFI, COEFR, CONEI, CONER, CRSCR, CZI, CZR, DFNU, &
    1044              :      & ELIM, FNU, FNUP, HZI, HZR, RAZ, RS, RTR1, RZI, RZR, S, SS, STI, &
    1045              :      & STR, S1I, S1R, S2I, S2R, TOL, YI, YR, WI, WR, ZEROI, ZEROR, ZI, &
    1046              :      & ZR!, DGAMLN, D1MACH, AZABS
    1047              :       INTEGER I, IB, IDUM, IFLAG, IL, K, KODE, L, M, N, NN, NZ, NW
    1048              :       DIMENSION YR(N), YI(N), WR(2), WI(2)
    1049              :       DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
    1050              : !C
    1051            0 :       NZ = 0
    1052            0 :       AZ = AZABS(ZR,ZI)
    1053            0 :       IF (AZ.EQ.0.0D0) GO TO 160
    1054            0 :       ARM = 1.0D+3*D1MACH(1)
    1055            0 :       RTR1 = DSQRT(ARM)
    1056            0 :       CRSCR = 1.0D0
    1057            0 :       IFLAG = 0
    1058            0 :       IF (AZ.LT.ARM) GO TO 150
    1059            0 :       HZR = 0.5D0*ZR
    1060            0 :       HZI = 0.5D0*ZI
    1061            0 :       CZR = ZEROR
    1062            0 :       CZI = ZEROI
    1063            0 :       IF (AZ.LE.RTR1) GO TO 10
    1064            0 :       CALL ZMLT(HZR, HZI, HZR, HZI, CZR, CZI)
    1065              :    10 CONTINUE
    1066            0 :       ACZ = AZABS(CZR,CZI)
    1067            0 :       NN = N
    1068            0 :       CALL AZLOG(HZR, HZI, CKR, CKI, IDUM)
    1069              :    20 CONTINUE
    1070            0 :       DFNU = FNU + DBLE(FLOAT(NN-1))
    1071            0 :       FNUP = DFNU + 1.0D0
    1072              : !C-----------------------------------------------------------------------
    1073              : !C     UNDERFLOW TEST
    1074              : !C-----------------------------------------------------------------------
    1075            0 :       AK1R = CKR*DFNU
    1076            0 :       AK1I = CKI*DFNU
    1077            0 :       AK = DGAMLN(FNUP,IDUM)
    1078            0 :       AK1R = AK1R - AK
    1079            0 :       IF (KODE.EQ.2) AK1R = AK1R - ZR
    1080            0 :       IF (AK1R.GT.(-ELIM)) GO TO 40
    1081              :    30 CONTINUE
    1082            0 :       NZ = NZ + 1
    1083            0 :       YR(NN) = ZEROR
    1084            0 :       YI(NN) = ZEROI
    1085            0 :       IF (ACZ.GT.DFNU) GO TO 190
    1086            0 :       NN = NN - 1
    1087            0 :       IF (NN.EQ.0) RETURN
    1088            0 :       GO TO 20
    1089              :    40 CONTINUE
    1090            0 :       IF (AK1R.GT.(-ALIM)) GO TO 50
    1091            0 :       IFLAG = 1
    1092            0 :       SS = 1.0D0/TOL
    1093            0 :       CRSCR = TOL
    1094            0 :       ASCLE = ARM*SS
    1095              :    50 CONTINUE
    1096            0 :       AA = DEXP(AK1R)
    1097            0 :       IF (IFLAG.EQ.1) AA = AA*SS
    1098            0 :       COEFR = AA*DCOS(AK1I)
    1099            0 :       COEFI = AA*DSIN(AK1I)
    1100            0 :       ATOL = TOL*ACZ/FNUP
    1101            0 :       IL = MIN0(2,NN)
    1102            0 :       DO 90 I=1,IL
    1103            0 :         DFNU = FNU + DBLE(FLOAT(NN-I))
    1104            0 :         FNUP = DFNU + 1.0D0
    1105            0 :         S1R = CONER
    1106            0 :         S1I = CONEI
    1107            0 :         IF (ACZ.LT.TOL*FNUP) GO TO 70
    1108            0 :         AK1R = CONER
    1109            0 :         AK1I = CONEI
    1110            0 :         AK = FNUP + 2.0D0
    1111            0 :         S = FNUP
    1112            0 :         AA = 2.0D0
    1113              :    60   CONTINUE
    1114            0 :         RS = 1.0D0/S
    1115            0 :         STR = AK1R*CZR - AK1I*CZI
    1116            0 :         STI = AK1R*CZI + AK1I*CZR
    1117            0 :         AK1R = STR*RS
    1118            0 :         AK1I = STI*RS
    1119            0 :         S1R = S1R + AK1R
    1120            0 :         S1I = S1I + AK1I
    1121            0 :         S = S + AK
    1122            0 :         AK = AK + 2.0D0
    1123            0 :         AA = AA*ACZ*RS
    1124            0 :         IF (AA.GT.ATOL) GO TO 60
    1125              :    70   CONTINUE
    1126            0 :         S2R = S1R*COEFR - S1I*COEFI
    1127            0 :         S2I = S1R*COEFI + S1I*COEFR
    1128            0 :         WR(I) = S2R
    1129            0 :         WI(I) = S2I
    1130            0 :         IF (IFLAG.EQ.0) GO TO 80
    1131            0 :         CALL ZUCHK(S2R, S2I, NW, ASCLE, TOL)
    1132              :         IF (NW.NE.0) GO TO 30
    1133              :    80   CONTINUE
    1134            0 :         M = NN - I + 1
    1135            0 :         YR(M) = S2R*CRSCR
    1136            0 :         YI(M) = S2I*CRSCR
    1137            0 :         IF (I.EQ.IL) GO TO 90
    1138            0 :         CALL ZDIV(COEFR, COEFI, HZR, HZI, STR, STI)
    1139            0 :         COEFR = STR*DFNU
    1140            0 :         COEFI = STI*DFNU
    1141            0 :    90 CONTINUE
    1142            0 :       IF (NN.LE.2) RETURN
    1143            0 :       K = NN - 2
    1144            0 :       AK = DBLE(FLOAT(K))
    1145            0 :       RAZ = 1.0D0/AZ
    1146            0 :       STR = ZR*RAZ
    1147            0 :       STI = -ZI*RAZ
    1148            0 :       RZR = (STR+STR)*RAZ
    1149            0 :       RZI = (STI+STI)*RAZ
    1150            0 :       IF (IFLAG.EQ.1) GO TO 120
    1151              :       IB = 3
    1152              :   100 CONTINUE
    1153            0 :       DO 110 I=IB,NN
    1154            0 :         YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
    1155            0 :         YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
    1156            0 :         AK = AK - 1.0D0
    1157            0 :         K = K - 1
    1158            0 :   110 CONTINUE
    1159            0 :       RETURN
    1160              : !C-----------------------------------------------------------------------
    1161              : !C     RECUR BACKWARD WITH SCALED VALUES
    1162              : !C-----------------------------------------------------------------------
    1163              :   120 CONTINUE
    1164              : !C-----------------------------------------------------------------------
    1165              : !C     EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION ABOVE THE
    1166              : !C     UNDERFLOW LIMIT = ASCLE = D1MACH(1)*SS*1.0D+3
    1167              : !C-----------------------------------------------------------------------
    1168            0 :       S1R = WR(1)
    1169            0 :       S1I = WI(1)
    1170            0 :       S2R = WR(2)
    1171            0 :       S2I = WI(2)
    1172            0 :       DO 130 L=3,NN
    1173              :         CKR = S2R
    1174              :         CKI = S2I
    1175            0 :         S2R = S1R + (AK+FNU)*(RZR*CKR-RZI*CKI)
    1176            0 :         S2I = S1I + (AK+FNU)*(RZR*CKI+RZI*CKR)
    1177            0 :         S1R = CKR
    1178            0 :         S1I = CKI
    1179            0 :         CKR = S2R*CRSCR
    1180            0 :         CKI = S2I*CRSCR
    1181            0 :         YR(K) = CKR
    1182            0 :         YI(K) = CKI
    1183            0 :         AK = AK - 1.0D0
    1184            0 :         K = K - 1
    1185            0 :         IF (AZABS(CKR,CKI).GT.ASCLE) GO TO 140
    1186            0 :   130 CONTINUE
    1187            0 :       RETURN
    1188              :   140 CONTINUE
    1189            0 :       IB = L + 1
    1190            0 :       IF (IB.GT.NN) RETURN
    1191            0 :       GO TO 100
    1192              :   150 CONTINUE
    1193            0 :       NZ = N
    1194            0 :       IF (FNU.EQ.0.0D0) NZ = NZ - 1
    1195              :   160 CONTINUE
    1196            0 :       YR(1) = ZEROR
    1197            0 :       YI(1) = ZEROI
    1198            0 :       IF (FNU.NE.0.0D0) GO TO 170
    1199            0 :       YR(1) = CONER
    1200            0 :       YI(1) = CONEI
    1201              :   170 CONTINUE
    1202            0 :       IF (N.EQ.1) RETURN
    1203            0 :       DO 180 I=2,N
    1204            0 :         YR(I) = ZEROR
    1205            0 :         YI(I) = ZEROI
    1206            0 :   180 CONTINUE
    1207            0 :       RETURN
    1208              : !C-----------------------------------------------------------------------
    1209              : !C     RETURN WITH NZ.LT.0 IF CABS(Z*Z/4).GT.FNU+N-NZ-1 COMPLETE
    1210              : !C     THE CALCULATION IN CBINU WITH N=N-IABS(NZ)
    1211              : !C-----------------------------------------------------------------------
    1212              :   190 CONTINUE
    1213            0 :       NZ = -NZ
    1214            0 :       RETURN
    1215              :       END SUBROUTINE ZSERI
    1216              : 
    1217              : 
    1218            0 :       DOUBLE PRECISION FUNCTION D1MACH(I)
    1219              :       INTEGER I
    1220              : !C
    1221              : !C  DOUBLE-PRECISION MACHINE CONSTANTS
    1222              : !C  D1MACH( 1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
    1223              : !C  D1MACH( 2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
    1224              : !C  D1MACH( 3) = B**(-T), THE SMALLEST RELATIVE SPACING.
    1225              : !C  D1MACH( 4) = B**(1-T), THE LARGEST RELATIVE SPACING.
    1226              : !C  D1MACH( 5) = LOG10(B)
    1227              : !C
    1228              :       INTEGER SMALL(2)
    1229              :       INTEGER LARGE(2)
    1230              :       INTEGER RIGHT(2)
    1231              :       INTEGER DIVER(2)
    1232              :       INTEGER LOG10(2)
    1233              :       INTEGER SC, CRAY1(38), J
    1234              :       COMMON /D9MACH/ CRAY1
    1235              :       SAVE SMALL, LARGE, RIGHT, DIVER, LOG10, SC
    1236              :       DOUBLE PRECISION DMACH(5)
    1237              :       EQUIVALENCE (DMACH(1),SMALL(1))
    1238              :       EQUIVALENCE (DMACH(2),LARGE(1))
    1239              :       EQUIVALENCE (DMACH(3),RIGHT(1))
    1240              :       EQUIVALENCE (DMACH(4),DIVER(1))
    1241              :       EQUIVALENCE (DMACH(5),LOG10(1))
    1242              : !C  THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES.
    1243              : !C  R1MACH CAN HANDLE AUTO-DOUBLE COMPILING, BUT THIS VERSION OF
    1244              : !C  D1MACH DOES NOT, BECAUSE WE DO NOT HAVE QUAD CONSTANTS FOR
    1245              : !C  MANY MACHINES YET.
    1246              : !C  TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
    1247              : !C  ON THE NEXT LINE
    1248              :       DATA SC/0/
    1249              : !C  AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
    1250              : !C  CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
    1251              : !C          mail netlib@research.bell-labs.com
    1252              : !C          send old1mach from blas
    1253              : !C  PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
    1254              : !C
    1255              : !C     MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
    1256              : !C      DATA SMALL(1),SMALL(2) / O402400000000, O000000000000 /
    1257              : !C      DATA LARGE(1),LARGE(2) / O376777777777, O777777777777 /
    1258              : !C      DATA RIGHT(1),RIGHT(2) / O604400000000, O000000000000 /
    1259              : !C      DATA DIVER(1),DIVER(2) / O606400000000, O000000000000 /
    1260              : !C      DATA LOG10(1),LOG10(2) / O776464202324, O117571775714 /, SC/987/
    1261              : !C
    1262              : !C     MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
    1263              : !C     32-BIT INTEGERS.
    1264              : !C      DATA SMALL(1),SMALL(2) /    8388608,           0 /
    1265              : !C      DATA LARGE(1),LARGE(2) / 2147483647,          -1 /
    1266              : !C      DATA RIGHT(1),RIGHT(2) /  612368384,           0 /
    1267              : !C      DATA DIVER(1),DIVER(2) /  620756992,           0 /
    1268              : !C      DATA LOG10(1),LOG10(2) / 1067065498, -2063872008 /, SC/987/
    1269              : !C
    1270              : !C     MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
    1271              : !C      DATA SMALL(1),SMALL(2) / O000040000000, O000000000000 /
    1272              : !C      DATA LARGE(1),LARGE(2) / O377777777777, O777777777777 /
    1273              : !C      DATA RIGHT(1),RIGHT(2) / O170540000000, O000000000000 /
    1274              : !C      DATA DIVER(1),DIVER(2) / O170640000000, O000000000000 /
    1275              : !C      DATA LOG10(1),LOG10(2) / O177746420232, O411757177572 /, SC/987/
    1276              : !C
    1277              : !C     ON FIRST CALL, IF NO DATA UNCOMMENTED, TEST MACHINE TYPES.
    1278            0 :       IF (SC .NE. 987) THEN
    1279              :          DMACH(1) = 1.D13
    1280              :          IF (      SMALL(1) .EQ. 1117925532  &
    1281              :      &       .AND. SMALL(2) .EQ. -448790528) THEN
    1282              : !*           *** IEEE BIG ENDIAN ***
    1283              :             SMALL(1) = 1048576
    1284              :             SMALL(2) = 0
    1285              :             LARGE(1) = 2146435071
    1286              :             LARGE(2) = -1
    1287              :             RIGHT(1) = 1017118720
    1288              :             RIGHT(2) = 0
    1289              :             DIVER(1) = 1018167296
    1290              :             DIVER(2) = 0
    1291              :             LOG10(1) = 1070810131
    1292              :             LOG10(2) = 1352628735
    1293              :          ELSE IF ( SMALL(2) .EQ. 1117925532   &
    1294              :      &       .AND. SMALL(1) .EQ. -448790528) THEN
    1295              : !*           *** IEEE LITTLE ENDIAN ***
    1296            0 :             SMALL(2) = 1048576
    1297            0 :             SMALL(1) = 0
    1298            0 :             LARGE(2) = 2146435071
    1299            0 :             LARGE(1) = -1
    1300            0 :             RIGHT(2) = 1017118720
    1301            0 :             RIGHT(1) = 0
    1302            0 :             DIVER(2) = 1018167296
    1303            0 :             DIVER(1) = 0
    1304            0 :             LOG10(2) = 1070810131
    1305            0 :             LOG10(1) = 1352628735
    1306              :          ELSE IF ( SMALL(1) .EQ. -2065213935  &
    1307              :      &       .AND. SMALL(2) .EQ. 10752) THEN
    1308              : !*               *** VAX WITH D_FLOATING ***
    1309              :             SMALL(1) = 128
    1310              :             SMALL(2) = 0
    1311              :             LARGE(1) = -32769
    1312              :             LARGE(2) = -1
    1313              :             RIGHT(1) = 9344
    1314              :             RIGHT(2) = 0
    1315              :             DIVER(1) = 9472
    1316              :             DIVER(2) = 0
    1317              :             LOG10(1) = 546979738
    1318              :             LOG10(2) = -805796613
    1319              :          ELSE IF ( SMALL(1) .EQ. 1267827943  &
    1320              :      &       .AND. SMALL(2) .EQ. 704643072) THEN
    1321              : !*               *** IBM MAINFRAME ***
    1322              :             SMALL(1) = 1048576
    1323              :             SMALL(2) = 0
    1324              :             LARGE(1) = 2147483647
    1325              :             LARGE(2) = -1
    1326              :             RIGHT(1) = 856686592
    1327              :             RIGHT(2) = 0
    1328              :             DIVER(1) = 873463808
    1329              :             DIVER(2) = 0
    1330              :             LOG10(1) = 1091781651
    1331              :             LOG10(2) = 1352628735
    1332              :          ELSE IF ( SMALL(1) .EQ. 1120022684   &
    1333              :      &       .AND. SMALL(2) .EQ. -448790528) THEN
    1334              : !*           *** CONVEX C-1 ***
    1335              :             SMALL(1) = 1048576
    1336              :             SMALL(2) = 0
    1337              :             LARGE(1) = 2147483647
    1338              :             LARGE(2) = -1
    1339              :             RIGHT(1) = 1019215872
    1340              :             RIGHT(2) = 0
    1341              :             DIVER(1) = 1020264448
    1342              :             DIVER(2) = 0
    1343              :             LOG10(1) = 1072907283
    1344              :             LOG10(2) = 1352628735
    1345              :          ELSE IF ( SMALL(1) .EQ. 815547074   &
    1346              :      &       .AND. SMALL(2) .EQ. 58688) THEN
    1347              : !*           *** VAX G-FLOATING ***
    1348              :             SMALL(1) = 16
    1349              :             SMALL(2) = 0
    1350              :             LARGE(1) = -32769
    1351              :             LARGE(2) = -1
    1352              :             RIGHT(1) = 15552
    1353              :             RIGHT(2) = 0
    1354              :             DIVER(1) = 15568
    1355              :             DIVER(2) = 0
    1356              :             LOG10(1) = 1142112243
    1357              :             LOG10(2) = 2046775455
    1358              :          ELSE
    1359              :             DMACH(2) = 1.D27 + 1
    1360              :             DMACH(3) = 1.D27
    1361              :             LARGE(2) = LARGE(2) - RIGHT(2)
    1362              :             IF (LARGE(2) .EQ. 64 .AND. SMALL(2) .EQ. 0) THEN
    1363              :                CRAY1(1) = 67291416
    1364              :                DO 10 J = 1, 20
    1365              :                   CRAY1(J+1) = CRAY1(J) + CRAY1(J)
    1366              :  10               CONTINUE
    1367              :                CRAY1(22) = CRAY1(21) + 321322
    1368              :                DO 20 J = 22, 37
    1369              :                   CRAY1(J+1) = CRAY1(J) + CRAY1(J)
    1370              :  20               CONTINUE
    1371              :                IF (CRAY1(38) .EQ. SMALL(1)) THEN
    1372              : !*                  *** CRAY ***
    1373              :                   CALL I1MCRY(SMALL(1), J, 8285, 8388608, 0)
    1374              :                   SMALL(2) = 0
    1375              :                   CALL I1MCRY(LARGE(1), J, 24574, 16777215, 16777215)
    1376              :                   CALL I1MCRY(LARGE(2), J, 0, 16777215, 16777214)
    1377              :                   CALL I1MCRY(RIGHT(1), J, 16291, 8388608, 0)
    1378              :                   RIGHT(2) = 0
    1379              :                   CALL I1MCRY(DIVER(1), J, 16292, 8388608, 0)
    1380              :                   DIVER(2) = 0
    1381              :                   CALL I1MCRY(LOG10(1), J, 16383, 10100890, 8715215)
    1382              :                   CALL I1MCRY(LOG10(2), J, 0, 16226447, 9001388)
    1383              :                ELSE
    1384              :                   WRITE(std_out,9000)
    1385              :                   STOP 779
    1386              :                   END IF
    1387              :             ELSE
    1388              :                WRITE(std_out,9000)
    1389              :                STOP 779
    1390              :                END IF
    1391              :             END IF
    1392            0 :          SC = 987
    1393              :          END IF
    1394              : !*    SANITY CHECK
    1395            0 :       IF (DMACH(4) .GE. 1.0D0) STOP 778
    1396            0 :       IF (I .LT. 1 .OR. I .GT. 5) THEN
    1397            0 :          WRITE(std_out,*) 'D1MACH(I): I =',I,' is out of bounds.'
    1398            0 :          STOP
    1399              :          END IF
    1400            0 :       D1MACH = DMACH(I)
    1401              :       RETURN
    1402              :  9000 FORMAT(/' Adjust D1MACH by uncommenting data statements'/ &
    1403              :      &' appropriate for your machine.')
    1404              : !* /* Standard C source for D1MACH -- remove the * in column 1 */
    1405              : !*#include <stdio.h>
    1406              : !*#include <float.h>
    1407              : !*#include <math.h>
    1408              : !*double d1mach_(long *i)
    1409              : !*{
    1410              : !*      switch(*i){
    1411              : !*        case 1: return DBL_MIN;
    1412              : !*        case 2: return DBL_MAX;
    1413              : !*        case 3: return DBL_EPSILON/FLT_RADIX;
    1414              : !*        case 4: return DBL_EPSILON;
    1415              : !*        case 5: return log10(FLT_RADIX);
    1416              : !*        }
    1417              : !*      fprintf(stderr, "invalid argument: d1mach(%ld)\n", *i);
    1418              : !*      exit(1); return 0; /* some compilers demand return values */
    1419              : !*}
    1420              :       END FUNCTION D1MACH
    1421              : 
    1422              : 
    1423              :       SUBROUTINE I1MCRY(A, A1, B, C, D)
    1424              : !**** SPECIAL COMPUTATION FOR OLD CRAY MACHINES ****
    1425              :       INTEGER A, A1, B, C, D
    1426              :       A1 = 16777216*B + C
    1427              :       A = 16777216*A1 + D
    1428              :       END SUBROUTINE I1MCRY
    1429              : 
    1430            0 :       SUBROUTINE ZMLT(AR, AI, BR, BI, CR, CI)
    1431              : !C***BEGIN PROLOGUE  ZMLT
    1432              : !C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
    1433              : !C
    1434              : !C     DOUBLE PRECISION COMPLEX MULTIPLY, C=A*B.
    1435              : !C
    1436              : !C***ROUTINES CALLED  (NONE)
    1437              : !C***END PROLOGUE  ZMLT
    1438              :       DOUBLE PRECISION AR, AI, BR, BI, CR, CI, CA, CB
    1439            0 :       CA = AR*BR - AI*BI
    1440            0 :       CB = AR*BI + AI*BR
    1441            0 :       CR = CA
    1442            0 :       CI = CB
    1443            0 :       RETURN
    1444              :       END SUBROUTINE ZMLT
    1445              : 
    1446            0 :       SUBROUTINE AZLOG(AR, AI, BR, BI, IERR)
    1447              : !C***BEGIN PROLOGUE  AZLOG
    1448              : !C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
    1449              : !C
    1450              : !C     DOUBLE PRECISION COMPLEX LOGARITHM B=CLOG(A)
    1451              : !C     IERR=0,NORMAL RETURN      IERR=1, Z=CMPLX(0.0,0.0)
    1452              : !C***ROUTINES CALLED  AZABS
    1453              : !C***END PROLOGUE  AZLOG
    1454              :       DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DHPI
    1455              :       !DOUBLE PRECISION AZABS
    1456              :       INTEGER IERR
    1457              :       DATA DPI , DHPI  / 3.141592653589793238462643383D+0,  &
    1458              :      &                   1.570796326794896619231321696D+0/
    1459              : !C
    1460            0 :       IERR=0
    1461            0 :       IF (AR.EQ.0.0D+0) GO TO 10
    1462            0 :       IF (AI.EQ.0.0D+0) GO TO 20
    1463            0 :       DTHETA = DATAN(AI/AR)
    1464            0 :       IF (DTHETA.LE.0.0D+0) GO TO 40
    1465            0 :       IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
    1466            0 :       GO TO 50
    1467            0 :    10 IF (AI.EQ.0.0D+0) GO TO 60
    1468            0 :       BI = DHPI
    1469            0 :       BR = DLOG(DABS(AI))
    1470            0 :       IF (AI.LT.0.0D+0) BI = -BI
    1471            0 :       RETURN
    1472            0 :    20 IF (AR.GT.0.0D+0) GO TO 30
    1473            0 :       BR = DLOG(DABS(AR))
    1474            0 :       BI = DPI
    1475            0 :       RETURN
    1476            0 :    30 BR = DLOG(AR)
    1477            0 :       BI = 0.0D+0
    1478            0 :       RETURN
    1479            0 :    40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
    1480            0 :    50 ZM = AZABS(AR,AI)
    1481            0 :       BR = DLOG(ZM)
    1482            0 :       BI = DTHETA
    1483            0 :       RETURN
    1484              :    60 CONTINUE
    1485            0 :       IERR=1
    1486            0 :       RETURN
    1487              :       END SUBROUTINE AZLOG
    1488              : 
    1489              : 
    1490            0 :       DOUBLE PRECISION FUNCTION DGAMLN(Z,IERR)
    1491              : !C***BEGIN PROLOGUE  DGAMLN
    1492              : !C***DATE WRITTEN   830501   (YYMMDD)
    1493              : !C***REVISION DATE  830501   (YYMMDD)
    1494              : !C***CATEGORY NO.  B5F
    1495              : !C***KEYWORDS  GAMMA FUNCTION,LOGARITHM OF GAMMA FUNCTION
    1496              : !C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
    1497              : !C***PURPOSE  TO COMPUTE THE LOGARITHM OF THE GAMMA FUNCTION
    1498              : !C***DESCRIPTION
    1499              : !C
    1500              : !C               **** A DOUBLE PRECISION ROUTINE ****
    1501              : !C         DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR
    1502              : !C         Z.GT.0.  THE ASYMPTOTIC EXPANSION IS USED TO GENERATE VALUES
    1503              : !C         GREATER THAN ZMIN WHICH ARE ADJUSTED BY THE RECURSION
    1504              : !C         G(Z+1)=Z*G(Z) FOR Z.LE.ZMIN.  THE FUNCTION WAS MADE AS
    1505              : !C         PORTABLE AS POSSIBLE BY COMPUTIMG ZMIN FROM THE NUMBER OF BASE
    1506              : !C         10 DIGITS IN A WORD, RLN=AMAX1(-ALOG10(R1MACH(4)),0.5E-18)
    1507              : !C         LIMITED TO 18 DIGITS OF (RELATIVE) ACCURACY.
    1508              : !C
    1509              : !C         SINCE INTEGER ARGUMENTS ARE COMMON, A TABLE LOOK UP ON 100
    1510              : !C         VALUES IS USED FOR SPEED OF EXECUTION.
    1511              : !C
    1512              : !C     DESCRIPTION OF ARGUMENTS
    1513              : !C
    1514              : !C         INPUT      Z IS D0UBLE PRECISION
    1515              : !C           Z      - ARGUMENT, Z.GT.0.0D0
    1516              : !C
    1517              : !C         OUTPUT      DGAMLN IS DOUBLE PRECISION
    1518              : !C           DGAMLN  - NATURAL LOG OF THE GAMMA FUNCTION AT Z.NE.0.0D0
    1519              : !C           IERR    - ERROR FLAG
    1520              : !C                     IERR=0, NORMAL RETURN, COMPUTATION COMPLETED
    1521              : !C                     IERR=1, Z.LE.0.0D0,    NO COMPUTATION
    1522              : !C
    1523              : !C
    1524              : !C***REFERENCES  COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
    1525              : !C                 BY D. E. AMOS, SAND83-0083, MAY, 1983.
    1526              : !C***ROUTINES CALLED  I1MACH,D1MACH
    1527              : !C***END PROLOGUE  DGAMLN
    1528              :       DOUBLE PRECISION CF, CON, FLN, FZ, GLN, RLN, S, TLG, TRM, TST, &
    1529              :      & T1, WDTOL, Z, ZDMY, ZINC, ZM, ZMIN, ZP, ZSQ!, D1MACH
    1530              :       INTEGER I, IERR, I1M, K, MZ, NZ!, I1MACH
    1531              :       DIMENSION CF(22), GLN(100)
    1532              : !C           LNGAMMA(N), N=1,100
    1533              :       DATA GLN(1), GLN(2), GLN(3), GLN(4), GLN(5), GLN(6), GLN(7),&
    1534              :      &     GLN(8), GLN(9), GLN(10), GLN(11), GLN(12), GLN(13), GLN(14), &
    1535              :      &     GLN(15), GLN(16), GLN(17), GLN(18), GLN(19), GLN(20), &
    1536              :      &     GLN(21), GLN(22)/   &
    1537              :      &     0.00000000000000000D+00,     0.00000000000000000D+00, &
    1538              :      &     6.93147180559945309D-01,     1.79175946922805500D+00, &
    1539              :      &     3.17805383034794562D+00,     4.78749174278204599D+00, &
    1540              :      &     6.57925121201010100D+00,     8.52516136106541430D+00, &
    1541              :      &     1.06046029027452502D+01,     1.28018274800814696D+01, &
    1542              :      &     1.51044125730755153D+01,     1.75023078458738858D+01, &
    1543              :      &     1.99872144956618861D+01,     2.25521638531234229D+01, &
    1544              :      &     2.51912211827386815D+01,     2.78992713838408916D+01, &
    1545              :      &     3.06718601060806728D+01,     3.35050734501368889D+01, &
    1546              :      &     3.63954452080330536D+01,     3.93398841871994940D+01, &
    1547              :      &     4.23356164607534850D+01,     4.53801388984769080D+01/
    1548              :       DATA GLN(23), GLN(24), GLN(25), GLN(26), GLN(27), GLN(28), &
    1549              :      &     GLN(29), GLN(30), GLN(31), GLN(32), GLN(33), GLN(34), &
    1550              :      &     GLN(35), GLN(36), GLN(37), GLN(38), GLN(39), GLN(40), &
    1551              :      &     GLN(41), GLN(42), GLN(43), GLN(44)/                   &
    1552              :      &     4.84711813518352239D+01,     5.16066755677643736D+01, &
    1553              :      &     5.47847293981123192D+01,     5.80036052229805199D+01, &
    1554              :      &     6.12617017610020020D+01,     6.45575386270063311D+01, &
    1555              :      &     6.78897431371815350D+01,     7.12570389671680090D+01, &
    1556              :      &     7.46582363488301644D+01,     7.80922235533153106D+01, &
    1557              :      &     8.15579594561150372D+01,     8.50544670175815174D+01, &
    1558              :      &     8.85808275421976788D+01,     9.21361756036870925D+01, &
    1559              :      &     9.57196945421432025D+01,     9.93306124547874269D+01, &
    1560              :      &     1.02968198614513813D+02,     1.06631760260643459D+02, &
    1561              :      &     1.10320639714757395D+02,     1.14034211781461703D+02, &
    1562              :      &     1.17771881399745072D+02,     1.21533081515438634D+02/
    1563              :       DATA GLN(45), GLN(46), GLN(47), GLN(48), GLN(49), GLN(50), &
    1564              :      &     GLN(51), GLN(52), GLN(53), GLN(54), GLN(55), GLN(56), &
    1565              :      &     GLN(57), GLN(58), GLN(59), GLN(60), GLN(61), GLN(62), &
    1566              :      &     GLN(63), GLN(64), GLN(65), GLN(66)/                   &
    1567              :      &     1.25317271149356895D+02,     1.29123933639127215D+02, &
    1568              :      &     1.32952575035616310D+02,     1.36802722637326368D+02, &
    1569              :      &     1.40673923648234259D+02,     1.44565743946344886D+02, &
    1570              :      &     1.48477766951773032D+02,     1.52409592584497358D+02, &
    1571              :      &     1.56360836303078785D+02,     1.60331128216630907D+02, &
    1572              :      &     1.64320112263195181D+02,     1.68327445448427652D+02, &
    1573              :      &     1.72352797139162802D+02,     1.76395848406997352D+02, &
    1574              :      &     1.80456291417543771D+02,     1.84533828861449491D+02, &
    1575              :      &     1.88628173423671591D+02,     1.92739047287844902D+02, &
    1576              :      &     1.96866181672889994D+02,     2.01009316399281527D+02, &
    1577              :      &     2.05168199482641199D+02,     2.09342586752536836D+02/
    1578              :       DATA GLN(67), GLN(68), GLN(69), GLN(70), GLN(71), GLN(72), &
    1579              :      &     GLN(73), GLN(74), GLN(75), GLN(76), GLN(77), GLN(78), &
    1580              :      &     GLN(79), GLN(80), GLN(81), GLN(82), GLN(83), GLN(84), &
    1581              :      &     GLN(85), GLN(86), GLN(87), GLN(88)/                   &
    1582              :      &     2.13532241494563261D+02,     2.17736934113954227D+02, &
    1583              :      &     2.21956441819130334D+02,     2.26190548323727593D+02, &
    1584              :      &     2.30439043565776952D+02,     2.34701723442818268D+02, &
    1585              :      &     2.38978389561834323D+02,     2.43268849002982714D+02, &
    1586              :      &     2.47572914096186884D+02,     2.51890402209723194D+02, &
    1587              :      &     2.56221135550009525D+02,     2.60564940971863209D+02, &
    1588              :      &     2.64921649798552801D+02,     2.69291097651019823D+02, &
    1589              :      &     2.73673124285693704D+02,     2.78067573440366143D+02, &
    1590              :      &     2.82474292687630396D+02,     2.86893133295426994D+02, &
    1591              :      &     2.91323950094270308D+02,     2.95766601350760624D+02, &
    1592              :      &     3.00220948647014132D+02,     3.04686856765668715D+02/
    1593              :       DATA GLN(89), GLN(90), GLN(91), GLN(92), GLN(93), GLN(94), &
    1594              :      &     GLN(95), GLN(96), GLN(97), GLN(98), GLN(99), GLN(100)/&
    1595              :      &     3.09164193580146922D+02,     3.13652829949879062D+02, &
    1596              :      &     3.18152639620209327D+02,     3.22663499126726177D+02, &
    1597              :      &     3.27185287703775217D+02,     3.31717887196928473D+02, &
    1598              :      &     3.36261181979198477D+02,     3.40815058870799018D+02, &
    1599              :      &     3.45379407062266854D+02,     3.49954118040770237D+02, &
    1600              :      &     3.54539085519440809D+02,     3.59134205369575399D+02/
    1601              : !C             COEFFICIENTS OF ASYMPTOTIC EXPANSION
    1602              :       DATA CF(1), CF(2), CF(3), CF(4), CF(5), CF(6), CF(7), CF(8), &
    1603              :      &     CF(9), CF(10), CF(11), CF(12), CF(13), CF(14), CF(15),  &
    1604              :      &     CF(16), CF(17), CF(18), CF(19), CF(20), CF(21), CF(22)/ &
    1605              :      &     8.33333333333333333D-02,    -2.77777777777777778D-03, &
    1606              :      &     7.93650793650793651D-04,    -5.95238095238095238D-04, &
    1607              :      &     8.41750841750841751D-04,    -1.91752691752691753D-03, &
    1608              :      &     6.41025641025641026D-03,    -2.95506535947712418D-02, &
    1609              :      &     1.79644372368830573D-01,    -1.39243221690590112D+00, &
    1610              :      &     1.34028640441683920D+01,    -1.56848284626002017D+02, &
    1611              :      &     2.19310333333333333D+03,    -3.61087712537249894D+04, &
    1612              :      &     6.91472268851313067D+05,    -1.52382215394074162D+07, &
    1613              :      &     3.82900751391414141D+08,    -1.08822660357843911D+10, &
    1614              :      &     3.47320283765002252D+11,    -1.23696021422692745D+13, &
    1615              :      &     4.88788064793079335D+14,    -2.13203339609193739D+16/
    1616              : !C
    1617              : !C             LN(2*PI)
    1618              :       DATA CON                    /     1.83787706640934548D+00/
    1619              : !C
    1620              : !C***FIRST EXECUTABLE STATEMENT  DGAMLN
    1621            0 :       IERR=0
    1622            0 :       IF (Z.LE.0.0D0) GO TO 70
    1623            0 :       IF (Z.GT.101.0D0) GO TO 10
    1624            0 :       NZ = INT(SNGL(Z))
    1625            0 :       FZ = Z - FLOAT(NZ)
    1626            0 :       IF (FZ.GT.0.0D0) GO TO 10
    1627            0 :       IF (NZ.GT.100) GO TO 10
    1628            0 :       DGAMLN = GLN(NZ)
    1629            0 :       RETURN
    1630              :    10 CONTINUE
    1631            0 :       WDTOL = D1MACH(4)
    1632            0 :       WDTOL = DMAX1(WDTOL,0.5D-18)
    1633            0 :       I1M = I1MACH(14)
    1634            0 :       RLN = D1MACH(5)*FLOAT(I1M)
    1635            0 :       FLN = DMIN1(RLN,20.0D0)
    1636            0 :       FLN = DMAX1(FLN,3.0D0)
    1637            0 :       FLN = FLN - 3.0D0
    1638            0 :       ZM = 1.8000D0 + 0.3875D0*FLN
    1639            0 :       MZ = INT(SNGL(ZM)) + 1
    1640            0 :       ZMIN = FLOAT(MZ)
    1641            0 :       ZDMY = Z
    1642            0 :       ZINC = 0.0D0
    1643            0 :       IF (Z.GE.ZMIN) GO TO 20
    1644            0 :       ZINC = ZMIN - FLOAT(NZ)
    1645            0 :       ZDMY = Z + ZINC
    1646              :    20 CONTINUE
    1647            0 :       ZP = 1.0D0/ZDMY
    1648            0 :       T1 = CF(1)*ZP
    1649            0 :       S = T1
    1650            0 :       IF (ZP.LT.WDTOL) GO TO 40
    1651            0 :       ZSQ = ZP*ZP
    1652            0 :       TST = T1*WDTOL
    1653            0 :       DO 30 K=2,22
    1654            0 :         ZP = ZP*ZSQ
    1655            0 :         TRM = CF(K)*ZP
    1656            0 :         IF (DABS(TRM).LT.TST) GO TO 40
    1657            0 :         S = S + TRM
    1658            0 :    30 CONTINUE
    1659              :    40 CONTINUE
    1660            0 :       IF (ZINC.NE.0.0D0) GO TO 50
    1661            0 :       TLG = DLOG(Z)
    1662            0 :       DGAMLN = Z*(TLG-1.0D0) + 0.5D0*(CON-TLG) + S
    1663            0 :       RETURN
    1664              :    50 CONTINUE
    1665            0 :       ZP = 1.0D0
    1666            0 :       NZ = INT(SNGL(ZINC))
    1667            0 :       DO 60 I=1,NZ
    1668            0 :         ZP = ZP*(Z+FLOAT(I-1))
    1669            0 :    60 CONTINUE
    1670            0 :       TLG = DLOG(ZDMY)
    1671            0 :       DGAMLN = ZDMY*(TLG-1.0D0) - DLOG(ZP) + 0.5D0*(CON-TLG) + S
    1672            0 :       RETURN
    1673              : !C
    1674              : !C
    1675              :    70 CONTINUE
    1676            0 :       IERR=1
    1677            0 :       RETURN
    1678              :       END FUNCTION DGAMLN
    1679              : 
    1680            0 :       INTEGER FUNCTION I1MACH(I)
    1681              :       INTEGER I
    1682              : !C
    1683              : !C    I1MACH( 1) = THE STANDARD INPUT UNIT.
    1684              : !C    I1MACH( 2) = THE STANDARD OUTPUT UNIT.
    1685              : !C    I1MACH( 3) = THE STANDARD PUNCH UNIT.
    1686              : !C    I1MACH( 4) = THE STANDARD ERROR MESSAGE UNIT.
    1687              : !C    I1MACH( 5) = THE NUMBER OF BITS PER INTEGER STORAGE UNIT.
    1688              : !C    I1MACH( 6) = THE NUMBER OF CHARACTERS PER CHARACTER STORAGE UNIT.
    1689              : !C    INTEGERS HAVE FORM SIGN ( X(S-1)*A**(S-1) + ... + X(1)*A + X(0) )
    1690              : !C    I1MACH( 7) = A, THE BASE.
    1691              : !C    I1MACH( 8) = S, THE NUMBER OF BASE-A DIGITS.
    1692              : !C    I1MACH( 9) = A**S - 1, THE LARGEST MAGNITUDE.
    1693              : !C    FLOATS HAVE FORM  SIGN (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
    1694              : !C               WHERE  EMIN .LE. E .LE. EMAX.
    1695              : !C    I1MACH(10) = B, THE BASE.
    1696              : !C  SINGLE-PRECISION
    1697              : !C    I1MACH(11) = T, THE NUMBER OF BASE-B DIGITS.
    1698              : !C    I1MACH(12) = EMIN, THE SMALLEST EXPONENT E.
    1699              : !C    I1MACH(13) = EMAX, THE LARGEST EXPONENT E.
    1700              : !C  DOUBLE-PRECISION
    1701              : !C    I1MACH(14) = T, THE NUMBER OF BASE-B DIGITS.
    1702              : !C    I1MACH(15) = EMIN, THE SMALLEST EXPONENT E.
    1703              : !C    I1MACH(16) = EMAX, THE LARGEST EXPONENT E.
    1704              : !C
    1705              :       INTEGER IMACH(16), OUTPUT, SC, SMALL(2)
    1706              :       SAVE IMACH, SC
    1707              :       REAL RMACH
    1708              :       EQUIVALENCE (IMACH(4),OUTPUT), (RMACH,SMALL(1))
    1709              :       INTEGER I3, J, K, T3E(3)
    1710              :       DATA T3E(1) / 9777664 /
    1711              :       DATA T3E(2) / 5323660 /
    1712              :       DATA T3E(3) / 46980 /
    1713              : !C  THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES,
    1714              : !C  INCLUDING AUTO-DOUBLE COMPILERS.
    1715              : !C  TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
    1716              : !C  ON THE NEXT LINE
    1717              :       DATA SC/0/
    1718              : !C  AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
    1719              : !C  CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
    1720              : !C          mail netlib@research.bell-labs.com
    1721              : !C          send old1mach from blas
    1722              : !C  PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
    1723              : !C
    1724              : !C     MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
    1725              : !C
    1726              : !C      DATA IMACH( 1) /    5 /
    1727              : !C      DATA IMACH( 2) /    6 /
    1728              : !C      DATA IMACH( 3) /   43 /
    1729              : !C      DATA IMACH( 4) /    6 /
    1730              : !C      DATA IMACH( 5) /   36 /
    1731              : !C      DATA IMACH( 6) /    4 /
    1732              : !C      DATA IMACH( 7) /    2 /
    1733              : !C      DATA IMACH( 8) /   35 /
    1734              : !C      DATA IMACH( 9) / O377777777777 /
    1735              : !C      DATA IMACH(10) /    2 /
    1736              : !C      DATA IMACH(11) /   27 /
    1737              : !C      DATA IMACH(12) / -127 /
    1738              : !C      DATA IMACH(13) /  127 /
    1739              : !C      DATA IMACH(14) /   63 /
    1740              : !C      DATA IMACH(15) / -127 /
    1741              : !C      DATA IMACH(16) /  127 /, SC/987/
    1742              : !C
    1743              : !C     MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
    1744              : !C     32-BIT INTEGER ARITHMETIC.
    1745              : !C
    1746              : !C      DATA IMACH( 1) /    5 /
    1747              : !C      DATA IMACH( 2) /    6 /
    1748              : !C      DATA IMACH( 3) /    7 /
    1749              : !C      DATA IMACH( 4) /    6 /
    1750              : !C      DATA IMACH( 5) /   32 /
    1751              : !C      DATA IMACH( 6) /    4 /
    1752              : !C      DATA IMACH( 7) /    2 /
    1753              : !C      DATA IMACH( 8) /   31 /
    1754              : !C      DATA IMACH( 9) / 2147483647 /
    1755              : !C      DATA IMACH(10) /    2 /
    1756              : !C      DATA IMACH(11) /   24 /
    1757              : !C      DATA IMACH(12) / -127 /
    1758              : !C      DATA IMACH(13) /  127 /
    1759              : !C      DATA IMACH(14) /   56 /
    1760              : !C      DATA IMACH(15) / -127 /
    1761              : !C      DATA IMACH(16) /  127 /, SC/987/
    1762              : !C
    1763              : !C     MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
    1764              : !C
    1765              : !C     NOTE THAT THE PUNCH UNIT, I1MACH(3), HAS BEEN SET TO 7
    1766              : !C     WHICH IS APPROPRIATE FOR THE UNIVAC-FOR SYSTEM.
    1767              : !C     IF YOU HAVE THE UNIVAC-FTN SYSTEM, SET IT TO 1.
    1768              : !C
    1769              : !C      DATA IMACH( 1) /    5 /
    1770              : !C      DATA IMACH( 2) /    6 /
    1771              : !C      DATA IMACH( 3) /    7 /
    1772              : !C      DATA IMACH( 4) /    6 /
    1773              : !C      DATA IMACH( 5) /   36 /
    1774              : !C      DATA IMACH( 6) /    6 /
    1775              : !C      DATA IMACH( 7) /    2 /
    1776              : !C      DATA IMACH( 8) /   35 /
    1777              : !C      DATA IMACH( 9) / O377777777777 /
    1778              : !C      DATA IMACH(10) /    2 /
    1779              : !C      DATA IMACH(11) /   27 /
    1780              : !C      DATA IMACH(12) / -128 /
    1781              : !C      DATA IMACH(13) /  127 /
    1782              : !C      DATA IMACH(14) /   60 /
    1783              : !C      DATA IMACH(15) /-1024 /
    1784              : !C      DATA IMACH(16) / 1023 /, SC/987/
    1785              : !C
    1786            0 :       IF (SC .NE. 987) THEN
    1787              : !*        *** CHECK FOR AUTODOUBLE ***
    1788              :          SMALL(2) = 0
    1789              :          RMACH = 1E13
    1790              :          IF (SMALL(2) .NE. 0) THEN
    1791              : !*           *** AUTODOUBLED ***
    1792              :             IF (      (SMALL(1) .EQ. 1117925532   &
    1793              :      &           .AND. SMALL(2) .EQ. -448790528)  &
    1794              :      &       .OR.     (SMALL(2) .EQ. 1117925532   &
    1795              :      &           .AND. SMALL(1) .EQ. -448790528)) THEN
    1796              : !*               *** IEEE ***
    1797              :                IMACH(10) = 2
    1798              :                IMACH(14) = 53
    1799              :                IMACH(15) = -1021
    1800              :                IMACH(16) = 1024
    1801              :             ELSE IF ( SMALL(1) .EQ. -2065213935 &
    1802              :      &          .AND. SMALL(2) .EQ. 10752) THEN
    1803              : !*               *** VAX WITH D_FLOATING ***
    1804              :                IMACH(10) = 2
    1805              :                IMACH(14) = 56
    1806              :                IMACH(15) = -127
    1807              :                IMACH(16) = 127
    1808              :             ELSE IF ( SMALL(1) .EQ. 1267827943 &
    1809              :      &          .AND. SMALL(2) .EQ. 704643072) THEN
    1810              : !*               *** IBM MAINFRAME ***
    1811              :                IMACH(10) = 16
    1812              :                IMACH(14) = 14
    1813              :                IMACH(15) = -64
    1814              :                IMACH(16) = 63
    1815              :             ELSE
    1816              :                WRITE(std_out,9010)
    1817              :                STOP 777
    1818              :                END IF
    1819              :             IMACH(11) = IMACH(14)
    1820              :             IMACH(12) = IMACH(15)
    1821              :             IMACH(13) = IMACH(16)
    1822              :          ELSE
    1823              :             RMACH = 1234567.
    1824              :             IF (SMALL(1) .EQ. 1234613304) THEN
    1825              : !*               *** IEEE ***
    1826            0 :                IMACH(10) = 2
    1827            0 :                IMACH(11) = 24
    1828            0 :                IMACH(12) = -125
    1829            0 :                IMACH(13) = 128
    1830            0 :                IMACH(14) = 53
    1831            0 :                IMACH(15) = -1021
    1832            0 :                IMACH(16) = 1024
    1833            0 :                SC = 987
    1834              :             ELSE IF (SMALL(1) .EQ. -1271379306) THEN
    1835              : !*               *** VAX ***
    1836              :                IMACH(10) = 2
    1837              :                IMACH(11) = 24
    1838              :                IMACH(12) = -127
    1839              :                IMACH(13) = 127
    1840              :                IMACH(14) = 56
    1841              :                IMACH(15) = -127
    1842              :                IMACH(16) = 127
    1843              :                SC = 987
    1844              :             ELSE IF (SMALL(1) .EQ. 1175639687) THEN
    1845              : !*               *** IBM MAINFRAME ***
    1846              :                IMACH(10) = 16
    1847              :                IMACH(11) = 6
    1848              :                IMACH(12) = -64
    1849              :                IMACH(13) = 63
    1850              :                IMACH(14) = 14
    1851              :                IMACH(15) = -64
    1852              :                IMACH(16) = 63
    1853              :                SC = 987
    1854              :             ELSE IF (SMALL(1) .EQ. 1251390520) THEN
    1855              : !*              *** CONVEX C-1 ***
    1856              :                IMACH(10) = 2
    1857              :                IMACH(11) = 24
    1858              :                IMACH(12) = -128
    1859              :                IMACH(13) = 127
    1860              :                IMACH(14) = 53
    1861              :                IMACH(15) = -1024
    1862              :                IMACH(16) = 1023
    1863              :             ELSE
    1864              :                DO 10 I3 = 1, 3
    1865              :                   J = SMALL(1) / 10000000
    1866              :                   K = SMALL(1) - 10000000*J
    1867              :                   IF (K .NE. T3E(I3)) GO TO 20
    1868              :                   SMALL(1) = J
    1869              :  10               CONTINUE
    1870              : !*              *** CRAY T3E ***
    1871              :                IMACH( 1) = 5
    1872              :                IMACH( 2) = 6
    1873              :                IMACH( 3) = 0
    1874              :                IMACH( 4) = 0
    1875              :                IMACH( 5) = 64
    1876              :                IMACH( 6) = 8
    1877              :                IMACH( 7) = 2
    1878              :                IMACH( 8) = 63
    1879              :                CALL I1MCR1(IMACH(9), K, 32767, 16777215, 16777215)
    1880              :                IMACH(10) = 2
    1881              :                IMACH(11) = 53
    1882              :                IMACH(12) = -1021
    1883              :                IMACH(13) = 1024
    1884              :                IMACH(14) = 53
    1885              :                IMACH(15) = -1021
    1886              :                IMACH(16) = 1024
    1887              :                GO TO 35
    1888              :  20            CALL I1MCR1(J, K, 16405, 9876536, 0)
    1889              :                IF (SMALL(1) .NE. J) THEN
    1890              :                   WRITE(std_out,9020)
    1891              :                   STOP 777
    1892              :                   END IF
    1893              : !*              *** CRAY 1, XMP, 2, AND 3 ***
    1894              :                IMACH(1) = 5
    1895              :                IMACH(2) = 6
    1896              :                IMACH(3) = 102
    1897              :                IMACH(4) = 6
    1898              :                IMACH(5) = 46
    1899              :                IMACH(6) = 8
    1900              :                IMACH(7) = 2
    1901              :                IMACH(8) = 45
    1902              :                CALL I1MCR1(IMACH(9), K, 0, 4194303, 16777215)
    1903              :                IMACH(10) = 2
    1904              :                IMACH(11) = 47
    1905              :                IMACH(12) = -8188
    1906              :                IMACH(13) = 8189
    1907              :                IMACH(14) = 94
    1908              :                IMACH(15) = -8141
    1909              :                IMACH(16) = 8189
    1910              :                GO TO 35
    1911              :                END IF
    1912              :             END IF
    1913            0 :          IMACH( 1) = 5
    1914            0 :          IMACH( 2) = 6
    1915            0 :          IMACH( 3) = 7
    1916            0 :          IMACH( 4) = 6
    1917            0 :          IMACH( 5) = 32
    1918            0 :          IMACH( 6) = 4
    1919            0 :          IMACH( 7) = 2
    1920            0 :          IMACH( 8) = 31
    1921            0 :          IMACH( 9) = 2147483647
    1922              :  35      SC = 987
    1923              :          END IF
    1924              :  9010 FORMAT(/' Adjust autodoubled I1MACH by uncommenting data'/ &
    1925              :      & ' statements appropriate for your machine and setting'/ &
    1926              :      & ' IMACH(I) = IMACH(I+3) for I = 11, 12, and 13.')
    1927              :  9020 FORMAT(/' Adjust I1MACH by uncommenting data statements'/ &
    1928              :      & ' appropriate for your machine.')
    1929            0 :       IF (I .LT. 1  .OR.  I .GT. 16) GO TO 40
    1930            0 :       I1MACH = IMACH(I)
    1931            0 :       RETURN
    1932            0 :  40   WRITE(std_out,*) 'I1MACH(I): I =',I,' is out of bounds.'
    1933            0 :       STOP
    1934              : !* /* C source for I1MACH -- remove the * in column 1 */
    1935              : !* /* Note that some values may need changing. */
    1936              : !*#include <stdio.h>
    1937              : !*#include <float.h>
    1938              : !*#include <limits.h>
    1939              : !*#include <math.h>
    1940              : !*
    1941              : !*long i1mach_(long *i)
    1942              : !*{
    1943              : !*      switch(*i){
    1944              : !*        case 1:  return 5;    /* standard input */
    1945              : !*        case 2:  return 6;    /* standard output */
    1946              : !*        case 3:  return 7;    /* standard punch */
    1947              : !*        case 4:  return 0;    /* standard error */
    1948              : !*        case 5:  return 32;   /* bits per integer */
    1949              : !*        case 6:  return sizeof(int);
    1950              : !*        case 7:  return 2;    /* base for integers */
    1951              : !*        case 8:  return 31;   /* digits of integer base */
    1952              : !*        case 9:  return LONG_MAX;
    1953              : !*        case 10: return FLT_RADIX;
    1954              : !*        case 11: return FLT_MANT_DIG;
    1955              : !*        case 12: return FLT_MIN_EXP;
    1956              : !*        case 13: return FLT_MAX_EXP;
    1957              : !*        case 14: return DBL_MANT_DIG;
    1958              : !*        case 15: return DBL_MIN_EXP;
    1959              : !*        case 16: return DBL_MAX_EXP;
    1960              : !*        }
    1961              : !*      fprintf(stderr, "invalid argument: i1mach(%ld)\n", *i);
    1962              : !*      exit(1);return 0; /* some compilers demand return values */
    1963              : !*}
    1964              :       END FUNCTION I1MACH
    1965              : 
    1966              :       SUBROUTINE I1MCR1(A, A1, B, C, D)
    1967              : !**** SPECIAL COMPUTATION FOR OLD CRAY MACHINES ****
    1968              :       INTEGER A, A1, B, C, D
    1969              :       A1 = 16777216*B + C
    1970              :       A = 16777216*A1 + D
    1971              :       END SUBROUTINE I1MCR1
    1972              : 
    1973            0 :       SUBROUTINE ZUCHK(YR, YI, NZ, ASCLE, TOL)
    1974              : !C***BEGIN PROLOGUE  ZUCHK
    1975              : !C***REFER TO ZSERI,ZUOIK,ZUNK1,ZUNK2,ZUNI1,ZUNI2,ZKSCL
    1976              : !C
    1977              : !C      Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN
    1978              : !C      EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL. THE TEST IS MADE TO SEE
    1979              : !C      IF THE MAGNITUDE OF THE REAL OR IMAGINARY PART WOULD UNDERFLOW
    1980              : !C      WHEN Y IS SCALED (BY TOL) TO ITS PROPER VALUE. Y IS ACCEPTED
    1981              : !C      IF THE UNDERFLOW IS AT LEAST ONE PRECISION BELOW THE MAGNITUDE
    1982              : !C      OF THE LARGEST COMPONENT; OTHERWISE THE PHASE ANGLE DOES NOT HAVE
    1983              : !C      ABSOLUTE ACCURACY AND AN UNDERFLOW IS ASSUMED.
    1984              : !C
    1985              : !C***ROUTINES CALLED  (NONE)
    1986              : !C***END PROLOGUE  ZUCHK
    1987              : !C
    1988              : !C     COMPLEX Y
    1989              :       DOUBLE PRECISION ASCLE, SS, ST, TOL, WR, WI, YR, YI
    1990              :       INTEGER NZ
    1991            0 :       NZ = 0
    1992            0 :       WR = DABS(YR)
    1993            0 :       WI = DABS(YI)
    1994            0 :       ST = DMIN1(WR,WI)
    1995            0 :       IF (ST.GT.ASCLE) RETURN
    1996            0 :       SS = DMAX1(WR,WI)
    1997            0 :       ST = ST/TOL
    1998            0 :       IF (SS.LT.ST) NZ = 1
    1999              :       RETURN
    2000              :       END SUBROUTINE ZUCHK
    2001              : 
    2002            0 :       SUBROUTINE ZDIV(AR, AI, BR, BI, CR, CI)
    2003              : !C***BEGIN PROLOGUE  ZDIV
    2004              : !C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
    2005              : !C
    2006              : !C     DOUBLE PRECISION COMPLEX DIVIDE C=A/B.
    2007              : !C
    2008              : !C***ROUTINES CALLED  AZABS
    2009              : !C***END PROLOGUE  ZDIV
    2010              :       DOUBLE PRECISION AR, AI, BR, BI, CR, CI, BM, CA, CB, CC, CD
    2011              :       !DOUBLE PRECISION AZABS
    2012            0 :       BM = 1.0D0/AZABS(BR,BI)
    2013            0 :       CC = BR*BM
    2014            0 :       CD = BI*BM
    2015            0 :       CA = (AR*CC+AI*CD)*BM
    2016            0 :       CB = (AI*CC-AR*CD)*BM
    2017            0 :       CR = CA
    2018            0 :       CI = CB
    2019            0 :       RETURN
    2020              :       END SUBROUTINE ZDIV
    2021              : 
    2022              : 
    2023            0 :       SUBROUTINE ZASYI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, RL, TOL, ELIM, &
    2024              :      & ALIM)
    2025              : !C***BEGIN PROLOGUE  ZASYI
    2026              : !C***REFER TO  ZBESI,ZBESK
    2027              : !C
    2028              : !C     ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
    2029              : !C     MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE
    2030              : !C     REGION CABS(Z).GT.MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL RETURN.
    2031              : !C     NZ.LT.0 INDICATES AN OVERFLOW ON KODE=1.
    2032              : !C
    2033              : !C***ROUTINES CALLED  D1MACH,AZABS,ZDIV,AZEXP,ZMLT,AZSQRT
    2034              : !C***END PROLOGUE  ZASYI
    2035              : !C     COMPLEX AK1,CK,CONE,CS1,CS2,CZ,CZERO,DK,EZ,P1,RZ,S2,Y,Z
    2036              :       DOUBLE PRECISION AA, AEZ, AK, AK1I, AK1R, ALIM, ARG, ARM, ATOL,   &
    2037              :      & AZ, BB, BK, CKI, CKR, CONEI, CONER, CS1I, CS1R, CS2I, CS2R, CZI, &
    2038              :      & CZR, DFNU, DKI, DKR, DNU2, ELIM, EZI, EZR, FDN, FNU, PI, P1I,    &
    2039              :      & P1R, RAZ, RL, RTPI, RTR1, RZI, RZR, S, SGN, SQK, STI, STR, S2I,  &
    2040              :      & S2R, TOL, TZI, TZR, YI, YR, ZEROI, ZEROR, ZI, ZR!, D1MACH, AZABS
    2041              :       INTEGER I, IB, IL, INU, J, JL, K, KODE, KODED, M, N, NN, NZ
    2042              :       DIMENSION YR(N), YI(N)
    2043              :       DATA PI, RTPI  /3.14159265358979324D0 , 0.159154943091895336D0 /
    2044              :       DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
    2045              : !C
    2046            0 :       NZ = 0
    2047            0 :       AZ = AZABS(ZR,ZI)
    2048            0 :       ARM = 1.0D+3*D1MACH(1)
    2049            0 :       RTR1 = DSQRT(ARM)
    2050            0 :       IL = MIN0(2,N)
    2051            0 :       DFNU = FNU + DBLE(FLOAT(N-IL))
    2052              : !C-----------------------------------------------------------------------
    2053              : !C     OVERFLOW TEST
    2054              : !C-----------------------------------------------------------------------
    2055            0 :       RAZ = 1.0D0/AZ
    2056            0 :       STR = ZR*RAZ
    2057            0 :       STI = -ZI*RAZ
    2058            0 :       AK1R = RTPI*STR*RAZ
    2059            0 :       AK1I = RTPI*STI*RAZ
    2060            0 :       CALL AZSQRT(AK1R, AK1I, AK1R, AK1I)
    2061            0 :       CZR = ZR
    2062            0 :       CZI = ZI
    2063            0 :       IF (KODE.NE.2) GO TO 10
    2064            0 :       CZR = ZEROR
    2065            0 :       CZI = ZI
    2066              :    10 CONTINUE
    2067            0 :       IF (DABS(CZR).GT.ELIM) GO TO 100
    2068            0 :       DNU2 = DFNU + DFNU
    2069            0 :       KODED = 1
    2070            0 :       IF ((DABS(CZR).GT.ALIM) .AND. (N.GT.2)) GO TO 20
    2071            0 :       KODED = 0
    2072            0 :       CALL AZEXP(CZR, CZI, STR, STI)
    2073            0 :       CALL ZMLT(AK1R, AK1I, STR, STI, AK1R, AK1I)
    2074              :    20 CONTINUE
    2075            0 :       FDN = 0.0D0
    2076            0 :       IF (DNU2.GT.RTR1) FDN = DNU2*DNU2
    2077            0 :       EZR = ZR*8.0D0
    2078            0 :       EZI = ZI*8.0D0
    2079              : !C-----------------------------------------------------------------------
    2080              : !C     WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
    2081              : !C     FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
    2082              : !C     EXPANSION FOR THE IMAGINARY PART.
    2083              : !C-----------------------------------------------------------------------
    2084            0 :       AEZ = 8.0D0*AZ
    2085            0 :       S = TOL/AEZ
    2086            0 :       JL = INT(SNGL(RL+RL)) + 2
    2087            0 :       P1R = ZEROR
    2088            0 :       P1I = ZEROI
    2089            0 :       IF (ZI.EQ.0.0D0) GO TO 30
    2090              : !C-----------------------------------------------------------------------
    2091              : !C     CALCULATE EXP(PI*(0.5+FNU+N-IL)*I) TO MINIMIZE LOSSES OF
    2092              : !C     SIGNIFICANCE WHEN FNU OR N IS LARGE
    2093              : !C-----------------------------------------------------------------------
    2094            0 :       INU = INT(SNGL(FNU))
    2095            0 :       ARG = (FNU-DBLE(FLOAT(INU)))*PI
    2096            0 :       INU = INU + N - IL
    2097            0 :       AK = -DSIN(ARG)
    2098            0 :       BK = DCOS(ARG)
    2099            0 :       IF (ZI.LT.0.0D0) BK = -BK
    2100            0 :       P1R = AK
    2101            0 :       P1I = BK
    2102            0 :       IF (MOD(INU,2).EQ.0) GO TO 30
    2103            0 :       P1R = -P1R
    2104            0 :       P1I = -P1I
    2105              :    30 CONTINUE
    2106            0 :       DO 70 K=1,IL
    2107            0 :         SQK = FDN - 1.0D0
    2108            0 :         ATOL = S*DABS(SQK)
    2109            0 :         SGN = 1.0D0
    2110            0 :         CS1R = CONER
    2111            0 :         CS1I = CONEI
    2112            0 :         CS2R = CONER
    2113            0 :         CS2I = CONEI
    2114            0 :         CKR = CONER
    2115            0 :         CKI = CONEI
    2116            0 :         AK = 0.0D0
    2117            0 :         AA = 1.0D0
    2118            0 :         BB = AEZ
    2119            0 :         DKR = EZR
    2120            0 :         DKI = EZI
    2121            0 :         DO 40 J=1,JL
    2122            0 :           CALL ZDIV(CKR, CKI, DKR, DKI, STR, STI)
    2123            0 :           CKR = STR*SQK
    2124            0 :           CKI = STI*SQK
    2125            0 :           CS2R = CS2R + CKR
    2126            0 :           CS2I = CS2I + CKI
    2127            0 :           SGN = -SGN
    2128            0 :           CS1R = CS1R + CKR*SGN
    2129            0 :           CS1I = CS1I + CKI*SGN
    2130            0 :           DKR = DKR + EZR
    2131            0 :           DKI = DKI + EZI
    2132            0 :           AA = AA*DABS(SQK)/BB
    2133            0 :           BB = BB + AEZ
    2134            0 :           AK = AK + 8.0D0
    2135            0 :           SQK = SQK - AK
    2136            0 :           IF (AA.LE.ATOL) GO TO 50
    2137            0 :    40   CONTINUE
    2138            0 :         GO TO 110
    2139              :    50   CONTINUE
    2140            0 :         S2R = CS1R
    2141            0 :         S2I = CS1I
    2142            0 :         IF (ZR+ZR.GE.ELIM) GO TO 60
    2143            0 :         TZR = ZR + ZR
    2144            0 :         TZI = ZI + ZI
    2145            0 :         CALL AZEXP(-TZR, -TZI, STR, STI)
    2146            0 :         CALL ZMLT(STR, STI, P1R, P1I, STR, STI)
    2147            0 :         CALL ZMLT(STR, STI, CS2R, CS2I, STR, STI)
    2148            0 :         S2R = S2R + STR
    2149            0 :         S2I = S2I + STI
    2150              :    60   CONTINUE
    2151            0 :         FDN = FDN + 8.0D0*DFNU + 4.0D0
    2152            0 :         P1R = -P1R
    2153            0 :         P1I = -P1I
    2154            0 :         M = N - IL + K
    2155            0 :         YR(M) = S2R*AK1R - S2I*AK1I
    2156            0 :         YI(M) = S2R*AK1I + S2I*AK1R
    2157            0 :    70 CONTINUE
    2158            0 :       IF (N.LE.2) RETURN
    2159            0 :       NN = N
    2160            0 :       K = NN - 2
    2161            0 :       AK = DBLE(FLOAT(K))
    2162            0 :       STR = ZR*RAZ
    2163            0 :       STI = -ZI*RAZ
    2164            0 :       RZR = (STR+STR)*RAZ
    2165            0 :       RZI = (STI+STI)*RAZ
    2166            0 :       IB = 3
    2167            0 :       DO 80 I=IB,NN
    2168            0 :         YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
    2169            0 :         YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
    2170            0 :         AK = AK - 1.0D0
    2171            0 :         K = K - 1
    2172            0 :    80 CONTINUE
    2173            0 :       IF (KODED.EQ.0) RETURN
    2174            0 :       CALL AZEXP(CZR, CZI, CKR, CKI)
    2175            0 :       DO 90 I=1,NN
    2176            0 :         STR = YR(I)*CKR - YI(I)*CKI
    2177            0 :         YI(I) = YR(I)*CKI + YI(I)*CKR
    2178            0 :         YR(I) = STR
    2179            0 :    90 CONTINUE
    2180            0 :       RETURN
    2181              :   100 CONTINUE
    2182            0 :       NZ = -1
    2183            0 :       RETURN
    2184              :   110 CONTINUE
    2185            0 :       NZ=-2
    2186            0 :       RETURN
    2187              :       END SUBROUTINE ZASYI
    2188              : 
    2189            0 :       SUBROUTINE AZSQRT(AR, AI, BR, BI)
    2190              : !C***BEGIN PROLOGUE  AZSQRT
    2191              : !C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
    2192              : !C
    2193              : !C     DOUBLE PRECISION COMPLEX SQUARE ROOT, B=CSQRT(A)
    2194              : !C
    2195              : !C***ROUTINES CALLED  AZABS
    2196              : !C***END PROLOGUE  AZSQRT
    2197              :       DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DRT
    2198              :       !DOUBLE PRECISION AZABS
    2199              :       DATA DRT , DPI / 7.071067811865475244008443621D-1,  &
    2200              :      &                 3.141592653589793238462643383D+0/
    2201            0 :       ZM = AZABS(AR,AI)
    2202            0 :       ZM = DSQRT(ZM)
    2203            0 :       IF (AR.EQ.0.0D+0) GO TO 10
    2204            0 :       IF (AI.EQ.0.0D+0) GO TO 20
    2205            0 :       DTHETA = DATAN(AI/AR)
    2206            0 :       IF (DTHETA.LE.0.0D+0) GO TO 40
    2207            0 :       IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
    2208            0 :       GO TO 50
    2209            0 :    10 IF (AI.GT.0.0D+0) GO TO 60
    2210            0 :       IF (AI.LT.0.0D+0) GO TO 70
    2211            0 :       BR = 0.0D+0
    2212            0 :       BI = 0.0D+0
    2213            0 :       RETURN
    2214            0 :    20 IF (AR.GT.0.0D+0) GO TO 30
    2215            0 :       BR = 0.0D+0
    2216            0 :       BI = DSQRT(DABS(AR))
    2217            0 :       RETURN
    2218            0 :    30 BR = DSQRT(AR)
    2219            0 :       BI = 0.0D+0
    2220            0 :       RETURN
    2221            0 :    40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
    2222            0 :    50 DTHETA = DTHETA*0.5D+0
    2223            0 :       BR = ZM*DCOS(DTHETA)
    2224            0 :       BI = ZM*DSIN(DTHETA)
    2225            0 :       RETURN
    2226            0 :    60 BR = ZM*DRT
    2227            0 :       BI = ZM*DRT
    2228            0 :       RETURN
    2229            0 :    70 BR = ZM*DRT
    2230            0 :       BI = -ZM*DRT
    2231            0 :       RETURN
    2232              :       END SUBROUTINE AZSQRT
    2233              : 
    2234            0 :       SUBROUTINE AZEXP(AR, AI, BR, BI)
    2235              : !C***BEGIN PROLOGUE  AZEXP
    2236              : !C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
    2237              : !C
    2238              : !C     DOUBLE PRECISION COMPLEX EXPONENTIAL FUNCTION B=EXP(A)
    2239              : !C
    2240              : !C***ROUTINES CALLED  (NONE)
    2241              : !C***END PROLOGUE  AZEXP
    2242              :       DOUBLE PRECISION AR, AI, BR, BI, ZM, CA, CB
    2243            0 :       ZM = DEXP(AR)
    2244            0 :       CA = ZM*DCOS(AI)
    2245            0 :       CB = ZM*DSIN(AI)
    2246            0 :       BR = CA
    2247            0 :       BI = CB
    2248            0 :       RETURN
    2249              :       END SUBROUTINE AZEXP
    2250              : 
    2251            0 :       SUBROUTINE ZUOIK(ZR, ZI, FNU, KODE, IKFLG, N, YR, YI, NUF, TOL, &
    2252              :      & ELIM, ALIM)
    2253              : !C***BEGIN PROLOGUE  ZUOIK
    2254              : !C***REFER TO  ZBESI,ZBESK,ZBESH
    2255              : !C
    2256              : !C     ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
    2257              : !C     EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
    2258              : !C     (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
    2259              : !C     WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
    2260              : !C     EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
    2261              : !C     THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
    2262              : !C     MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE
    2263              : !C     EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
    2264              : !C     EXP(-ELIM)/TOL
    2265              : !C
    2266              : !C     IKFLG=1 MEANS THE I SEQUENCE IS TESTED
    2267              : !C          =2 MEANS THE K SEQUENCE IS TESTED
    2268              : !C     NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
    2269              : !C         =-1 MEANS AN OVERFLOW WOULD OCCUR
    2270              : !C     IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
    2271              : !C             THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
    2272              : !C     IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
    2273              : !C     IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
    2274              : !C             ANOTHER ROUTINE
    2275              : !C
    2276              : !C***ROUTINES CALLED  ZUCHK,ZUNHJ,ZUNIK,D1MACH,AZABS,AZLOG
    2277              : !C***END PROLOGUE  ZUOIK
    2278              : !C     COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN,
    2279              : !C    *ZR
    2280              :       DOUBLE PRECISION AARG, AIC, ALIM, APHI, ARGI, ARGR, ASUMI, ASUMR, &
    2281              :      & ASCLE, AX, AY, BSUMI, BSUMR, CWRKI, CWRKR, CZI, CZR, ELIM, FNN,  &
    2282              :      & FNU, GNN, GNU, PHII, PHIR, RCZ, STR, STI, SUMI, SUMR, TOL, YI,   &
    2283              :      & YR, ZBI, ZBR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI,  &
    2284              :      & ZNI, ZNR, ZR, ZRI, ZRR!, D1MACH, AZABS
    2285              :       INTEGER I, IDUM, IFORM, IKFLG, INIT, KODE, N, NN, NUF, NW
    2286              :       DIMENSION YR(N), YI(N), CWRKR(16), CWRKI(16)
    2287              :       DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
    2288              :       DATA AIC / 1.265512123484645396D+00 /
    2289            0 :       NUF = 0
    2290            0 :       NN = N
    2291            0 :       ZRR = ZR
    2292            0 :       ZRI = ZI
    2293            0 :       IF (ZR.GE.0.0D0) GO TO 10
    2294            0 :       ZRR = -ZR
    2295            0 :       ZRI = -ZI
    2296              :    10 CONTINUE
    2297            0 :       ZBR = ZRR
    2298            0 :       ZBI = ZRI
    2299            0 :       AX = DABS(ZR)*1.7321D0
    2300            0 :       AY = DABS(ZI)
    2301            0 :       IFORM = 1
    2302            0 :       IF (AY.GT.AX) IFORM = 2
    2303            0 :       GNU = DMAX1(FNU,1.0D0)
    2304            0 :       IF (IKFLG.EQ.1) GO TO 20
    2305            0 :       FNN = DBLE(FLOAT(NN))
    2306            0 :       GNN = FNU + FNN - 1.0D0
    2307            0 :       GNU = DMAX1(GNN,FNN)
    2308              :    20 CONTINUE
    2309              : !C-----------------------------------------------------------------------
    2310              : !C     ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
    2311              : !C     REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
    2312              : !C     THE SIGN OF THE IMAGINARY PART CORRECT.
    2313              : !C-----------------------------------------------------------------------
    2314            0 :       IF (IFORM.EQ.2) GO TO 30
    2315            0 :       INIT = 0
    2316              :       CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII, &
    2317            0 :      & ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
    2318            0 :       CZR = -ZETA1R + ZETA2R
    2319            0 :       CZI = -ZETA1I + ZETA2I
    2320            0 :       GO TO 50
    2321              :    30 CONTINUE
    2322            0 :       ZNR = ZRI
    2323            0 :       ZNI = -ZRR
    2324            0 :       IF (ZI.GT.0.0D0) GO TO 40
    2325            0 :       ZNR = -ZNR
    2326              :    40 CONTINUE
    2327              :       CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
    2328            0 :      & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
    2329            0 :       CZR = -ZETA1R + ZETA2R
    2330            0 :       CZI = -ZETA1I + ZETA2I
    2331            0 :       AARG = AZABS(ARGR,ARGI)
    2332              :    50 CONTINUE
    2333            0 :       IF (KODE.EQ.1) GO TO 60
    2334            0 :       CZR = CZR - ZBR
    2335            0 :       CZI = CZI - ZBI
    2336              :    60 CONTINUE
    2337            0 :       IF (IKFLG.EQ.1) GO TO 70
    2338            0 :       CZR = -CZR
    2339            0 :       CZI = -CZI
    2340              :    70 CONTINUE
    2341            0 :       APHI = AZABS(PHIR,PHII)
    2342            0 :       RCZ = CZR
    2343              : !C-----------------------------------------------------------------------
    2344              : !C     OVERFLOW TEST
    2345              : !C-----------------------------------------------------------------------
    2346            0 :       IF (RCZ.GT.ELIM) GO TO 210
    2347            0 :       IF (RCZ.LT.ALIM) GO TO 80
    2348            0 :       RCZ = RCZ + DLOG(APHI)
    2349            0 :       IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
    2350            0 :       IF (RCZ.GT.ELIM) GO TO 210
    2351            0 :       GO TO 130
    2352              :    80 CONTINUE
    2353              : !C-----------------------------------------------------------------------
    2354              : !C     UNDERFLOW TEST
    2355              : !C-----------------------------------------------------------------------
    2356            0 :       IF (RCZ.LT.(-ELIM)) GO TO 90
    2357            0 :       IF (RCZ.GT.(-ALIM)) GO TO 130
    2358            0 :       RCZ = RCZ + DLOG(APHI)
    2359            0 :       IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
    2360            0 :       IF (RCZ.GT.(-ELIM)) GO TO 110
    2361              :    90 CONTINUE
    2362            0 :       DO 100 I=1,NN
    2363            0 :         YR(I) = ZEROR
    2364            0 :         YI(I) = ZEROI
    2365            0 :   100 CONTINUE
    2366            0 :       NUF = NN
    2367            0 :       RETURN
    2368              :   110 CONTINUE
    2369            0 :       ASCLE = 1.0D+3*D1MACH(1)/TOL
    2370            0 :       CALL AZLOG(PHIR, PHII, STR, STI, IDUM)
    2371            0 :       CZR = CZR + STR
    2372            0 :       CZI = CZI + STI
    2373            0 :       IF (IFORM.EQ.1) GO TO 120
    2374            0 :       CALL AZLOG(ARGR, ARGI, STR, STI, IDUM)
    2375            0 :       CZR = CZR - 0.25D0*STR - AIC
    2376            0 :       CZI = CZI - 0.25D0*STI
    2377              :   120 CONTINUE
    2378            0 :       AX = DEXP(RCZ)/TOL
    2379            0 :       AY = CZI
    2380            0 :       CZR = AX*DCOS(AY)
    2381            0 :       CZI = AX*DSIN(AY)
    2382            0 :       CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
    2383              :       IF (NW.NE.0) GO TO 90
    2384              :   130 CONTINUE
    2385            0 :       IF (IKFLG.EQ.2) RETURN
    2386            0 :       IF (N.EQ.1) RETURN
    2387              : !C-----------------------------------------------------------------------
    2388              : !C     SET UNDERFLOWS ON I SEQUENCE
    2389              : !C-----------------------------------------------------------------------
    2390              :   140 CONTINUE
    2391            0 :       GNU = FNU + DBLE(FLOAT(NN-1))
    2392            0 :       IF (IFORM.EQ.2) GO TO 150
    2393            0 :       INIT = 0
    2394              :       CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII, &
    2395            0 :      & ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
    2396            0 :       CZR = -ZETA1R + ZETA2R
    2397            0 :       CZI = -ZETA1I + ZETA2I
    2398            0 :       GO TO 160
    2399              :   150 CONTINUE
    2400              :       CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
    2401            0 :      & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
    2402            0 :       CZR = -ZETA1R + ZETA2R
    2403            0 :       CZI = -ZETA1I + ZETA2I
    2404            0 :       AARG = AZABS(ARGR,ARGI)
    2405              :   160 CONTINUE
    2406            0 :       IF (KODE.EQ.1) GO TO 170
    2407            0 :       CZR = CZR - ZBR
    2408            0 :       CZI = CZI - ZBI
    2409              :   170 CONTINUE
    2410            0 :       APHI = AZABS(PHIR,PHII)
    2411            0 :       RCZ = CZR
    2412            0 :       IF (RCZ.LT.(-ELIM)) GO TO 180
    2413            0 :       IF (RCZ.GT.(-ALIM)) RETURN
    2414            0 :       RCZ = RCZ + DLOG(APHI)
    2415            0 :       IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
    2416            0 :       IF (RCZ.GT.(-ELIM)) GO TO 190
    2417              :   180 CONTINUE
    2418            0 :       YR(NN) = ZEROR
    2419            0 :       YI(NN) = ZEROI
    2420            0 :       NN = NN - 1
    2421            0 :       NUF = NUF + 1
    2422            0 :       IF (NN.EQ.0) RETURN
    2423            0 :       GO TO 140
    2424              :   190 CONTINUE
    2425            0 :       ASCLE = 1.0D+3*D1MACH(1)/TOL
    2426            0 :       CALL AZLOG(PHIR, PHII, STR, STI, IDUM)
    2427            0 :       CZR = CZR + STR
    2428            0 :       CZI = CZI + STI
    2429            0 :       IF (IFORM.EQ.1) GO TO 200
    2430            0 :       CALL AZLOG(ARGR, ARGI, STR, STI, IDUM)
    2431            0 :       CZR = CZR - 0.25D0*STR - AIC
    2432            0 :       CZI = CZI - 0.25D0*STI
    2433              :   200 CONTINUE
    2434            0 :       AX = DEXP(RCZ)/TOL
    2435            0 :       AY = CZI
    2436            0 :       CZR = AX*DCOS(AY)
    2437            0 :       CZI = AX*DSIN(AY)
    2438            0 :       CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
    2439              :       IF (NW.NE.0) GO TO 180
    2440            0 :       RETURN
    2441              :   210 CONTINUE
    2442            0 :       NUF = -1
    2443            0 :       RETURN
    2444              :       END SUBROUTINE ZUOIK
    2445              : 
    2446              : 
    2447            0 :       SUBROUTINE ZUNIK(ZRR, ZRI, FNU, IKFLG, IPMTR, TOL, INIT, PHIR, &
    2448              :      & PHII, ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
    2449              : !C***BEGIN PROLOGUE  ZUNIK
    2450              : !C***REFER TO  ZBESI,ZBESK
    2451              : !C
    2452              : !C        ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC
    2453              : !C        EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2
    2454              : !C        RESPECTIVELY BY
    2455              : !C
    2456              : !C        W(FNU,ZR) = PHI*EXP(ZETA)*SUM
    2457              : !C
    2458              : !C        WHERE       ZETA=-ZETA1 + ZETA2       OR
    2459              : !C                          ZETA1 - ZETA2
    2460              : !C
    2461              : !C        THE FIRST CALL MUST HAVE INIT=0. SUBSEQUENT CALLS WITH THE
    2462              : !C        SAME ZR AND FNU WILL RETURN THE I OR K FUNCTION ON IKFLG=
    2463              : !C        1 OR 2 WITH NO CHANGE IN INIT. CWRK IS A COMPLEX WORK
    2464              : !C        ARRAY. IPMTR=0 COMPUTES ALL PARAMETERS. IPMTR=1 COMPUTES PHI,
    2465              : !C        ZETA1,ZETA2.
    2466              : !C
    2467              : !C***ROUTINES CALLED  ZDIV,AZLOG,AZSQRT,D1MACH
    2468              : !C***END PROLOGUE  ZUNIK
    2469              : !C     COMPLEX CFN,CON,CONE,CRFN,CWRK,CZERO,PHI,S,SR,SUM,T,T2,ZETA1,
    2470              : !C    *ZETA2,ZN,ZR
    2471              :       DOUBLE PRECISION AC, C, CON, CONEI, CONER, CRFNI, CRFNR, CWRKI, &
    2472              :      & CWRKR, FNU, PHII, PHIR, RFN, SI, SR, SRI, SRR, STI, STR, SUMI, &
    2473              :      & SUMR, TEST, TI, TOL, TR, T2I, T2R, ZEROI, ZEROR, ZETA1I, ZETA1R, &
    2474              :      & ZETA2I, ZETA2R, ZNI, ZNR, ZRI, ZRR!, D1MACH
    2475              :       INTEGER I, IDUM, IKFLG, INIT, IPMTR, J, K, L
    2476              :       DIMENSION C(120), CWRKR(16), CWRKI(16), CON(2)
    2477              :       DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
    2478              :       DATA CON(1), CON(2)  /  &
    2479              :      & 3.98942280401432678D-01,  1.25331413731550025D+00 /
    2480              :       DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10), &
    2481              :      &     C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18),  &
    2482              :      &     C(19), C(20), C(21), C(22), C(23), C(24)/ &
    2483              :      &     1.00000000000000000D+00,    -2.08333333333333333D-01, &
    2484              :      &     1.25000000000000000D-01,     3.34201388888888889D-01, &
    2485              :      &    -4.01041666666666667D-01,     7.03125000000000000D-02, &
    2486              :      &    -1.02581259645061728D+00,     1.84646267361111111D+00, &
    2487              :      &    -8.91210937500000000D-01,     7.32421875000000000D-02, &
    2488              :      &     4.66958442342624743D+00,    -1.12070026162229938D+01, &
    2489              :      &     8.78912353515625000D+00,    -2.36408691406250000D+00, &
    2490              :      &     1.12152099609375000D-01,    -2.82120725582002449D+01, &
    2491              :      &     8.46362176746007346D+01,    -9.18182415432400174D+01, &
    2492              :      &     4.25349987453884549D+01,    -7.36879435947963170D+00, &
    2493              :      &     2.27108001708984375D-01,     2.12570130039217123D+02, &
    2494              :      &    -7.65252468141181642D+02,     1.05999045252799988D+03/
    2495              :       DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32), &
    2496              :      &     C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40), &
    2497              :      &     C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/ &
    2498              :      &    -6.99579627376132541D+02,     2.18190511744211590D+02, &
    2499              :      &    -2.64914304869515555D+01,     5.72501420974731445D-01, &
    2500              :      &    -1.91945766231840700D+03,     8.06172218173730938D+03, &
    2501              :      &    -1.35865500064341374D+04,     1.16553933368645332D+04, &
    2502              :      &    -5.30564697861340311D+03,     1.20090291321635246D+03, &
    2503              :      &    -1.08090919788394656D+02,     1.72772750258445740D+00, &
    2504              :      &     2.02042913309661486D+04,    -9.69805983886375135D+04, &
    2505              :      &     1.92547001232531532D+05,    -2.03400177280415534D+05, &
    2506              :      &     1.22200464983017460D+05,    -4.11926549688975513D+04, &
    2507              :      &     7.10951430248936372D+03,    -4.93915304773088012D+02, &
    2508              :      &     6.07404200127348304D+00,    -2.42919187900551333D+05, &
    2509              :      &     1.31176361466297720D+06,    -2.99801591853810675D+06/
    2510              :       DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56), &
    2511              :      &     C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64), &
    2512              :      &     C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/ &
    2513              :      &     3.76327129765640400D+06,    -2.81356322658653411D+06, &
    2514              :      &     1.26836527332162478D+06,    -3.31645172484563578D+05, &
    2515              :      &     4.52187689813627263D+04,    -2.49983048181120962D+03, &
    2516              :      &     2.43805296995560639D+01,     3.28446985307203782D+06, &
    2517              :      &    -1.97068191184322269D+07,     5.09526024926646422D+07, &
    2518              :      &    -7.41051482115326577D+07,     6.63445122747290267D+07, &
    2519              :      &    -3.75671766607633513D+07,     1.32887671664218183D+07, &
    2520              :      &    -2.78561812808645469D+06,     3.08186404612662398D+05, &
    2521              :      &    -1.38860897537170405D+04,     1.10017140269246738D+02, &
    2522              :      &    -4.93292536645099620D+07,     3.25573074185765749D+08, &
    2523              :      &    -9.39462359681578403D+08,     1.55359689957058006D+09,&
    2524              :      &    -1.62108055210833708D+09,     1.10684281682301447D+09/
    2525              :       DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80), &
    2526              :      &     C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88), &
    2527              :      &     C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/ &
    2528              :      &    -4.95889784275030309D+08,     1.42062907797533095D+08, &
    2529              :      &    -2.44740627257387285D+07,     2.24376817792244943D+06, &
    2530              :      &    -8.40054336030240853D+04,     5.51335896122020586D+02, &
    2531              :      &     8.14789096118312115D+08,    -5.86648149205184723D+09, &
    2532              :      &     1.86882075092958249D+10,    -3.46320433881587779D+10, &
    2533              :      &     4.12801855797539740D+10,    -3.30265997498007231D+10, &
    2534              :      &     1.79542137311556001D+10,    -6.56329379261928433D+09, &
    2535              :      &     1.55927986487925751D+09,    -2.25105661889415278D+08, &
    2536              :      &     1.73951075539781645D+07,    -5.49842327572288687D+05, &
    2537              :      &     3.03809051092238427D+03,    -1.46792612476956167D+10, &
    2538              :      &     1.14498237732025810D+11,    -3.99096175224466498D+11,&
    2539              :      &     8.19218669548577329D+11,    -1.09837515608122331D+12/
    2540              :       DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104), &
    2541              :      &     C(105), C(106), C(107), C(108), C(109), C(110), C(111), &
    2542              :      &     C(112), C(113), C(114), C(115), C(116), C(117), C(118)/ &
    2543              :      &     1.00815810686538209D+12,    -6.45364869245376503D+11, &
    2544              :      &     2.87900649906150589D+11,    -8.78670721780232657D+10, &
    2545              :      &     1.76347306068349694D+10,    -2.16716498322379509D+09, &
    2546              :      &     1.43157876718888981D+08,    -3.87183344257261262D+06, &
    2547              :      &     1.82577554742931747D+04,     2.86464035717679043D+11, &
    2548              :      &    -2.40629790002850396D+12,     9.10934118523989896D+12, &
    2549              :      &    -2.05168994109344374D+13,     3.05651255199353206D+13, &
    2550              :      &    -3.16670885847851584D+13,     2.33483640445818409D+13, &
    2551              :      &    -1.23204913055982872D+13,     4.61272578084913197D+12, &
    2552              :      &    -1.19655288019618160D+12,     2.05914503232410016D+11, &
    2553              :      &    -2.18229277575292237D+10,     1.24700929351271032D+09/
    2554              :       DATA C(119), C(120)/ &
    2555              :      &    -2.91883881222208134D+07,     1.18838426256783253D+05/
    2556              : !C
    2557            0 :       IF (INIT.NE.0) GO TO 40
    2558              : !C-----------------------------------------------------------------------
    2559              : !C     INITIALIZE ALL VARIABLES
    2560              : !C-----------------------------------------------------------------------
    2561            0 :       RFN = 1.0D0/FNU
    2562              : !C-----------------------------------------------------------------------
    2563              : !C     OVERFLOW TEST (ZR/FNU TOO SMALL)
    2564              : !C-----------------------------------------------------------------------
    2565            0 :       TEST = D1MACH(1)*1.0D+3
    2566            0 :       AC = FNU*TEST
    2567            0 :       IF (DABS(ZRR).GT.AC .OR. DABS(ZRI).GT.AC) GO TO 15
    2568            0 :       ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
    2569            0 :       ZETA1I = 0.0D0
    2570            0 :       ZETA2R = FNU
    2571            0 :       ZETA2I = 0.0D0
    2572            0 :       PHIR = 1.0D0
    2573            0 :       PHII = 0.0D0
    2574            0 :       RETURN
    2575              :    15 CONTINUE
    2576            0 :       TR = ZRR*RFN
    2577            0 :       TI = ZRI*RFN
    2578            0 :       SR = CONER + (TR*TR-TI*TI)
    2579            0 :       SI = CONEI + (TR*TI+TI*TR)
    2580            0 :       CALL AZSQRT(SR, SI, SRR, SRI)
    2581            0 :       STR = CONER + SRR
    2582            0 :       STI = CONEI + SRI
    2583            0 :       CALL ZDIV(STR, STI, TR, TI, ZNR, ZNI)
    2584            0 :       CALL AZLOG(ZNR, ZNI, STR, STI, IDUM)
    2585            0 :       ZETA1R = FNU*STR
    2586            0 :       ZETA1I = FNU*STI
    2587            0 :       ZETA2R = FNU*SRR
    2588            0 :       ZETA2I = FNU*SRI
    2589            0 :       CALL ZDIV(CONER, CONEI, SRR, SRI, TR, TI)
    2590            0 :       SRR = TR*RFN
    2591            0 :       SRI = TI*RFN
    2592            0 :       CALL AZSQRT(SRR, SRI, CWRKR(16), CWRKI(16))
    2593            0 :       PHIR = CWRKR(16)*CON(IKFLG)
    2594            0 :       PHII = CWRKI(16)*CON(IKFLG)
    2595            0 :       IF (IPMTR.NE.0) RETURN
    2596            0 :       CALL ZDIV(CONER, CONEI, SR, SI, T2R, T2I)
    2597            0 :       CWRKR(1) = CONER
    2598            0 :       CWRKI(1) = CONEI
    2599            0 :       CRFNR = CONER
    2600            0 :       CRFNI = CONEI
    2601            0 :       AC = 1.0D0
    2602            0 :       L = 1
    2603            0 :       DO 20 K=2,15
    2604            0 :         SR = ZEROR
    2605            0 :         SI = ZEROI
    2606            0 :         DO 10 J=1,K
    2607            0 :           L = L + 1
    2608            0 :           STR = SR*T2R - SI*T2I + C(L)
    2609            0 :           SI = SR*T2I + SI*T2R
    2610            0 :           SR = STR
    2611            0 :    10   CONTINUE
    2612            0 :         STR = CRFNR*SRR - CRFNI*SRI
    2613            0 :         CRFNI = CRFNR*SRI + CRFNI*SRR
    2614            0 :         CRFNR = STR
    2615            0 :         CWRKR(K) = CRFNR*SR - CRFNI*SI
    2616            0 :         CWRKI(K) = CRFNR*SI + CRFNI*SR
    2617            0 :         AC = AC*RFN
    2618            0 :         TEST = DABS(CWRKR(K)) + DABS(CWRKI(K))
    2619            0 :         IF (AC.LT.TOL .AND. TEST.LT.TOL) GO TO 30
    2620            0 :    20 CONTINUE
    2621            0 :       K = 15
    2622              :    30 CONTINUE
    2623            0 :       INIT = K
    2624              :    40 CONTINUE
    2625            0 :       IF (IKFLG.EQ.2) GO TO 60
    2626              : !C-----------------------------------------------------------------------
    2627              : !C     COMPUTE SUM FOR THE I FUNCTION
    2628              : !C-----------------------------------------------------------------------
    2629            0 :       SR = ZEROR
    2630            0 :       SI = ZEROI
    2631            0 :       DO 50 I=1,INIT
    2632            0 :         SR = SR + CWRKR(I)
    2633            0 :         SI = SI + CWRKI(I)
    2634            0 :    50 CONTINUE
    2635            0 :       SUMR = SR
    2636            0 :       SUMI = SI
    2637            0 :       PHIR = CWRKR(16)*CON(1)
    2638            0 :       PHII = CWRKI(16)*CON(1)
    2639            0 :       RETURN
    2640              :    60 CONTINUE
    2641              : !C-----------------------------------------------------------------------
    2642              : !C     COMPUTE SUM FOR THE K FUNCTION
    2643              : !C-----------------------------------------------------------------------
    2644            0 :       SR = ZEROR
    2645            0 :       SI = ZEROI
    2646            0 :       TR = CONER
    2647            0 :       DO 70 I=1,INIT
    2648            0 :         SR = SR + TR*CWRKR(I)
    2649            0 :         SI = SI + TR*CWRKI(I)
    2650            0 :         TR = -TR
    2651            0 :    70 CONTINUE
    2652            0 :       SUMR = SR
    2653            0 :       SUMI = SI
    2654            0 :       PHIR = CWRKR(16)*CON(2)
    2655            0 :       PHII = CWRKI(16)*CON(2)
    2656            0 :       RETURN
    2657              :       END SUBROUTINE ZUNIK
    2658              : 
    2659              : 
    2660            0 :       SUBROUTINE ZUNHJ(ZR, ZI, FNU, IPMTR, TOL, PHIR, PHII, ARGR, ARGI, &
    2661              :      & ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
    2662              : !C***BEGIN PROLOGUE  ZUNHJ
    2663              : !C***REFER TO  ZBESI,ZBESK
    2664              : !C
    2665              : !C     REFERENCES
    2666              : !C         HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ AND I.A.
    2667              : !C         STEGUN, AMS55, NATIONAL BUREAU OF STANDARDS, 1965, CHAPTER 9.
    2668              : !C
    2669              : !C         ASYMPTOTICS AND SPECIAL FUNCTIONS BY F.W.J. OLVER, ACADEMIC
    2670              : !C         PRESS, N.Y., 1974, PAGE 420
    2671              : !C
    2672              : !C     ABSTRACT
    2673              : !C         ZUNHJ COMPUTES PARAMETERS FOR BESSEL FUNCTIONS C(FNU,Z) =
    2674              : !C         J(FNU,Z), Y(FNU,Z) OR H(I,FNU,Z) I=1,2 FOR LARGE ORDERS FNU
    2675              : !C         BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION
    2676              : !C
    2677              : !C         C(FNU,Z)=C1*PHI*( ASUM*AIRY(ARG) + C2*BSUM*DAIRY(ARG) )
    2678              : !C
    2679              : !C         FOR PROPER CHOICES OF C1, C2, AIRY AND DAIRY WHERE AIRY IS
    2680              : !C         AN AIRY FUNCTION AND DAIRY IS ITS DERIVATIVE.
    2681              : !C
    2682              : !C               (2/3)*FNU*ZETA**1.5 = ZETA1-ZETA2,
    2683              : !C
    2684              : !C         ZETA1=0.5*FNU*CLOG((1+W)/(1-W)), ZETA2=FNU*W FOR SCALING
    2685              : !C         PURPOSES IN AIRY FUNCTIONS FROM CAIRY OR CBIRY.
    2686              : !C
    2687              : !C         MCONJ=SIGN OF AIMAG(Z), BUT IS AMBIGUOUS WHEN Z IS REAL AND
    2688              : !C         MUST BE SPECIFIED. IPMTR=0 RETURNS ALL PARAMETERS. IPMTR=
    2689              : !C         1 COMPUTES ALL EXCEPT ASUM AND BSUM.
    2690              : !C
    2691              : !C***ROUTINES CALLED  AZABS,ZDIV,AZLOG,AZSQRT,D1MACH
    2692              : !C***END PROLOGUE  ZUNHJ
    2693              : !C     COMPLEX ARG,ASUM,BSUM,CFNU,CONE,CR,CZERO,DR,P,PHI,PRZTH,PTFN,
    2694              : !C    *RFN13,RTZTA,RZTH,SUMA,SUMB,TFN,T2,UP,W,W2,Z,ZA,ZB,ZC,ZETA,ZETA1,
    2695              : !C    *ZETA2,ZTH
    2696              :       DOUBLE PRECISION ALFA, ANG, AP, AR, ARGI, ARGR, ASUMI, ASUMR, &
    2697              :      & ATOL, AW2, AZTH, BETA, BR, BSUMI, BSUMR, BTOL, C, CONEI, CONER, &
    2698              :      & CRI, CRR, DRI, DRR, EX1, EX2, FNU, FN13, FN23, GAMA, GPI, HPI, &
    2699              :      & PHII, PHIR, PI, PP, PR, PRZTHI, PRZTHR, PTFNI, PTFNR, RAW, RAW2, &
    2700              :      & RAZTH, RFNU, RFNU2, RFN13, RTZTI, RTZTR, RZTHI, RZTHR, STI, STR, &
    2701              :      & SUMAI, SUMAR, SUMBI, SUMBR, TEST, TFNI, TFNR, THPI, TOL, TZAI, &
    2702              :      & TZAR, T2I, T2R, UPI, UPR, WI, WR, W2I, W2R, ZAI, ZAR, ZBI, ZBR, &
    2703              :      & ZCI, ZCR, ZEROI, ZEROR, ZETAI, ZETAR, ZETA1I, ZETA1R, ZETA2I, &
    2704              :      & ZETA2R, ZI, ZR, ZTHI, ZTHR, AC !, AZABS, D1MACH
    2705              :       INTEGER IAS, IBS, IPMTR, IS, J, JR, JU, K, KMAX, KP1, KS, L, LR, &
    2706              :      & LRP1, L1, L2, M, IDUM
    2707              :       DIMENSION AR(14), BR(14), C(105), ALFA(180), BETA(210), GAMA(30), &
    2708              :      & AP(30), PR(30), PI(30), UPR(14), UPI(14), CRR(14), CRI(14), &
    2709              :      & DRR(14), DRI(14)
    2710              :       DATA AR(1), AR(2), AR(3), AR(4), AR(5), AR(6), AR(7), AR(8), &
    2711              :      &     AR(9), AR(10), AR(11), AR(12), AR(13), AR(14)/ &
    2712              :      &     1.00000000000000000D+00,     1.04166666666666667D-01, &
    2713              :      &     8.35503472222222222D-02,     1.28226574556327160D-01, &
    2714              :      &     2.91849026464140464D-01,     8.81627267443757652D-01, &
    2715              :      &     3.32140828186276754D+00,     1.49957629868625547D+01, &
    2716              :      &     7.89230130115865181D+01,     4.74451538868264323D+02, &
    2717              :      &     3.20749009089066193D+03,     2.40865496408740049D+04, &
    2718              :      &     1.98923119169509794D+05,     1.79190200777534383D+06/
    2719              :       DATA BR(1), BR(2), BR(3), BR(4), BR(5), BR(6), BR(7), BR(8), &
    2720              :      &     BR(9), BR(10), BR(11), BR(12), BR(13), BR(14)/ &
    2721              :      &     1.00000000000000000D+00,    -1.45833333333333333D-01, &
    2722              :      &    -9.87413194444444444D-02,    -1.43312053915895062D-01, &
    2723              :      &    -3.17227202678413548D-01,    -9.42429147957120249D-01, &
    2724              :      &    -3.51120304082635426D+00,    -1.57272636203680451D+01, &
    2725              :      &    -8.22814390971859444D+01,    -4.92355370523670524D+02, &
    2726              :      &    -3.31621856854797251D+03,    -2.48276742452085896D+04, &
    2727              :      &    -2.04526587315129788D+05,    -1.83844491706820990D+06/
    2728              :       DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10), &
    2729              :      &     C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18), &
    2730              :      &     C(19), C(20), C(21), C(22), C(23), C(24)/ &
    2731              :      &     1.00000000000000000D+00,    -2.08333333333333333D-01, &
    2732              :      &     1.25000000000000000D-01,     3.34201388888888889D-01, &
    2733              :      &    -4.01041666666666667D-01,     7.03125000000000000D-02, &
    2734              :      &    -1.02581259645061728D+00,     1.84646267361111111D+00, &
    2735              :      &    -8.91210937500000000D-01,     7.32421875000000000D-02, &
    2736              :      &     4.66958442342624743D+00,    -1.12070026162229938D+01, &
    2737              :      &     8.78912353515625000D+00,    -2.36408691406250000D+00, &
    2738              :      &     1.12152099609375000D-01,    -2.82120725582002449D+01, &
    2739              :      &     8.46362176746007346D+01,    -9.18182415432400174D+01, &
    2740              :      &     4.25349987453884549D+01,    -7.36879435947963170D+00, &
    2741              :      &     2.27108001708984375D-01,     2.12570130039217123D+02, &
    2742              :      &    -7.65252468141181642D+02,     1.05999045252799988D+03/
    2743              :       DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32), &
    2744              :      &     C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40), &
    2745              :      &     C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/ &
    2746              :      &    -6.99579627376132541D+02,     2.18190511744211590D+02, &
    2747              :      &    -2.64914304869515555D+01,     5.72501420974731445D-01, &
    2748              :      &    -1.91945766231840700D+03,     8.06172218173730938D+03, &
    2749              :      &    -1.35865500064341374D+04,     1.16553933368645332D+04, &
    2750              :      &    -5.30564697861340311D+03,     1.20090291321635246D+03, &
    2751              :      &    -1.08090919788394656D+02,     1.72772750258445740D+00, &
    2752              :      &     2.02042913309661486D+04,    -9.69805983886375135D+04, &
    2753              :      &     1.92547001232531532D+05,    -2.03400177280415534D+05, &
    2754              :      &     1.22200464983017460D+05,    -4.11926549688975513D+04, &
    2755              :      &     7.10951430248936372D+03,    -4.93915304773088012D+02, &
    2756              :      &     6.07404200127348304D+00,    -2.42919187900551333D+05, &
    2757              :      &     1.31176361466297720D+06,    -2.99801591853810675D+06/
    2758              :       DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56), &
    2759              :      &     C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64), &
    2760              :      &     C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/ &
    2761              :      &     3.76327129765640400D+06,    -2.81356322658653411D+06, &
    2762              :      &     1.26836527332162478D+06,    -3.31645172484563578D+05, &
    2763              :      &     4.52187689813627263D+04,    -2.49983048181120962D+03, &
    2764              :      &     2.43805296995560639D+01,     3.28446985307203782D+06, &
    2765              :      &    -1.97068191184322269D+07,     5.09526024926646422D+07, &
    2766              :      &    -7.41051482115326577D+07,     6.63445122747290267D+07, &
    2767              :      &    -3.75671766607633513D+07,     1.32887671664218183D+07, &
    2768              :      &    -2.78561812808645469D+06,     3.08186404612662398D+05, &
    2769              :      &    -1.38860897537170405D+04,     1.10017140269246738D+02, &
    2770              :      &    -4.93292536645099620D+07,     3.25573074185765749D+08, &
    2771              :      &    -9.39462359681578403D+08,     1.55359689957058006D+09, &
    2772              :      &    -1.62108055210833708D+09,     1.10684281682301447D+09/
    2773              :       DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80), &
    2774              :      &    C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88), &
    2775              :      &    C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/ &
    2776              :      &    -4.95889784275030309D+08,     1.42062907797533095D+08, &
    2777              :      &    -2.44740627257387285D+07,     2.24376817792244943D+06, &
    2778              :      &    -8.40054336030240853D+04,     5.51335896122020586D+02, &
    2779              :      &     8.14789096118312115D+08,    -5.86648149205184723D+09, &
    2780              :      &     1.86882075092958249D+10,    -3.46320433881587779D+10, &
    2781              :      &     4.12801855797539740D+10,    -3.30265997498007231D+10, &
    2782              :      &     1.79542137311556001D+10,    -6.56329379261928433D+09, &
    2783              :      &     1.55927986487925751D+09,    -2.25105661889415278D+08, &
    2784              :      &     1.73951075539781645D+07,    -5.49842327572288687D+05, &
    2785              :      &     3.03809051092238427D+03,    -1.46792612476956167D+10, &
    2786              :      &     1.14498237732025810D+11,    -3.99096175224466498D+11, &
    2787              :      &     8.19218669548577329D+11,    -1.09837515608122331D+12/
    2788              :       DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104), &
    2789              :      &     C(105)/ &
    2790              :      &     1.00815810686538209D+12,    -6.45364869245376503D+11, &
    2791              :      &     2.87900649906150589D+11,    -8.78670721780232657D+10, &
    2792              :      &     1.76347306068349694D+10,    -2.16716498322379509D+09, &
    2793              :      &     1.43157876718888981D+08,    -3.87183344257261262D+06, &
    2794              :      &     1.82577554742931747D+04/
    2795              :       DATA ALFA(1), ALFA(2), ALFA(3), ALFA(4), ALFA(5), ALFA(6), &
    2796              :      &     ALFA(7), ALFA(8), ALFA(9), ALFA(10), ALFA(11), ALFA(12), &
    2797              :      &     ALFA(13), ALFA(14), ALFA(15), ALFA(16), ALFA(17), ALFA(18), &
    2798              :      &     ALFA(19), ALFA(20), ALFA(21), ALFA(22)/ &
    2799              :      &    -4.44444444444444444D-03,    -9.22077922077922078D-04, &
    2800              :      &    -8.84892884892884893D-05,     1.65927687832449737D-04, &
    2801              :      &     2.46691372741792910D-04,     2.65995589346254780D-04, &
    2802              :      &     2.61824297061500945D-04,     2.48730437344655609D-04, &
    2803              :      &     2.32721040083232098D-04,     2.16362485712365082D-04, &
    2804              :      &     2.00738858762752355D-04,     1.86267636637545172D-04, &
    2805              :      &     1.73060775917876493D-04,     1.61091705929015752D-04, &
    2806              :      &     1.50274774160908134D-04,     1.40503497391269794D-04, &
    2807              :      &     1.31668816545922806D-04,     1.23667445598253261D-04, &
    2808              :      &     1.16405271474737902D-04,     1.09798298372713369D-04, &
    2809              :      &     1.03772410422992823D-04,     9.82626078369363448D-05/
    2810              :       DATA ALFA(23), ALFA(24), ALFA(25), ALFA(26), ALFA(27), ALFA(28), &
    2811              :      &     ALFA(29), ALFA(30), ALFA(31), ALFA(32), ALFA(33), ALFA(34), &
    2812              :      &     ALFA(35), ALFA(36), ALFA(37), ALFA(38), ALFA(39), ALFA(40), &
    2813              :      &     ALFA(41), ALFA(42), ALFA(43), ALFA(44)/ &
    2814              :      &     9.32120517249503256D-05,     8.85710852478711718D-05, &
    2815              :      &     8.42963105715700223D-05,     8.03497548407791151D-05, &
    2816              :      &     7.66981345359207388D-05,     7.33122157481777809D-05, &
    2817              :      &     7.01662625163141333D-05,     6.72375633790160292D-05, &
    2818              :      &     6.93735541354588974D-04,     2.32241745182921654D-04, &
    2819              :      &    -1.41986273556691197D-05,    -1.16444931672048640D-04, &
    2820              :      &    -1.50803558053048762D-04,    -1.55121924918096223D-04, &
    2821              :      &    -1.46809756646465549D-04,    -1.33815503867491367D-04, &
    2822              :      &    -1.19744975684254051D-04,    -1.06184319207974020D-04, &
    2823              :      &    -9.37699549891194492D-05,    -8.26923045588193274D-05, &
    2824              :      &    -7.29374348155221211D-05,    -6.44042357721016283D-05/
    2825              :       DATA ALFA(45), ALFA(46), ALFA(47), ALFA(48), ALFA(49), ALFA(50), &
    2826              :      &     ALFA(51), ALFA(52), ALFA(53), ALFA(54), ALFA(55), ALFA(56), &
    2827              :      &     ALFA(57), ALFA(58), ALFA(59), ALFA(60), ALFA(61), ALFA(62), &
    2828              :      &     ALFA(63), ALFA(64), ALFA(65), ALFA(66)/ &
    2829              :      &    -5.69611566009369048D-05,    -5.04731044303561628D-05, &
    2830              :      &    -4.48134868008882786D-05,    -3.98688727717598864D-05, &
    2831              :      &    -3.55400532972042498D-05,    -3.17414256609022480D-05, &
    2832              :      &    -2.83996793904174811D-05,    -2.54522720634870566D-05, &
    2833              :      &    -2.28459297164724555D-05,    -2.05352753106480604D-05, &
    2834              :      &    -1.84816217627666085D-05,    -1.66519330021393806D-05, &
    2835              :      &    -1.50179412980119482D-05,    -1.35554031379040526D-05, &
    2836              :      &    -1.22434746473858131D-05,    -1.10641884811308169D-05, &
    2837              :      &    -3.54211971457743841D-04,    -1.56161263945159416D-04, &
    2838              :      &     3.04465503594936410D-05,     1.30198655773242693D-04, &
    2839              :      &     1.67471106699712269D-04,     1.70222587683592569D-04/
    2840              :       DATA ALFA(67), ALFA(68), ALFA(69), ALFA(70), ALFA(71), ALFA(72), &
    2841              :      &     ALFA(73), ALFA(74), ALFA(75), ALFA(76), ALFA(77), ALFA(78), &
    2842              :      &     ALFA(79), ALFA(80), ALFA(81), ALFA(82), ALFA(83), ALFA(84), &
    2843              :      &     ALFA(85), ALFA(86), ALFA(87), ALFA(88)/ &
    2844              :      &     1.56501427608594704D-04,     1.36339170977445120D-04, &
    2845              :      &     1.14886692029825128D-04,     9.45869093034688111D-05, &
    2846              :      &     7.64498419250898258D-05,     6.07570334965197354D-05, &
    2847              :      &     4.74394299290508799D-05,     3.62757512005344297D-05, &
    2848              :      &     2.69939714979224901D-05,     1.93210938247939253D-05, &
    2849              :      &     1.30056674793963203D-05,     7.82620866744496661D-06, &
    2850              :      &     3.59257485819351583D-06,     1.44040049814251817D-07, &
    2851              :      &    -2.65396769697939116D-06,    -4.91346867098485910D-06, &
    2852              :      &    -6.72739296091248287D-06,    -8.17269379678657923D-06, &
    2853              :      &    -9.31304715093561232D-06,    -1.02011418798016441D-05, &
    2854              :          -1.08805962510592880D-05,    -1.13875481509603555D-05/
    2855              :       DATA ALFA(89), ALFA(90), ALFA(91), ALFA(92), ALFA(93), ALFA(94), &
    2856              :      &     ALFA(95), ALFA(96), ALFA(97), ALFA(98), ALFA(99), ALFA(100), &
    2857              :      &     ALFA(101), ALFA(102), ALFA(103), ALFA(104), ALFA(105), &
    2858              :      &     ALFA(106), ALFA(107), ALFA(108), ALFA(109), ALFA(110)/ &
    2859              :      &    -1.17519675674556414D-05,    -1.19987364870944141D-05, &
    2860              :      &     3.78194199201772914D-04,     2.02471952761816167D-04, &
    2861              :      &    -6.37938506318862408D-05,    -2.38598230603005903D-04, &
    2862              :      &    -3.10916256027361568D-04,    -3.13680115247576316D-04, &
    2863              :      &    -2.78950273791323387D-04,    -2.28564082619141374D-04, &
    2864              :      &    -1.75245280340846749D-04,    -1.25544063060690348D-04, &
    2865              :      &    -8.22982872820208365D-05,    -4.62860730588116458D-05, &
    2866              :      &    -1.72334302366962267D-05,     5.60690482304602267D-06, &
    2867              :      &     2.31395443148286800D-05,     3.62642745856793957D-05, &
    2868              :      &     4.58006124490188752D-05,     5.24595294959114050D-05, &
    2869              :      &     5.68396208545815266D-05,     5.94349820393104052D-05/
    2870              :       DATA ALFA(111), ALFA(112), ALFA(113), ALFA(114), ALFA(115), &
    2871              :      &     ALFA(116), ALFA(117), ALFA(118), ALFA(119), ALFA(120), &
    2872              :      &     ALFA(121), ALFA(122), ALFA(123), ALFA(124), ALFA(125), &
    2873              :      &     ALFA(126), ALFA(127), ALFA(128), ALFA(129), ALFA(130)/ &
    2874              :      &     6.06478527578421742D-05,     6.08023907788436497D-05, &
    2875              :      &     6.01577894539460388D-05,     5.89199657344698500D-05, &
    2876              :      &     5.72515823777593053D-05,     5.52804375585852577D-05, &
    2877              :      &     5.31063773802880170D-05,     5.08069302012325706D-05, &
    2878              :      &     4.84418647620094842D-05,     4.60568581607475370D-05, &
    2879              :      &    -6.91141397288294174D-04,    -4.29976633058871912D-04, &
    2880              :      &     1.83067735980039018D-04,     6.60088147542014144D-04, &
    2881              :      &     8.75964969951185931D-04,     8.77335235958235514D-04, &
    2882              :      &     7.49369585378990637D-04,     5.63832329756980918D-04, &
    2883              :      &     3.68059319971443156D-04,     1.88464535514455599D-04/
    2884              :       DATA ALFA(131), ALFA(132), ALFA(133), ALFA(134), ALFA(135), &
    2885              :      &     ALFA(136), ALFA(137), ALFA(138), ALFA(139), ALFA(140), &
    2886              :      &     ALFA(141), ALFA(142), ALFA(143), ALFA(144), ALFA(145), &
    2887              :      &     ALFA(146), ALFA(147), ALFA(148), ALFA(149), ALFA(150)/ &
    2888              :      &     3.70663057664904149D-05,    -8.28520220232137023D-05, &
    2889              :      &    -1.72751952869172998D-04,    -2.36314873605872983D-04, &
    2890              :      &    -2.77966150694906658D-04,    -3.02079514155456919D-04, &
    2891              :      &    -3.12594712643820127D-04,    -3.12872558758067163D-04, &
    2892              :      &    -3.05678038466324377D-04,    -2.93226470614557331D-04, &
    2893              :      &    -2.77255655582934777D-04,    -2.59103928467031709D-04, &
    2894              :      &    -2.39784014396480342D-04,    -2.20048260045422848D-04, &
    2895              :      &    -2.00443911094971498D-04,    -1.81358692210970687D-04, &
    2896              :      &    -1.63057674478657464D-04,    -1.45712672175205844D-04, &
    2897              :      &    -1.29425421983924587D-04,    -1.14245691942445952D-04/
    2898              :       DATA ALFA(151), ALFA(152), ALFA(153), ALFA(154), ALFA(155), &
    2899              :      &     ALFA(156), ALFA(157), ALFA(158), ALFA(159), ALFA(160), &
    2900              :      &     ALFA(161), ALFA(162), ALFA(163), ALFA(164), ALFA(165), &
    2901              :      &     ALFA(166), ALFA(167), ALFA(168), ALFA(169), ALFA(170)/ &
    2902              :      &     1.92821964248775885D-03,     1.35592576302022234D-03, &
    2903              :      &    -7.17858090421302995D-04,    -2.58084802575270346D-03, &
    2904              :      &    -3.49271130826168475D-03,    -3.46986299340960628D-03, &
    2905              :      &    -2.82285233351310182D-03,    -1.88103076404891354D-03, &
    2906              :      &    -8.89531718383947600D-04,     3.87912102631035228D-06, &
    2907              :      &     7.28688540119691412D-04,     1.26566373053457758D-03, &
    2908              :      &     1.62518158372674427D-03,     1.83203153216373172D-03, &
    2909              :      &     1.91588388990527909D-03,     1.90588846755546138D-03, &
    2910              :      &     1.82798982421825727D-03,     1.70389506421121530D-03, &
    2911              :      &     1.55097127171097686D-03,     1.38261421852276159D-03/
    2912              :       DATA ALFA(171), ALFA(172), ALFA(173), ALFA(174), ALFA(175), &
    2913              :      &     ALFA(176), ALFA(177), ALFA(178), ALFA(179), ALFA(180)/ &
    2914              :      &     1.20881424230064774D-03,     1.03676532638344962D-03, &
    2915              :      &     8.71437918068619115D-04,     7.16080155297701002D-04, &
    2916              :      &     5.72637002558129372D-04,     4.42089819465802277D-04, &
    2917              :      &     3.24724948503090564D-04,     2.20342042730246599D-04, &
    2918              :      &     1.28412898401353882D-04,     4.82005924552095464D-05/
    2919              :       DATA BETA(1), BETA(2), BETA(3), BETA(4), BETA(5), BETA(6), &
    2920              :      &     BETA(7), BETA(8), BETA(9), BETA(10), BETA(11), BETA(12), &
    2921              :      &     BETA(13), BETA(14), BETA(15), BETA(16), BETA(17), BETA(18), &
    2922              :      &     BETA(19), BETA(20), BETA(21), BETA(22)/ &
    2923              :      &     1.79988721413553309D-02,     5.59964911064388073D-03, &
    2924              :      &     2.88501402231132779D-03,     1.80096606761053941D-03, &
    2925              :      &     1.24753110589199202D-03,     9.22878876572938311D-04, &
    2926              :      &     7.14430421727287357D-04,     5.71787281789704872D-04, &
    2927              :      &     4.69431007606481533D-04,     3.93232835462916638D-04, &
    2928              :      &     3.34818889318297664D-04,     2.88952148495751517D-04, &
    2929              :      &     2.52211615549573284D-04,     2.22280580798883327D-04, &
    2930              :      &     1.97541838033062524D-04,     1.76836855019718004D-04, &
    2931              :      &     1.59316899661821081D-04,     1.44347930197333986D-04, &
    2932              :      &     1.31448068119965379D-04,     1.20245444949302884D-04, &
    2933              :      &     1.10449144504599392D-04,     1.01828770740567258D-04/
    2934              :       DATA BETA(23), BETA(24), BETA(25), BETA(26), BETA(27), BETA(28), &
    2935              :      &     BETA(29), BETA(30), BETA(31), BETA(32), BETA(33), BETA(34), &
    2936              :      &     BETA(35), BETA(36), BETA(37), BETA(38), BETA(39), BETA(40), &
    2937              :      &     BETA(41), BETA(42), BETA(43), BETA(44)/ &
    2938              :      &     9.41998224204237509D-05,     8.74130545753834437D-05, &
    2939              :      &     8.13466262162801467D-05,     7.59002269646219339D-05, &
    2940              :      &     7.09906300634153481D-05,     6.65482874842468183D-05, &
    2941              :      &     6.25146958969275078D-05,     5.88403394426251749D-05, &
    2942              :      &    -1.49282953213429172D-03,    -8.78204709546389328D-04, &
    2943              :      &    -5.02916549572034614D-04,    -2.94822138512746025D-04, &
    2944              :      &    -1.75463996970782828D-04,    -1.04008550460816434D-04, &
    2945              :      &    -5.96141953046457895D-05,    -3.12038929076098340D-05, &
    2946              :      &    -1.26089735980230047D-05,    -2.42892608575730389D-07, &
    2947              :      &     8.05996165414273571D-06,     1.36507009262147391D-05, &
    2948              :      &     1.73964125472926261D-05,     1.98672978842133780D-05/
    2949              :       DATA BETA(45), BETA(46), BETA(47), BETA(48), BETA(49), BETA(50), &
    2950              :      &     BETA(51), BETA(52), BETA(53), BETA(54), BETA(55), BETA(56), &
    2951              :      &     BETA(57), BETA(58), BETA(59), BETA(60), BETA(61), BETA(62), &
    2952              :      &     BETA(63), BETA(64), BETA(65), BETA(66)/ &
    2953              :      &     2.14463263790822639D-05,     2.23954659232456514D-05, &
    2954              :      &     2.28967783814712629D-05,     2.30785389811177817D-05, &
    2955              :      &     2.30321976080909144D-05,     2.28236073720348722D-05, &
    2956              :      &     2.25005881105292418D-05,     2.20981015361991429D-05, &
    2957              :      &     2.16418427448103905D-05,     2.11507649256220843D-05, &
    2958              :      &     2.06388749782170737D-05,     2.01165241997081666D-05, &
    2959              :      &     1.95913450141179244D-05,     1.90689367910436740D-05, &
    2960              :      &     1.85533719641636667D-05,     1.80475722259674218D-05, &
    2961              :      &     5.52213076721292790D-04,     4.47932581552384646D-04, &
    2962              :      &     2.79520653992020589D-04,     1.52468156198446602D-04, &
    2963              :      &     6.93271105657043598D-05,     1.76258683069991397D-05/
    2964              :       DATA BETA(67), BETA(68), BETA(69), BETA(70), BETA(71), BETA(72), &
    2965              :      &     BETA(73), BETA(74), BETA(75), BETA(76), BETA(77), BETA(78), &
    2966              :      &     BETA(79), BETA(80), BETA(81), BETA(82), BETA(83), BETA(84), &
    2967              :      &     BETA(85), BETA(86), BETA(87), BETA(88)/ &
    2968              :      &    -1.35744996343269136D-05,    -3.17972413350427135D-05, &
    2969              :      &    -4.18861861696693365D-05,    -4.69004889379141029D-05, &
    2970              :      &    -4.87665447413787352D-05,    -4.87010031186735069D-05, &
    2971              :      &    -4.74755620890086638D-05,    -4.55813058138628452D-05, &
    2972              :      &    -4.33309644511266036D-05,    -4.09230193157750364D-05, &
    2973              :      &    -3.84822638603221274D-05,    -3.60857167535410501D-05, &
    2974              :      &    -3.37793306123367417D-05,    -3.15888560772109621D-05, &
    2975              :      &    -2.95269561750807315D-05,    -2.75978914828335759D-05, &
    2976              :      &    -2.58006174666883713D-05,    -2.41308356761280200D-05, &
    2977              :      &    -2.25823509518346033D-05,    -2.11479656768912971D-05, &
    2978              :      &    -1.98200638885294927D-05,    -1.85909870801065077D-05/
    2979              :       DATA BETA(89), BETA(90), BETA(91), BETA(92), BETA(93), BETA(94), &
    2980              :      &     BETA(95), BETA(96), BETA(97), BETA(98), BETA(99), BETA(100), &
    2981              :      &     BETA(101), BETA(102), BETA(103), BETA(104), BETA(105), &
    2982              :      &     BETA(106), BETA(107), BETA(108), BETA(109), BETA(110)/&
    2983              :      &    -1.74532699844210224D-05,    -1.63997823854497997D-05, &
    2984              :      &    -4.74617796559959808D-04,    -4.77864567147321487D-04, &
    2985              :      &    -3.20390228067037603D-04,    -1.61105016119962282D-04, &
    2986              :      &    -4.25778101285435204D-05,     3.44571294294967503D-05, &
    2987              :      &     7.97092684075674924D-05,     1.03138236708272200D-04, &
    2988              :      &     1.12466775262204158D-04,     1.13103642108481389D-04, &
    2989              :      &     1.08651634848774268D-04,     1.01437951597661973D-04, &
    2990              :      &     9.29298396593363896D-05,     8.40293133016089978D-05, &
    2991              :      &     7.52727991349134062D-05,     6.69632521975730872D-05, &
    2992              :      &     5.92564547323194704D-05,     5.22169308826975567D-05, &
    2993              :      &     4.58539485165360646D-05,     4.01445513891486808D-05/
    2994              :       DATA BETA(111), BETA(112), BETA(113), BETA(114), BETA(115), &
    2995              :      &     BETA(116), BETA(117), BETA(118), BETA(119), BETA(120), &
    2996              :      &     BETA(121), BETA(122), BETA(123), BETA(124), BETA(125), &
    2997              :      &     BETA(126), BETA(127), BETA(128), BETA(129), BETA(130)/ &
    2998              :      &     3.50481730031328081D-05,     3.05157995034346659D-05, &
    2999              :      &     2.64956119950516039D-05,     2.29363633690998152D-05, &
    3000              :      &     1.97893056664021636D-05,     1.70091984636412623D-05, &
    3001              :      &     1.45547428261524004D-05,     1.23886640995878413D-05, &
    3002              :      &     1.04775876076583236D-05,     8.79179954978479373D-06, &
    3003              :      &     7.36465810572578444D-04,     8.72790805146193976D-04, &
    3004              :      &     6.22614862573135066D-04,     2.85998154194304147D-04, &
    3005              :      &     3.84737672879366102D-06,    -1.87906003636971558D-04, &
    3006              :      &    -2.97603646594554535D-04,    -3.45998126832656348D-04, &
    3007              :      &    -3.53382470916037712D-04,    -3.35715635775048757D-04/
    3008              :       DATA BETA(131), BETA(132), BETA(133), BETA(134), BETA(135), &
    3009              :      &     BETA(136), BETA(137), BETA(138), BETA(139), BETA(140), &
    3010              :      &     BETA(141), BETA(142), BETA(143), BETA(144), BETA(145), &
    3011              :      &     BETA(146), BETA(147), BETA(148), BETA(149), BETA(150)/ &
    3012              :      &    -3.04321124789039809D-04,    -2.66722723047612821D-04, &
    3013              :      &    -2.27654214122819527D-04,    -1.89922611854562356D-04, &
    3014              :      &    -1.55058918599093870D-04,    -1.23778240761873630D-04, &
    3015              :      &    -9.62926147717644187D-05,    -7.25178327714425337D-05, &
    3016              :      &    -5.22070028895633801D-05,    -3.50347750511900522D-05, &
    3017              :      &    -2.06489761035551757D-05,    -8.70106096849767054D-06, &
    3018              :      &     1.13698686675100290D-06,     9.16426474122778849D-06, &
    3019              :      &     1.56477785428872620D-05,     2.08223629482466847D-05, &
    3020              :      &     2.48923381004595156D-05,     2.80340509574146325D-05, &
    3021              :      &     3.03987774629861915D-05,     3.21156731406700616D-05/
    3022              :       DATA BETA(151), BETA(152), BETA(153), BETA(154), BETA(155), &
    3023              :      &     BETA(156), BETA(157), BETA(158), BETA(159), BETA(160), &
    3024              :      &     BETA(161), BETA(162), BETA(163), BETA(164), BETA(165), &
    3025              :      &     BETA(166), BETA(167), BETA(168), BETA(169), BETA(170)/ &
    3026              :      &    -1.80182191963885708D-03,    -2.43402962938042533D-03, &
    3027              :      &    -1.83422663549856802D-03,    -7.62204596354009765D-04, &
    3028              :      &     2.39079475256927218D-04,     9.49266117176881141D-04, &
    3029              :      &     1.34467449701540359D-03,     1.48457495259449178D-03, &
    3030              :      &     1.44732339830617591D-03,     1.30268261285657186D-03, &
    3031              :      &     1.10351597375642682D-03,     8.86047440419791759D-04, &
    3032              :      &     6.73073208165665473D-04,     4.77603872856582378D-04, &
    3033              :      &     3.05991926358789362D-04,     1.60315694594721630D-04, &
    3034              :      &     4.00749555270613286D-05,    -5.66607461635251611D-05, &
    3035              :      &    -1.32506186772982638D-04,    -1.90296187989614057D-04/
    3036              :       DATA BETA(171), BETA(172), BETA(173), BETA(174), BETA(175), &
    3037              :      &     BETA(176), BETA(177), BETA(178), BETA(179), BETA(180), &
    3038              :      &     BETA(181), BETA(182), BETA(183), BETA(184), BETA(185), &
    3039              :      &     BETA(186), BETA(187), BETA(188), BETA(189), BETA(190)/ &
    3040              :      &    -2.32811450376937408D-04,    -2.62628811464668841D-04, &
    3041              :      &    -2.82050469867598672D-04,    -2.93081563192861167D-04, &
    3042              :      &    -2.97435962176316616D-04,    -2.96557334239348078D-04, &
    3043              :      &    -2.91647363312090861D-04,    -2.83696203837734166D-04, &
    3044              :      &    -2.73512317095673346D-04,    -2.61750155806768580D-04, &
    3045              :      &     6.38585891212050914D-03,     9.62374215806377941D-03, &
    3046              :      &     7.61878061207001043D-03,     2.83219055545628054D-03, &
    3047              :      &    -2.09841352012720090D-03,    -5.73826764216626498D-03, &
    3048              :      &    -7.70804244495414620D-03,    -8.21011692264844401D-03, &
    3049              :      &    -7.65824520346905413D-03,    -6.47209729391045177D-03/
    3050              :       DATA BETA(191), BETA(192), BETA(193), BETA(194), BETA(195), &
    3051              :      &     BETA(196), BETA(197), BETA(198), BETA(199), BETA(200), &
    3052              :      &     BETA(201), BETA(202), BETA(203), BETA(204), BETA(205), &
    3053              :      &     BETA(206), BETA(207), BETA(208), BETA(209), BETA(210)/ &
    3054              :      &    -4.99132412004966473D-03,    -3.45612289713133280D-03, &
    3055              :      &    -2.01785580014170775D-03,    -7.59430686781961401D-04, &
    3056              :      &     2.84173631523859138D-04,     1.10891667586337403D-03, &
    3057              :      &     1.72901493872728771D-03,     2.16812590802684701D-03, &
    3058              :      &     2.45357710494539735D-03,     2.61281821058334862D-03, &
    3059              :      &     2.67141039656276912D-03,     2.65203073395980430D-03, &
    3060              :      &     2.57411652877287315D-03,     2.45389126236094427D-03, &
    3061              :      &     2.30460058071795494D-03,     2.13684837686712662D-03, &
    3062              :      &     1.95896528478870911D-03,     1.77737008679454412D-03, &
    3063              :      &     1.59690280765839059D-03,     1.42111975664438546D-03/
    3064              :       DATA GAMA(1), GAMA(2), GAMA(3), GAMA(4), GAMA(5), GAMA(6), &
    3065              :      &     GAMA(7), GAMA(8), GAMA(9), GAMA(10), GAMA(11), GAMA(12), &
    3066              :      &     GAMA(13), GAMA(14), GAMA(15), GAMA(16), GAMA(17), GAMA(18), &
    3067              :      &     GAMA(19), GAMA(20), GAMA(21), GAMA(22)/ &
    3068              :      &     6.29960524947436582D-01,     2.51984209978974633D-01, &
    3069              :      &     1.54790300415655846D-01,     1.10713062416159013D-01, &
    3070              :      &     8.57309395527394825D-02,     6.97161316958684292D-02, &
    3071              :      &     5.86085671893713576D-02,     5.04698873536310685D-02, &
    3072              :      &     4.42600580689154809D-02,     3.93720661543509966D-02, &
    3073              :      &     3.54283195924455368D-02,     3.21818857502098231D-02, &
    3074              :      &     2.94646240791157679D-02,     2.71581677112934479D-02, &
    3075              :      &     2.51768272973861779D-02,     2.34570755306078891D-02, &
    3076              :      &     2.19508390134907203D-02,     2.06210828235646240D-02, &
    3077              :      &     1.94388240897880846D-02,     1.83810633800683158D-02, &
    3078              :      &     1.74293213231963172D-02,     1.65685837786612353D-02/
    3079              :       DATA GAMA(23), GAMA(24), GAMA(25), GAMA(26), GAMA(27), GAMA(28), &
    3080              :      &     GAMA(29), GAMA(30)/ &
    3081              :      &     1.57865285987918445D-02,     1.50729501494095594D-02, &
    3082              :      &     1.44193250839954639D-02,     1.38184805735341786D-02, &
    3083              :      &     1.32643378994276568D-02,     1.27517121970498651D-02, &
    3084              :      &     1.22761545318762767D-02,     1.18338262398482403D-02/
    3085              :       DATA EX1, EX2, HPI, GPI, THPI / &
    3086              :      &     3.33333333333333333D-01,     6.66666666666666667D-01, &
    3087              :      &     1.57079632679489662D+00,     3.14159265358979324D+00, &
    3088              :      &     4.71238898038468986D+00/
    3089              :       DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
    3090              : !C
    3091            0 :       RFNU = 1.0D0/FNU
    3092              : !C-----------------------------------------------------------------------
    3093              : !C     OVERFLOW TEST (Z/FNU TOO SMALL)
    3094              : !C-----------------------------------------------------------------------
    3095            0 :       TEST = D1MACH(1)*1.0D+3
    3096            0 :       AC = FNU*TEST
    3097            0 :       IF (DABS(ZR).GT.AC .OR. DABS(ZI).GT.AC) GO TO 15
    3098            0 :       ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
    3099            0 :       ZETA1I = 0.0D0
    3100            0 :       ZETA2R = FNU
    3101            0 :       ZETA2I = 0.0D0
    3102            0 :       PHIR = 1.0D0
    3103            0 :       PHII = 0.0D0
    3104            0 :       ARGR = 1.0D0
    3105            0 :       ARGI = 0.0D0
    3106            0 :       RETURN
    3107              :    15 CONTINUE
    3108            0 :       ZBR = ZR*RFNU
    3109            0 :       ZBI = ZI*RFNU
    3110            0 :       RFNU2 = RFNU*RFNU
    3111              : !C-----------------------------------------------------------------------
    3112              : !C     COMPUTE IN THE FOURTH QUADRANT
    3113              : !C-----------------------------------------------------------------------
    3114            0 :       FN13 = FNU**EX1
    3115            0 :       FN23 = FN13*FN13
    3116            0 :       RFN13 = 1.0D0/FN13
    3117            0 :       W2R = CONER - ZBR*ZBR + ZBI*ZBI
    3118            0 :       W2I = CONEI - ZBR*ZBI - ZBR*ZBI
    3119            0 :       AW2 = AZABS(W2R,W2I)
    3120            0 :       IF (AW2.GT.0.25D0) GO TO 130
    3121              : !C-----------------------------------------------------------------------
    3122              : !C     POWER SERIES FOR CABS(W2).LE.0.25D0
    3123              : !C-----------------------------------------------------------------------
    3124            0 :       K = 1
    3125            0 :       PR(1) = CONER
    3126            0 :       PI(1) = CONEI
    3127            0 :       SUMAR = GAMA(1)
    3128            0 :       SUMAI = ZEROI
    3129            0 :       AP(1) = 1.0D0
    3130            0 :       IF (AW2.LT.TOL) GO TO 20
    3131            0 :       DO 10 K=2,30
    3132            0 :         PR(K) = PR(K-1)*W2R - PI(K-1)*W2I
    3133            0 :         PI(K) = PR(K-1)*W2I + PI(K-1)*W2R
    3134            0 :         SUMAR = SUMAR + PR(K)*GAMA(K)
    3135            0 :         SUMAI = SUMAI + PI(K)*GAMA(K)
    3136            0 :         AP(K) = AP(K-1)*AW2
    3137            0 :         IF (AP(K).LT.TOL) GO TO 20
    3138            0 :    10 CONTINUE
    3139            0 :       K = 30
    3140              :    20 CONTINUE
    3141            0 :       KMAX = K
    3142            0 :       ZETAR = W2R*SUMAR - W2I*SUMAI
    3143            0 :       ZETAI = W2R*SUMAI + W2I*SUMAR
    3144            0 :       ARGR = ZETAR*FN23
    3145            0 :       ARGI = ZETAI*FN23
    3146            0 :       CALL AZSQRT(SUMAR, SUMAI, ZAR, ZAI)
    3147            0 :       CALL AZSQRT(W2R, W2I, STR, STI)
    3148            0 :       ZETA2R = STR*FNU
    3149            0 :       ZETA2I = STI*FNU
    3150            0 :       STR = CONER + EX2*(ZETAR*ZAR-ZETAI*ZAI)
    3151            0 :       STI = CONEI + EX2*(ZETAR*ZAI+ZETAI*ZAR)
    3152            0 :       ZETA1R = STR*ZETA2R - STI*ZETA2I
    3153            0 :       ZETA1I = STR*ZETA2I + STI*ZETA2R
    3154            0 :       ZAR = ZAR + ZAR
    3155            0 :       ZAI = ZAI + ZAI
    3156            0 :       CALL AZSQRT(ZAR, ZAI, STR, STI)
    3157            0 :       PHIR = STR*RFN13
    3158            0 :       PHII = STI*RFN13
    3159            0 :       IF (IPMTR.EQ.1) GO TO 120
    3160              : !C-----------------------------------------------------------------------
    3161              : !C     SUM SERIES FOR ASUM AND BSUM
    3162              : !C-----------------------------------------------------------------------
    3163            0 :       SUMBR = ZEROR
    3164            0 :       SUMBI = ZEROI
    3165            0 :       DO 30 K=1,KMAX
    3166            0 :         SUMBR = SUMBR + PR(K)*BETA(K)
    3167            0 :         SUMBI = SUMBI + PI(K)*BETA(K)
    3168            0 :    30 CONTINUE
    3169            0 :       ASUMR = ZEROR
    3170            0 :       ASUMI = ZEROI
    3171            0 :       BSUMR = SUMBR
    3172            0 :       BSUMI = SUMBI
    3173            0 :       L1 = 0
    3174            0 :       L2 = 30
    3175            0 :       BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
    3176            0 :       ATOL = TOL
    3177            0 :       PP = 1.0D0
    3178            0 :       IAS = 0
    3179            0 :       IBS = 0
    3180            0 :       IF (RFNU2.LT.TOL) GO TO 110
    3181            0 :       DO 100 IS=2,7
    3182            0 :         ATOL = ATOL/RFNU2
    3183            0 :         PP = PP*RFNU2
    3184            0 :         IF (IAS.EQ.1) GO TO 60
    3185            0 :         SUMAR = ZEROR
    3186            0 :         SUMAI = ZEROI
    3187            0 :         DO 40 K=1,KMAX
    3188            0 :           M = L1 + K
    3189            0 :           SUMAR = SUMAR + PR(K)*ALFA(M)
    3190            0 :           SUMAI = SUMAI + PI(K)*ALFA(M)
    3191            0 :           IF (AP(K).LT.ATOL) GO TO 50
    3192            0 :    40   CONTINUE
    3193              :    50   CONTINUE
    3194            0 :         ASUMR = ASUMR + SUMAR*PP
    3195            0 :         ASUMI = ASUMI + SUMAI*PP
    3196            0 :         IF (PP.LT.TOL) IAS = 1
    3197              :    60   CONTINUE
    3198            0 :         IF (IBS.EQ.1) GO TO 90
    3199              :         SUMBR = ZEROR
    3200              :         SUMBI = ZEROI
    3201            0 :         DO 70 K=1,KMAX
    3202            0 :           M = L2 + K
    3203            0 :           SUMBR = SUMBR + PR(K)*BETA(M)
    3204            0 :           SUMBI = SUMBI + PI(K)*BETA(M)
    3205            0 :           IF (AP(K).LT.ATOL) GO TO 80
    3206            0 :    70   CONTINUE
    3207              :    80   CONTINUE
    3208            0 :         BSUMR = BSUMR + SUMBR*PP
    3209            0 :         BSUMI = BSUMI + SUMBI*PP
    3210            0 :         IF (PP.LT.BTOL) IBS = 1
    3211              :    90   CONTINUE
    3212            0 :         IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 110
    3213            0 :         L1 = L1 + 30
    3214            0 :         L2 = L2 + 30
    3215            0 :   100 CONTINUE
    3216              :   110 CONTINUE
    3217            0 :       ASUMR = ASUMR + CONER
    3218            0 :       PP = RFNU*RFN13
    3219            0 :       BSUMR = BSUMR*PP
    3220            0 :       BSUMI = BSUMI*PP
    3221              :   120 CONTINUE
    3222            0 :       RETURN
    3223              : !C-----------------------------------------------------------------------
    3224              : !C     CABS(W2).GT.0.25D0
    3225              : !C-----------------------------------------------------------------------
    3226              :   130 CONTINUE
    3227            0 :       CALL AZSQRT(W2R, W2I, WR, WI)
    3228            0 :       IF (WR.LT.0.0D0) WR = 0.0D0
    3229            0 :       IF (WI.LT.0.0D0) WI = 0.0D0
    3230            0 :       STR = CONER + WR
    3231            0 :       STI = WI
    3232            0 :       CALL ZDIV(STR, STI, ZBR, ZBI, ZAR, ZAI)
    3233            0 :       CALL AZLOG(ZAR, ZAI, ZCR, ZCI, IDUM)
    3234            0 :       IF (ZCI.LT.0.0D0) ZCI = 0.0D0
    3235            0 :       IF (ZCI.GT.HPI) ZCI = HPI
    3236            0 :       IF (ZCR.LT.0.0D0) ZCR = 0.0D0
    3237            0 :       ZTHR = (ZCR-WR)*1.5D0
    3238            0 :       ZTHI = (ZCI-WI)*1.5D0
    3239            0 :       ZETA1R = ZCR*FNU
    3240            0 :       ZETA1I = ZCI*FNU
    3241            0 :       ZETA2R = WR*FNU
    3242            0 :       ZETA2I = WI*FNU
    3243            0 :       AZTH = AZABS(ZTHR,ZTHI)
    3244            0 :       ANG = THPI
    3245            0 :       IF (ZTHR.GE.0.0D0 .AND. ZTHI.LT.0.0D0) GO TO 140
    3246            0 :       ANG = HPI
    3247            0 :       IF (ZTHR.EQ.0.0D0) GO TO 140
    3248            0 :       ANG = DATAN(ZTHI/ZTHR)
    3249            0 :       IF (ZTHR.LT.0.0D0) ANG = ANG + GPI
    3250              :   140 CONTINUE
    3251            0 :       PP = AZTH**EX2
    3252            0 :       ANG = ANG*EX2
    3253            0 :       ZETAR = PP*DCOS(ANG)
    3254            0 :       ZETAI = PP*DSIN(ANG)
    3255            0 :       IF (ZETAI.LT.0.0D0) ZETAI = 0.0D0
    3256            0 :       ARGR = ZETAR*FN23
    3257            0 :       ARGI = ZETAI*FN23
    3258            0 :       CALL ZDIV(ZTHR, ZTHI, ZETAR, ZETAI, RTZTR, RTZTI)
    3259            0 :       CALL ZDIV(RTZTR, RTZTI, WR, WI, ZAR, ZAI)
    3260            0 :       TZAR = ZAR + ZAR
    3261            0 :       TZAI = ZAI + ZAI
    3262            0 :       CALL AZSQRT(TZAR, TZAI, STR, STI)
    3263            0 :       PHIR = STR*RFN13
    3264            0 :       PHII = STI*RFN13
    3265            0 :       IF (IPMTR.EQ.1) GO TO 120
    3266            0 :       RAW = 1.0D0/DSQRT(AW2)
    3267            0 :       STR = WR*RAW
    3268            0 :       STI = -WI*RAW
    3269            0 :       TFNR = STR*RFNU*RAW
    3270            0 :       TFNI = STI*RFNU*RAW
    3271            0 :       RAZTH = 1.0D0/AZTH
    3272            0 :       STR = ZTHR*RAZTH
    3273            0 :       STI = -ZTHI*RAZTH
    3274            0 :       RZTHR = STR*RAZTH*RFNU
    3275            0 :       RZTHI = STI*RAZTH*RFNU
    3276            0 :       ZCR = RZTHR*AR(2)
    3277            0 :       ZCI = RZTHI*AR(2)
    3278            0 :       RAW2 = 1.0D0/AW2
    3279            0 :       STR = W2R*RAW2
    3280            0 :       STI = -W2I*RAW2
    3281            0 :       T2R = STR*RAW2
    3282            0 :       T2I = STI*RAW2
    3283            0 :       STR = T2R*C(2) + C(3)
    3284            0 :       STI = T2I*C(2)
    3285            0 :       UPR(2) = STR*TFNR - STI*TFNI
    3286            0 :       UPI(2) = STR*TFNI + STI*TFNR
    3287            0 :       BSUMR = UPR(2) + ZCR
    3288            0 :       BSUMI = UPI(2) + ZCI
    3289            0 :       ASUMR = ZEROR
    3290            0 :       ASUMI = ZEROI
    3291            0 :       IF (RFNU.LT.TOL) GO TO 220
    3292            0 :       PRZTHR = RZTHR
    3293            0 :       PRZTHI = RZTHI
    3294            0 :       PTFNR = TFNR
    3295            0 :       PTFNI = TFNI
    3296            0 :       UPR(1) = CONER
    3297            0 :       UPI(1) = CONEI
    3298            0 :       PP = 1.0D0
    3299            0 :       BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
    3300            0 :       KS = 0
    3301            0 :       KP1 = 2
    3302            0 :       L = 3
    3303            0 :       IAS = 0
    3304            0 :       IBS = 0
    3305            0 :       DO 210 LR=2,12,2
    3306            0 :         LRP1 = LR + 1
    3307              : !C-----------------------------------------------------------------------
    3308              : !C     COMPUTE TWO ADDITIONAL CR, DR, AND UP FOR TWO MORE TERMS IN
    3309              : !C     NEXT SUMA AND SUMB
    3310              : !C-----------------------------------------------------------------------
    3311            0 :         DO 160 K=LR,LRP1
    3312            0 :           KS = KS + 1
    3313            0 :           KP1 = KP1 + 1
    3314            0 :           L = L + 1
    3315            0 :           ZAR = C(L)
    3316            0 :           ZAI = ZEROI
    3317            0 :           DO 150 J=2,KP1
    3318            0 :             L = L + 1
    3319            0 :             STR = ZAR*T2R - T2I*ZAI + C(L)
    3320            0 :             ZAI = ZAR*T2I + ZAI*T2R
    3321            0 :             ZAR = STR
    3322            0 :   150     CONTINUE
    3323            0 :           STR = PTFNR*TFNR - PTFNI*TFNI
    3324            0 :           PTFNI = PTFNR*TFNI + PTFNI*TFNR
    3325            0 :           PTFNR = STR
    3326            0 :           UPR(KP1) = PTFNR*ZAR - PTFNI*ZAI
    3327            0 :           UPI(KP1) = PTFNI*ZAR + PTFNR*ZAI
    3328            0 :           CRR(KS) = PRZTHR*BR(KS+1)
    3329            0 :           CRI(KS) = PRZTHI*BR(KS+1)
    3330            0 :           STR = PRZTHR*RZTHR - PRZTHI*RZTHI
    3331            0 :           PRZTHI = PRZTHR*RZTHI + PRZTHI*RZTHR
    3332            0 :           PRZTHR = STR
    3333            0 :           DRR(KS) = PRZTHR*AR(KS+2)
    3334            0 :           DRI(KS) = PRZTHI*AR(KS+2)
    3335            0 :   160   CONTINUE
    3336            0 :         PP = PP*RFNU2
    3337            0 :         IF (IAS.EQ.1) GO TO 180
    3338            0 :         SUMAR = UPR(LRP1)
    3339            0 :         SUMAI = UPI(LRP1)
    3340            0 :         JU = LRP1
    3341            0 :         DO 170 JR=1,LR
    3342            0 :           JU = JU - 1
    3343            0 :           SUMAR = SUMAR + CRR(JR)*UPR(JU) - CRI(JR)*UPI(JU)
    3344            0 :           SUMAI = SUMAI + CRR(JR)*UPI(JU) + CRI(JR)*UPR(JU)
    3345            0 :   170   CONTINUE
    3346            0 :         ASUMR = ASUMR + SUMAR
    3347            0 :         ASUMI = ASUMI + SUMAI
    3348            0 :         TEST = DABS(SUMAR) + DABS(SUMAI)
    3349            0 :         IF (PP.LT.TOL .AND. TEST.LT.TOL) IAS = 1
    3350              :   180   CONTINUE
    3351            0 :         IF (IBS.EQ.1) GO TO 200
    3352            0 :         SUMBR = UPR(LR+2) + UPR(LRP1)*ZCR - UPI(LRP1)*ZCI
    3353            0 :         SUMBI = UPI(LR+2) + UPR(LRP1)*ZCI + UPI(LRP1)*ZCR
    3354            0 :         JU = LRP1
    3355            0 :         DO 190 JR=1,LR
    3356            0 :           JU = JU - 1
    3357            0 :           SUMBR = SUMBR + DRR(JR)*UPR(JU) - DRI(JR)*UPI(JU)
    3358            0 :           SUMBI = SUMBI + DRR(JR)*UPI(JU) + DRI(JR)*UPR(JU)
    3359            0 :   190   CONTINUE
    3360            0 :         BSUMR = BSUMR + SUMBR
    3361            0 :         BSUMI = BSUMI + SUMBI
    3362            0 :         TEST = DABS(SUMBR) + DABS(SUMBI)
    3363            0 :         IF (PP.LT.BTOL .AND. TEST.LT.BTOL) IBS = 1
    3364              :   200   CONTINUE
    3365            0 :         IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 220
    3366            0 :   210 CONTINUE
    3367              :   220 CONTINUE
    3368            0 :       ASUMR = ASUMR + CONER
    3369            0 :       STR = -BSUMR*RFN13
    3370            0 :       STI = -BSUMI*RFN13
    3371            0 :       CALL ZDIV(STR, STI, RTZTR, RTZTI, BSUMR, BSUMI)
    3372            0 :       GO TO 120
    3373              :       END SUBROUTINE ZUNHJ
    3374              : 
    3375            0 :       SUBROUTINE ZMLRI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL)
    3376              : !C***BEGIN PROLOGUE  ZMLRI
    3377              : !C***REFER TO  ZBESI,ZBESK
    3378              : !C
    3379              : !C     ZMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY THE
    3380              : !C     MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
    3381              : !C
    3382              : !C***ROUTINES CALLED  DGAMLN,D1MACH,AZABS,AZEXP,AZLOG,ZMLT
    3383              : !C***END PROLOGUE  ZMLRI
    3384              : !C     COMPLEX CK,CNORM,CONE,CTWO,CZERO,PT,P1,P2,RZ,SUM,Y,Z
    3385              :       DOUBLE PRECISION ACK, AK, AP, AT, AZ, BK, CKI, CKR, CNORMI, &
    3386              :      & CNORMR, CONEI, CONER, FKAP, FKK, FLAM, FNF, FNU, PTI, PTR, P1I, &
    3387              :      & P1R, P2I, P2R, RAZ, RHO, RHO2, RZI, RZR, SCLE, STI, STR, SUMI, &
    3388              :      & SUMR, TFNF, TOL, TST, YI, YR, ZEROI, ZEROR, ZI, ZR!, DGAMLN, &
    3389              :     ! & D1MACH, AZABS
    3390              :       INTEGER I, IAZ, IDUM, IFNU, INU, ITIME, K, KK, KM, KODE, M, N, NZ
    3391              :       DIMENSION YR(N), YI(N)
    3392              :       DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
    3393            0 :       SCLE = D1MACH(1)/TOL
    3394            0 :       NZ=0
    3395            0 :       AZ = AZABS(ZR,ZI)
    3396            0 :       IAZ = INT(SNGL(AZ))
    3397            0 :       IFNU = INT(SNGL(FNU))
    3398            0 :       INU = IFNU + N - 1
    3399            0 :       AT = DBLE(FLOAT(IAZ)) + 1.0D0
    3400            0 :       RAZ = 1.0D0/AZ
    3401            0 :       STR = ZR*RAZ
    3402            0 :       STI = -ZI*RAZ
    3403            0 :       CKR = STR*AT*RAZ
    3404            0 :       CKI = STI*AT*RAZ
    3405            0 :       RZR = (STR+STR)*RAZ
    3406            0 :       RZI = (STI+STI)*RAZ
    3407            0 :       P1R = ZEROR
    3408            0 :       P1I = ZEROI
    3409            0 :       P2R = CONER
    3410            0 :       P2I = CONEI
    3411            0 :       ACK = (AT+1.0D0)*RAZ
    3412            0 :       RHO = ACK + DSQRT(ACK*ACK-1.0D0)
    3413            0 :       RHO2 = RHO*RHO
    3414            0 :       TST = (RHO2+RHO2)/((RHO2-1.0D0)*(RHO-1.0D0))
    3415            0 :       TST = TST/TOL
    3416              : !C-----------------------------------------------------------------------
    3417              : !C     COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
    3418              : !C-----------------------------------------------------------------------
    3419            0 :       AK = AT
    3420            0 :       DO 10 I=1,80
    3421            0 :         PTR = P2R
    3422            0 :         PTI = P2I
    3423            0 :         P2R = P1R - (CKR*PTR-CKI*PTI)
    3424            0 :         P2I = P1I - (CKI*PTR+CKR*PTI)
    3425            0 :         P1R = PTR
    3426            0 :         P1I = PTI
    3427            0 :         CKR = CKR + RZR
    3428            0 :         CKI = CKI + RZI
    3429            0 :         AP = AZABS(P2R,P2I)
    3430            0 :         IF (AP.GT.TST*AK*AK) GO TO 20
    3431            0 :         AK = AK + 1.0D0
    3432            0 :    10 CONTINUE
    3433            0 :       GO TO 110
    3434              :    20 CONTINUE
    3435            0 :       I = I + 1
    3436            0 :       K = 0
    3437            0 :       IF (INU.LT.IAZ) GO TO 40
    3438              : !C-----------------------------------------------------------------------
    3439              : !C     COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
    3440              : !C-----------------------------------------------------------------------
    3441            0 :       P1R = ZEROR
    3442            0 :       P1I = ZEROI
    3443            0 :       P2R = CONER
    3444            0 :       P2I = CONEI
    3445            0 :       AT = DBLE(FLOAT(INU)) + 1.0D0
    3446              :       STR = ZR*RAZ
    3447              :       STI = -ZI*RAZ
    3448            0 :       CKR = STR*AT*RAZ
    3449            0 :       CKI = STI*AT*RAZ
    3450            0 :       ACK = AT*RAZ
    3451            0 :       TST = DSQRT(ACK/TOL)
    3452            0 :       ITIME = 1
    3453            0 :       DO 30 K=1,80
    3454            0 :         PTR = P2R
    3455            0 :         PTI = P2I
    3456            0 :         P2R = P1R - (CKR*PTR-CKI*PTI)
    3457            0 :         P2I = P1I - (CKR*PTI+CKI*PTR)
    3458            0 :         P1R = PTR
    3459            0 :         P1I = PTI
    3460            0 :         CKR = CKR + RZR
    3461            0 :         CKI = CKI + RZI
    3462            0 :         AP = AZABS(P2R,P2I)
    3463            0 :         IF (AP.LT.TST) GO TO 30
    3464            0 :         IF (ITIME.EQ.2) GO TO 40
    3465            0 :         ACK = AZABS(CKR,CKI)
    3466            0 :         FLAM = ACK + DSQRT(ACK*ACK-1.0D0)
    3467            0 :         FKAP = AP/AZABS(P1R,P1I)
    3468            0 :         RHO = DMIN1(FLAM,FKAP)
    3469            0 :         TST = TST*DSQRT(RHO/(RHO*RHO-1.0D0))
    3470            0 :         ITIME = 2
    3471            0 :    30 CONTINUE
    3472            0 :       GO TO 110
    3473              :    40 CONTINUE
    3474              : !C-----------------------------------------------------------------------
    3475              : !C     BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
    3476              : !C-----------------------------------------------------------------------
    3477            0 :       K = K + 1
    3478            0 :       KK = MAX0(I+IAZ,K+INU)
    3479            0 :       FKK = DBLE(FLOAT(KK))
    3480            0 :       P1R = ZEROR
    3481            0 :       P1I = ZEROI
    3482              : !C-----------------------------------------------------------------------
    3483              : !C     SCALE P2 AND SUM BY SCLE
    3484              : !C-----------------------------------------------------------------------
    3485            0 :       P2R = SCLE
    3486            0 :       P2I = ZEROI
    3487            0 :       FNF = FNU - DBLE(FLOAT(IFNU))
    3488            0 :       TFNF = FNF + FNF
    3489              :       BK = DGAMLN(FKK+TFNF+1.0D0,IDUM) - DGAMLN(FKK+1.0D0,IDUM) - &
    3490            0 :      & DGAMLN(TFNF+1.0D0,IDUM)
    3491            0 :       BK = DEXP(BK)
    3492            0 :       SUMR = ZEROR
    3493            0 :       SUMI = ZEROI
    3494            0 :       KM = KK - INU
    3495            0 :       DO 50 I=1,KM
    3496            0 :         PTR = P2R
    3497            0 :         PTI = P2I
    3498            0 :         P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
    3499            0 :         P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
    3500            0 :         P1R = PTR
    3501            0 :         P1I = PTI
    3502            0 :         AK = 1.0D0 - TFNF/(FKK+TFNF)
    3503            0 :         ACK = BK*AK
    3504            0 :         SUMR = SUMR + (ACK+BK)*P1R
    3505            0 :         SUMI = SUMI + (ACK+BK)*P1I
    3506            0 :         BK = ACK
    3507            0 :         FKK = FKK - 1.0D0
    3508            0 :    50 CONTINUE
    3509            0 :       YR(N) = P2R
    3510            0 :       YI(N) = P2I
    3511            0 :       IF (N.EQ.1) GO TO 70
    3512            0 :       DO 60 I=2,N
    3513            0 :         PTR = P2R
    3514            0 :         PTI = P2I
    3515            0 :         P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
    3516            0 :         P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
    3517            0 :         P1R = PTR
    3518            0 :         P1I = PTI
    3519            0 :         AK = 1.0D0 - TFNF/(FKK+TFNF)
    3520            0 :         ACK = BK*AK
    3521            0 :         SUMR = SUMR + (ACK+BK)*P1R
    3522            0 :         SUMI = SUMI + (ACK+BK)*P1I
    3523            0 :         BK = ACK
    3524            0 :         FKK = FKK - 1.0D0
    3525            0 :         M = N - I + 1
    3526            0 :         YR(M) = P2R
    3527            0 :         YI(M) = P2I
    3528            0 :    60 CONTINUE
    3529              :    70 CONTINUE
    3530            0 :       IF (IFNU.LE.0) GO TO 90
    3531            0 :       DO 80 I=1,IFNU
    3532            0 :         PTR = P2R
    3533            0 :         PTI = P2I
    3534            0 :         P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
    3535            0 :         P2I = P1I + (FKK+FNF)*(RZR*PTI+RZI*PTR)
    3536            0 :         P1R = PTR
    3537            0 :         P1I = PTI
    3538            0 :         AK = 1.0D0 - TFNF/(FKK+TFNF)
    3539            0 :         ACK = BK*AK
    3540            0 :         SUMR = SUMR + (ACK+BK)*P1R
    3541            0 :         SUMI = SUMI + (ACK+BK)*P1I
    3542            0 :         BK = ACK
    3543            0 :         FKK = FKK - 1.0D0
    3544            0 :    80 CONTINUE
    3545              :    90 CONTINUE
    3546            0 :       PTR = ZR
    3547            0 :       PTI = ZI
    3548            0 :       IF (KODE.EQ.2) PTR = ZEROR
    3549            0 :       CALL AZLOG(RZR, RZI, STR, STI, IDUM)
    3550            0 :       P1R = -FNF*STR + PTR
    3551            0 :       P1I = -FNF*STI + PTI
    3552            0 :       AP = DGAMLN(1.0D0+FNF,IDUM)
    3553            0 :       PTR = P1R - AP
    3554            0 :       PTI = P1I
    3555              : !C-----------------------------------------------------------------------
    3556              : !C     THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
    3557              : !C     IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
    3558              : !C-----------------------------------------------------------------------
    3559            0 :       P2R = P2R + SUMR
    3560            0 :       P2I = P2I + SUMI
    3561            0 :       AP = AZABS(P2R,P2I)
    3562            0 :       P1R = 1.0D0/AP
    3563            0 :       CALL AZEXP(PTR, PTI, STR, STI)
    3564            0 :       CKR = STR*P1R
    3565            0 :       CKI = STI*P1R
    3566            0 :       PTR = P2R*P1R
    3567            0 :       PTI = -P2I*P1R
    3568            0 :       CALL ZMLT(CKR, CKI, PTR, PTI, CNORMR, CNORMI)
    3569            0 :       DO 100 I=1,N
    3570            0 :         STR = YR(I)*CNORMR - YI(I)*CNORMI
    3571            0 :         YI(I) = YR(I)*CNORMI + YI(I)*CNORMR
    3572            0 :         YR(I) = STR
    3573            0 :   100 CONTINUE
    3574              :       RETURN
    3575              :   110 CONTINUE
    3576            0 :       NZ=-2
    3577            0 :       RETURN
    3578              :       END SUBROUTINE ZMLRI
    3579              : 
    3580            0 :       SUBROUTINE ZWRSK(ZRR, ZRI, FNU, KODE, N, YR, YI, NZ, CWR, CWI, &
    3581              :      & TOL, ELIM, ALIM)
    3582              : !C***BEGIN PROLOGUE  ZWRSK
    3583              : !C***REFER TO  ZBESI,ZBESK
    3584              : !C
    3585              : !C     ZWRSK COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY
    3586              : !C     NORMALIZING THE I FUNCTION RATIOS FROM ZRATI BY THE WRONSKIAN
    3587              : !C
    3588              : !C***ROUTINES CALLED  D1MACH,ZBKNU,ZRATI,AZABS
    3589              : !C***END PROLOGUE  ZWRSK
    3590              : !C     COMPLEX CINU,CSCL,CT,CW,C1,C2,RCT,ST,Y,ZR
    3591              :       DOUBLE PRECISION ACT, ACW, ALIM, ASCLE, CINUI, CINUR, CSCLR, CTI, &
    3592              :      & CTR, CWI, CWR, C1I, C1R, C2I, C2R, ELIM, FNU, PTI, PTR, RACT, &
    3593              :      & STI, STR, TOL, YI, YR, ZRI, ZRR!, AZABS, D1MACH
    3594              :       INTEGER I, KODE, N, NW, NZ
    3595              :       DIMENSION YR(N), YI(N), CWR(2), CWI(2)
    3596              : !C-----------------------------------------------------------------------
    3597              : !C     I(FNU+I-1,Z) BY BACKWARD RECURRENCE FOR RATIOS
    3598              : !C     Y(I)=I(FNU+I,Z)/I(FNU+I-1,Z) FROM CRATI NORMALIZED BY THE
    3599              : !C     WRONSKIAN WITH K(FNU,Z) AND K(FNU+1,Z) FROM CBKNU.
    3600              : !C-----------------------------------------------------------------------
    3601            0 :       NZ = 0
    3602            0 :       CALL ZBKNU(ZRR, ZRI, FNU, KODE, 2, CWR, CWI, NW, TOL, ELIM, ALIM)
    3603            0 :       IF (NW.NE.0) GO TO 50
    3604            0 :       CALL ZRATI(ZRR, ZRI, FNU, N, YR, YI, TOL)
    3605              : !C-----------------------------------------------------------------------
    3606              : !C     RECUR FORWARD ON I(FNU+1,Z) = R(FNU,Z)*I(FNU,Z),
    3607              : !C     R(FNU+J-1,Z)=Y(J),  J=1,...,N
    3608              : !C-----------------------------------------------------------------------
    3609            0 :       CINUR = 1.0D0
    3610            0 :       CINUI = 0.0D0
    3611            0 :       IF (KODE.EQ.1) GO TO 10
    3612            0 :       CINUR = DCOS(ZRI)
    3613            0 :       CINUI = DSIN(ZRI)
    3614              :    10 CONTINUE
    3615              : !C-----------------------------------------------------------------------
    3616              : !C     ON LOW EXPONENT MACHINES THE K FUNCTIONS CAN BE CLOSE TO BOTH
    3617              : !C     THE UNDER AND OVERFLOW LIMITS AND THE NORMALIZATION MUST BE
    3618              : !C     SCALED TO PREVENT OVER OR UNDERFLOW. CUOIK HAS DETERMINED THAT
    3619              : !C     THE RESULT IS ON SCALE.
    3620              : !C-----------------------------------------------------------------------
    3621            0 :       ACW = AZABS(CWR(2),CWI(2))
    3622            0 :       ASCLE = 1.0D+3*D1MACH(1)/TOL
    3623            0 :       CSCLR = 1.0D0
    3624            0 :       IF (ACW.GT.ASCLE) GO TO 20
    3625            0 :       CSCLR = 1.0D0/TOL
    3626            0 :       GO TO 30
    3627              :    20 CONTINUE
    3628            0 :       ASCLE = 1.0D0/ASCLE
    3629            0 :       IF (ACW.LT.ASCLE) GO TO 30
    3630            0 :       CSCLR = TOL
    3631              :    30 CONTINUE
    3632            0 :       C1R = CWR(1)*CSCLR
    3633            0 :       C1I = CWI(1)*CSCLR
    3634            0 :       C2R = CWR(2)*CSCLR
    3635            0 :       C2I = CWI(2)*CSCLR
    3636            0 :       STR = YR(1)
    3637            0 :       STI = YI(1)
    3638              : !C-----------------------------------------------------------------------
    3639              : !C     CINU=CINU*(CONJG(CT)/CABS(CT))*(1.0D0/CABS(CT) PREVENTS
    3640              : !C     UNDER- OR OVERFLOW PREMATURELY BY SQUARING CABS(CT)
    3641              : !C-----------------------------------------------------------------------
    3642            0 :       PTR = STR*C1R - STI*C1I
    3643            0 :       PTI = STR*C1I + STI*C1R
    3644            0 :       PTR = PTR + C2R
    3645            0 :       PTI = PTI + C2I
    3646            0 :       CTR = ZRR*PTR - ZRI*PTI
    3647            0 :       CTI = ZRR*PTI + ZRI*PTR
    3648            0 :       ACT = AZABS(CTR,CTI)
    3649            0 :       RACT = 1.0D0/ACT
    3650            0 :       CTR = CTR*RACT
    3651            0 :       CTI = -CTI*RACT
    3652            0 :       PTR = CINUR*RACT
    3653            0 :       PTI = CINUI*RACT
    3654            0 :       CINUR = PTR*CTR - PTI*CTI
    3655            0 :       CINUI = PTR*CTI + PTI*CTR
    3656            0 :       YR(1) = CINUR*CSCLR
    3657            0 :       YI(1) = CINUI*CSCLR
    3658            0 :       IF (N.EQ.1) RETURN
    3659            0 :       DO 40 I=2,N
    3660            0 :         PTR = STR*CINUR - STI*CINUI
    3661            0 :         CINUI = STR*CINUI + STI*CINUR
    3662            0 :         CINUR = PTR
    3663            0 :         STR = YR(I)
    3664            0 :         STI = YI(I)
    3665            0 :         YR(I) = CINUR*CSCLR
    3666            0 :         YI(I) = CINUI*CSCLR
    3667            0 :    40 CONTINUE
    3668            0 :       RETURN
    3669              :    50 CONTINUE
    3670            0 :       NZ = -1
    3671            0 :       IF(NW.EQ.(-2)) NZ=-2
    3672              :       RETURN
    3673              :       END SUBROUTINE ZWRSK
    3674              : 
    3675            0 :       SUBROUTINE ZBKNU(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, &
    3676              :      & ALIM)
    3677              : !C***BEGIN PROLOGUE  ZBKNU
    3678              : !C***REFER TO  ZBESI,ZBESK,ZAIRY,ZBESH
    3679              : !C
    3680              : !C     ZBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE.
    3681              : !C
    3682              : !C***ROUTINES CALLED  DGAMLN,I1MACH,D1MACH,ZKSCL,ZSHCH,ZUCHK,AZABS,ZDIV,
    3683              : !C                    AZEXP,AZLOG,ZMLT,AZSQRT
    3684              : !C***END PROLOGUE  ZBKNU
    3685              : !C
    3686              :       DOUBLE PRECISION AA, AK, ALIM, ASCLE, A1, A2, BB, BK, BRY, CAZ, &
    3687              :      & CBI, CBR, CC, CCHI, CCHR, CKI, CKR, COEFI, COEFR, CONEI, CONER, &
    3688              :      & CRSCR, CSCLR, CSHI, CSHR, CSI, CSR, CSRR, CSSR, CTWOR, &
    3689              :      & CZEROI, CZEROR, CZI, CZR, DNU, DNU2, DPI, ELIM, ETEST, FC, FHS, &
    3690              :      & FI, FK, FKS, FMUI, FMUR, FNU, FPI, FR, G1, G2, HPI, PI, PR, PTI, &
    3691              :      & PTR, P1I, P1R, P2I, P2M, P2R, QI, QR, RAK, RCAZ, RTHPI, RZI, &
    3692              :      & RZR, R1, S, SMUI, SMUR, SPI, STI, STR, S1I, S1R, S2I, S2R, TM, &
    3693              :      & TOL, TTH, T1, T2, YI, YR, ZI, ZR, ELM, & ! , DGAMLN, D1MACH, AZABS,
    3694              :      & CELMR, ZDR, ZDI, AS, ALAS, HELIM, CYR, CYI
    3695              :       INTEGER I, IFLAG, INU, K, KFLAG, KK, KMAX, KODE, KODED, N, NZ, &
    3696              :      & IDUM, J, IC, INUB, NW !I1MACH
    3697              :       DIMENSION YR(N), YI(N), CC(8), CSSR(3), CSRR(3), BRY(3), CYR(2), &
    3698              :      & CYI(2)
    3699              : !C     COMPLEX Z,Y,A,B,RZ,SMU,FU,FMU,F,FLRZ,CZ,S1,S2,CSH,CCH
    3700              : !C     COMPLEX CK,P,Q,COEF,P1,P2,CBK,PT,CZERO,CONE,CTWO,ST,EZ,CS,DK
    3701              : !C
    3702              :       DATA KMAX / 30 /
    3703              :       DATA CZEROR,CZEROI,CONER,CONEI,CTWOR,R1/   &
    3704              :      &  0.0D0 , 0.0D0 , 1.0D0 , 0.0D0 , 2.0D0 , 2.0D0 /
    3705              :       DATA DPI, RTHPI, SPI ,HPI, FPI, TTH / &
    3706              :      &     3.14159265358979324D0,       1.25331413731550025D0, &
    3707              :      &     1.90985931710274403D0,       1.57079632679489662D0, &
    3708              :      &     1.89769999331517738D0,       6.66666666666666666D-01/
    3709              :       DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)/ &
    3710              :      &     5.77215664901532861D-01,    -4.20026350340952355D-02, &
    3711              :      &    -4.21977345555443367D-02,     7.21894324666309954D-03, &
    3712              :      &    -2.15241674114950973D-04,    -2.01348547807882387D-05, &
    3713              :      &     1.13302723198169588D-06,     6.11609510448141582D-09/
    3714              : !C
    3715            0 :       CAZ = AZABS(ZR,ZI)
    3716            0 :       CSCLR = 1.0D0/TOL
    3717            0 :       CRSCR = TOL
    3718            0 :       CSSR(1) = CSCLR
    3719            0 :       CSSR(2) = 1.0D0
    3720            0 :       CSSR(3) = CRSCR
    3721            0 :       CSRR(1) = CRSCR
    3722            0 :       CSRR(2) = 1.0D0
    3723            0 :       CSRR(3) = CSCLR
    3724            0 :       BRY(1) = 1.0D+3*D1MACH(1)/TOL
    3725            0 :       BRY(2) = 1.0D0/BRY(1)
    3726            0 :       BRY(3) = D1MACH(2)
    3727            0 :       NZ = 0
    3728            0 :       IFLAG = 0
    3729            0 :       KODED = KODE
    3730            0 :       RCAZ = 1.0D0/CAZ
    3731            0 :       STR = ZR*RCAZ
    3732            0 :       STI = -ZI*RCAZ
    3733            0 :       RZR = (STR+STR)*RCAZ
    3734            0 :       RZI = (STI+STI)*RCAZ
    3735            0 :       INU = INT(SNGL(FNU+0.5D0))
    3736            0 :       DNU = FNU - DBLE(FLOAT(INU))
    3737            0 :       IF (DABS(DNU).EQ.0.5D0) GO TO 110
    3738            0 :       DNU2 = 0.0D0
    3739            0 :       IF (DABS(DNU).GT.TOL) DNU2 = DNU*DNU
    3740            0 :       IF (CAZ.GT.R1) GO TO 110
    3741              : !C-----------------------------------------------------------------------
    3742              : !C     SERIES FOR CABS(Z).LE.R1
    3743              : !C-----------------------------------------------------------------------
    3744            0 :       FC = 1.0D0
    3745            0 :       CALL AZLOG(RZR, RZI, SMUR, SMUI, IDUM)
    3746            0 :       FMUR = SMUR*DNU
    3747            0 :       FMUI = SMUI*DNU
    3748            0 :       CALL ZSHCH(FMUR, FMUI, CSHR, CSHI, CCHR, CCHI)
    3749            0 :       IF (DNU.EQ.0.0D0) GO TO 10
    3750            0 :       FC = DNU*DPI
    3751            0 :       FC = FC/DSIN(FC)
    3752            0 :       SMUR = CSHR/DNU
    3753            0 :       SMUI = CSHI/DNU
    3754              :    10 CONTINUE
    3755            0 :       A2 = 1.0D0 + DNU
    3756              : !C-----------------------------------------------------------------------
    3757              : !C     GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
    3758              : !C-----------------------------------------------------------------------
    3759            0 :       T2 = DEXP(-DGAMLN(A2,IDUM))
    3760            0 :       T1 = 1.0D0/(T2*FC)
    3761            0 :       IF (DABS(DNU).GT.0.1D0) GO TO 40
    3762              : !C-----------------------------------------------------------------------
    3763              : !C     SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
    3764              : !C-----------------------------------------------------------------------
    3765            0 :       AK = 1.0D0
    3766            0 :       S = CC(1)
    3767            0 :       DO 20 K=2,8
    3768            0 :         AK = AK*DNU2
    3769            0 :         TM = CC(K)*AK
    3770            0 :         S = S + TM
    3771            0 :         IF (DABS(TM).LT.TOL) GO TO 30
    3772            0 :    20 CONTINUE
    3773            0 :    30 G1 = -S
    3774            0 :       GO TO 50
    3775              :    40 CONTINUE
    3776            0 :       G1 = (T1-T2)/(DNU+DNU)
    3777              :    50 CONTINUE
    3778            0 :       G2 = (T1+T2)*0.5D0
    3779            0 :       FR = FC*(CCHR*G1+SMUR*G2)
    3780            0 :       FI = FC*(CCHI*G1+SMUI*G2)
    3781            0 :       CALL AZEXP(FMUR, FMUI, STR, STI)
    3782            0 :       PR = 0.5D0*STR/T2
    3783            0 :       PI = 0.5D0*STI/T2
    3784            0 :       CALL ZDIV(0.5D0, 0.0D0, STR, STI, PTR, PTI)
    3785            0 :       QR = PTR/T1
    3786            0 :       QI = PTI/T1
    3787            0 :       S1R = FR
    3788            0 :       S1I = FI
    3789            0 :       S2R = PR
    3790            0 :       S2I = PI
    3791            0 :       AK = 1.0D0
    3792            0 :       A1 = 1.0D0
    3793            0 :       CKR = CONER
    3794            0 :       CKI = CONEI
    3795            0 :       BK = 1.0D0 - DNU2
    3796            0 :       IF (INU.GT.0 .OR. N.GT.1) GO TO 80
    3797              : !C-----------------------------------------------------------------------
    3798              : !C     GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
    3799              : !C-----------------------------------------------------------------------
    3800            0 :       IF (CAZ.LT.TOL) GO TO 70
    3801            0 :       CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
    3802            0 :       CZR = 0.25D0*CZR
    3803            0 :       CZI = 0.25D0*CZI
    3804            0 :       T1 = 0.25D0*CAZ*CAZ
    3805              :    60 CONTINUE
    3806            0 :       FR = (FR*AK+PR+QR)/BK
    3807            0 :       FI = (FI*AK+PI+QI)/BK
    3808            0 :       STR = 1.0D0/(AK-DNU)
    3809            0 :       PR = PR*STR
    3810            0 :       PI = PI*STR
    3811            0 :       STR = 1.0D0/(AK+DNU)
    3812            0 :       QR = QR*STR
    3813            0 :       QI = QI*STR
    3814            0 :       STR = CKR*CZR - CKI*CZI
    3815            0 :       RAK = 1.0D0/AK
    3816            0 :       CKI = (CKR*CZI+CKI*CZR)*RAK
    3817            0 :       CKR = STR*RAK
    3818            0 :       S1R = CKR*FR - CKI*FI + S1R
    3819            0 :       S1I = CKR*FI + CKI*FR + S1I
    3820            0 :       A1 = A1*T1*RAK
    3821            0 :       BK = BK + AK + AK + 1.0D0
    3822            0 :       AK = AK + 1.0D0
    3823            0 :       IF (A1.GT.TOL) GO TO 60
    3824              :    70 CONTINUE
    3825            0 :       YR(1) = S1R
    3826            0 :       YI(1) = S1I
    3827            0 :       IF (KODED.EQ.1) RETURN
    3828            0 :       CALL AZEXP(ZR, ZI, STR, STI)
    3829            0 :       CALL ZMLT(S1R, S1I, STR, STI, YR(1), YI(1))
    3830            0 :       RETURN
    3831              : !C-----------------------------------------------------------------------
    3832              : !C     GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
    3833              : !C-----------------------------------------------------------------------
    3834              :    80 CONTINUE
    3835            0 :       IF (CAZ.LT.TOL) GO TO 100
    3836            0 :       CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
    3837            0 :       CZR = 0.25D0*CZR
    3838            0 :       CZI = 0.25D0*CZI
    3839            0 :       T1 = 0.25D0*CAZ*CAZ
    3840              :    90 CONTINUE
    3841            0 :       FR = (FR*AK+PR+QR)/BK
    3842            0 :       FI = (FI*AK+PI+QI)/BK
    3843            0 :       STR = 1.0D0/(AK-DNU)
    3844            0 :       PR = PR*STR
    3845            0 :       PI = PI*STR
    3846            0 :       STR = 1.0D0/(AK+DNU)
    3847            0 :       QR = QR*STR
    3848            0 :       QI = QI*STR
    3849            0 :       STR = CKR*CZR - CKI*CZI
    3850            0 :       RAK = 1.0D0/AK
    3851            0 :       CKI = (CKR*CZI+CKI*CZR)*RAK
    3852            0 :       CKR = STR*RAK
    3853            0 :       S1R = CKR*FR - CKI*FI + S1R
    3854            0 :       S1I = CKR*FI + CKI*FR + S1I
    3855            0 :       STR = PR - FR*AK
    3856            0 :       STI = PI - FI*AK
    3857            0 :       S2R = CKR*STR - CKI*STI + S2R
    3858            0 :       S2I = CKR*STI + CKI*STR + S2I
    3859            0 :       A1 = A1*T1*RAK
    3860            0 :       BK = BK + AK + AK + 1.0D0
    3861            0 :       AK = AK + 1.0D0
    3862            0 :       IF (A1.GT.TOL) GO TO 90
    3863              :   100 CONTINUE
    3864            0 :       KFLAG = 2
    3865            0 :       A1 = FNU + 1.0D0
    3866            0 :       AK = A1*DABS(SMUR)
    3867            0 :       IF (AK.GT.ALIM) KFLAG = 3
    3868            0 :       STR = CSSR(KFLAG)
    3869            0 :       P2R = S2R*STR
    3870            0 :       P2I = S2I*STR
    3871            0 :       CALL ZMLT(P2R, P2I, RZR, RZI, S2R, S2I)
    3872            0 :       S1R = S1R*STR
    3873            0 :       S1I = S1I*STR
    3874            0 :       IF (KODED.EQ.1) GO TO 210
    3875            0 :       CALL AZEXP(ZR, ZI, FR, FI)
    3876            0 :       CALL ZMLT(S1R, S1I, FR, FI, S1R, S1I)
    3877            0 :       CALL ZMLT(S2R, S2I, FR, FI, S2R, S2I)
    3878            0 :       GO TO 210
    3879              : !C-----------------------------------------------------------------------
    3880              : !C     IFLAG=0 MEANS NO UNDERFLOW OCCURRED
    3881              : !C     IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
    3882              : !C     KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
    3883              : !C     RECURSION
    3884              : !C-----------------------------------------------------------------------
    3885              :   110 CONTINUE
    3886            0 :       CALL AZSQRT(ZR, ZI, STR, STI)
    3887            0 :       CALL ZDIV(RTHPI, CZEROI, STR, STI, COEFR, COEFI)
    3888            0 :       KFLAG = 2
    3889            0 :       IF (KODED.EQ.2) GO TO 120
    3890            0 :       IF (ZR.GT.ALIM) GO TO 290
    3891              : !C     BLANK LINE
    3892            0 :       STR = DEXP(-ZR)*CSSR(KFLAG)
    3893            0 :       STI = -STR*DSIN(ZI)
    3894            0 :       STR = STR*DCOS(ZI)
    3895            0 :       CALL ZMLT(COEFR, COEFI, STR, STI, COEFR, COEFI)
    3896              :   120 CONTINUE
    3897            0 :       IF (DABS(DNU).EQ.0.5D0) GO TO 300
    3898              : !C-----------------------------------------------------------------------
    3899              : !C     MILLER ALGORITHM FOR CABS(Z).GT.R1
    3900              : !C-----------------------------------------------------------------------
    3901            0 :       AK = DCOS(DPI*DNU)
    3902            0 :       AK = DABS(AK)
    3903            0 :       IF (AK.EQ.CZEROR) GO TO 300
    3904            0 :       FHS = DABS(0.25D0-DNU2)
    3905            0 :       IF (FHS.EQ.CZEROR) GO TO 300
    3906              : !C-----------------------------------------------------------------------
    3907              : !C     COMPUTE R2=F(E). IF CABS(Z).GE.R2, USE FORWARD RECURRENCE TO
    3908              : !C     DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
    3909              : !C     12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
    3910              : !C     TOL WHERE B IS THE BASE OF THE ARITHMETIC.
    3911              : !C-----------------------------------------------------------------------
    3912            0 :       T1 = DBLE(FLOAT(I1MACH(14)-1))
    3913            0 :       T1 = T1*D1MACH(5)*3.321928094D0
    3914            0 :       T1 = DMAX1(T1,12.0D0)
    3915            0 :       T1 = DMIN1(T1,60.0D0)
    3916            0 :       T2 = TTH*T1 - 6.0D0
    3917            0 :       IF (ZR.NE.0.0D0) GO TO 130
    3918            0 :       T1 = HPI
    3919            0 :       GO TO 140
    3920              :   130 CONTINUE
    3921            0 :       T1 = DATAN(ZI/ZR)
    3922            0 :       T1 = DABS(T1)
    3923              :   140 CONTINUE
    3924            0 :       IF (T2.GT.CAZ) GO TO 170
    3925              : !C-----------------------------------------------------------------------
    3926              : !C     FORWARD RECURRENCE LOOP WHEN CABS(Z).GE.R2
    3927              : !C-----------------------------------------------------------------------
    3928            0 :       ETEST = AK/(DPI*CAZ*TOL)
    3929            0 :       FK = CONER
    3930            0 :       IF (ETEST.LT.CONER) GO TO 180
    3931            0 :       FKS = CTWOR
    3932            0 :       CKR = CAZ + CAZ + CTWOR
    3933            0 :       P1R = CZEROR
    3934            0 :       P2R = CONER
    3935            0 :       DO 150 I=1,KMAX
    3936            0 :         AK = FHS/FKS
    3937            0 :         CBR = CKR/(FK+CONER)
    3938            0 :         PTR = P2R
    3939            0 :         P2R = CBR*P2R - P1R*AK
    3940            0 :         P1R = PTR
    3941            0 :         CKR = CKR + CTWOR
    3942            0 :         FKS = FKS + FK + FK + CTWOR
    3943            0 :         FHS = FHS + FK + FK
    3944            0 :         FK = FK + CONER
    3945            0 :         STR = DABS(P2R)*FK
    3946            0 :         IF (ETEST.LT.STR) GO TO 160
    3947            0 :   150 CONTINUE
    3948            0 :       GO TO 310
    3949              :   160 CONTINUE
    3950            0 :       FK = FK + SPI*T1*DSQRT(T2/CAZ)
    3951            0 :       FHS = DABS(0.25D0-DNU2)
    3952            0 :       GO TO 180
    3953              :   170 CONTINUE
    3954              : !C-----------------------------------------------------------------------
    3955              : !C     COMPUTE BACKWARD INDEX K FOR CABS(Z).LT.R2
    3956              : !C-----------------------------------------------------------------------
    3957            0 :       A2 = DSQRT(CAZ)
    3958            0 :       AK = FPI*AK/(TOL*DSQRT(A2))
    3959            0 :       AA = 3.0D0*T1/(1.0D0+CAZ)
    3960            0 :       BB = 14.7D0*T1/(28.0D0+CAZ)
    3961            0 :       AK = (DLOG(AK)+CAZ*DCOS(AA)/(1.0D0+0.008D0*CAZ))/DCOS(BB)
    3962            0 :       FK = 0.12125D0*AK*AK/CAZ + 1.5D0
    3963              :   180 CONTINUE
    3964              : !C-----------------------------------------------------------------------
    3965              : !C     BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
    3966              : !C-----------------------------------------------------------------------
    3967            0 :       K = INT(SNGL(FK))
    3968            0 :       FK = DBLE(FLOAT(K))
    3969            0 :       FKS = FK*FK
    3970            0 :       P1R = CZEROR
    3971            0 :       P1I = CZEROI
    3972            0 :       P2R = TOL
    3973            0 :       P2I = CZEROI
    3974            0 :       CSR = P2R
    3975            0 :       CSI = P2I
    3976            0 :       DO 190 I=1,K
    3977            0 :         A1 = FKS - FK
    3978            0 :         AK = (FKS+FK)/(A1+FHS)
    3979            0 :         RAK = 2.0D0/(FK+CONER)
    3980            0 :         CBR = (FK+ZR)*RAK
    3981            0 :         CBI = ZI*RAK
    3982            0 :         PTR = P2R
    3983            0 :         PTI = P2I
    3984            0 :         P2R = (PTR*CBR-PTI*CBI-P1R)*AK
    3985            0 :         P2I = (PTI*CBR+PTR*CBI-P1I)*AK
    3986            0 :         P1R = PTR
    3987            0 :         P1I = PTI
    3988            0 :         CSR = CSR + P2R
    3989            0 :         CSI = CSI + P2I
    3990            0 :         FKS = A1 - FK + CONER
    3991            0 :         FK = FK - CONER
    3992            0 :   190 CONTINUE
    3993              : !C-----------------------------------------------------------------------
    3994              : !C     COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
    3995              : !C     SCALING
    3996              : !C-----------------------------------------------------------------------
    3997            0 :       TM = AZABS(CSR,CSI)
    3998            0 :       PTR = 1.0D0/TM
    3999            0 :       S1R = P2R*PTR
    4000            0 :       S1I = P2I*PTR
    4001            0 :       CSR = CSR*PTR
    4002            0 :       CSI = -CSI*PTR
    4003            0 :       CALL ZMLT(COEFR, COEFI, S1R, S1I, STR, STI)
    4004            0 :       CALL ZMLT(STR, STI, CSR, CSI, S1R, S1I)
    4005            0 :       IF (INU.GT.0 .OR. N.GT.1) GO TO 200
    4006            0 :       ZDR = ZR
    4007            0 :       ZDI = ZI
    4008            0 :       IF(IFLAG.EQ.1) GO TO 270
    4009            0 :       GO TO 240
    4010              :   200 CONTINUE
    4011              : !C-----------------------------------------------------------------------
    4012              : !C     COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
    4013              : !C-----------------------------------------------------------------------
    4014            0 :       TM = AZABS(P2R,P2I)
    4015            0 :       PTR = 1.0D0/TM
    4016            0 :       P1R = P1R*PTR
    4017            0 :       P1I = P1I*PTR
    4018            0 :       P2R = P2R*PTR
    4019            0 :       P2I = -P2I*PTR
    4020            0 :       CALL ZMLT(P1R, P1I, P2R, P2I, PTR, PTI)
    4021            0 :       STR = DNU + 0.5D0 - PTR
    4022            0 :       STI = -PTI
    4023            0 :       CALL ZDIV(STR, STI, ZR, ZI, STR, STI)
    4024            0 :       STR = STR + 1.0D0
    4025            0 :       CALL ZMLT(STR, STI, S1R, S1I, S2R, S2I)
    4026              : !C-----------------------------------------------------------------------
    4027              : !C     FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
    4028              : !C     SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
    4029              : !C-----------------------------------------------------------------------
    4030              :   210 CONTINUE
    4031            0 :       STR = DNU + 1.0D0
    4032            0 :       CKR = STR*RZR
    4033            0 :       CKI = STR*RZI
    4034            0 :       IF (N.EQ.1) INU = INU - 1
    4035            0 :       IF (INU.GT.0) GO TO 220
    4036            0 :       IF (N.GT.1) GO TO 215
    4037            0 :       S1R = S2R
    4038            0 :       S1I = S2I
    4039              :   215 CONTINUE
    4040            0 :       ZDR = ZR
    4041            0 :       ZDI = ZI
    4042            0 :       IF(IFLAG.EQ.1) GO TO 270
    4043            0 :       GO TO 240
    4044              :   220 CONTINUE
    4045            0 :       INUB = 1
    4046            0 :       IF(IFLAG.EQ.1) GO TO 261
    4047              :   225 CONTINUE
    4048            0 :       P1R = CSRR(KFLAG)
    4049            0 :       ASCLE = BRY(KFLAG)
    4050            0 :       DO 230 I=INUB,INU
    4051            0 :         STR = S2R
    4052            0 :         STI = S2I
    4053            0 :         S2R = CKR*STR - CKI*STI + S1R
    4054            0 :         S2I = CKR*STI + CKI*STR + S1I
    4055            0 :         S1R = STR
    4056            0 :         S1I = STI
    4057            0 :         CKR = CKR + RZR
    4058            0 :         CKI = CKI + RZI
    4059            0 :         IF (KFLAG.GE.3) GO TO 230
    4060            0 :         P2R = S2R*P1R
    4061            0 :         P2I = S2I*P1R
    4062            0 :         STR = DABS(P2R)
    4063            0 :         STI = DABS(P2I)
    4064            0 :         P2M = DMAX1(STR,STI)
    4065            0 :         IF (P2M.LE.ASCLE) GO TO 230
    4066            0 :         KFLAG = KFLAG + 1
    4067            0 :         ASCLE = BRY(KFLAG)
    4068            0 :         S1R = S1R*P1R
    4069            0 :         S1I = S1I*P1R
    4070              :         S2R = P2R
    4071              :         S2I = P2I
    4072            0 :         STR = CSSR(KFLAG)
    4073            0 :         S1R = S1R*STR
    4074            0 :         S1I = S1I*STR
    4075            0 :         S2R = S2R*STR
    4076            0 :         S2I = S2I*STR
    4077            0 :         P1R = CSRR(KFLAG)
    4078            0 :   230 CONTINUE
    4079            0 :       IF (N.NE.1) GO TO 240
    4080            0 :       S1R = S2R
    4081            0 :       S1I = S2I
    4082              :   240 CONTINUE
    4083            0 :       STR = CSRR(KFLAG)
    4084            0 :       YR(1) = S1R*STR
    4085            0 :       YI(1) = S1I*STR
    4086            0 :       IF (N.EQ.1) RETURN
    4087            0 :       YR(2) = S2R*STR
    4088            0 :       YI(2) = S2I*STR
    4089            0 :       IF (N.EQ.2) RETURN
    4090              :       KK = 2
    4091              :   250 CONTINUE
    4092            0 :       KK = KK + 1
    4093            0 :       IF (KK.GT.N) RETURN
    4094            0 :       P1R = CSRR(KFLAG)
    4095            0 :       ASCLE = BRY(KFLAG)
    4096            0 :       DO 260 I=KK,N
    4097            0 :         P2R = S2R
    4098            0 :         P2I = S2I
    4099            0 :         S2R = CKR*P2R - CKI*P2I + S1R
    4100            0 :         S2I = CKI*P2R + CKR*P2I + S1I
    4101            0 :         S1R = P2R
    4102            0 :         S1I = P2I
    4103            0 :         CKR = CKR + RZR
    4104            0 :         CKI = CKI + RZI
    4105            0 :         P2R = S2R*P1R
    4106            0 :         P2I = S2I*P1R
    4107            0 :         YR(I) = P2R
    4108            0 :         YI(I) = P2I
    4109            0 :         IF (KFLAG.GE.3) GO TO 260
    4110            0 :         STR = DABS(P2R)
    4111            0 :         STI = DABS(P2I)
    4112            0 :         P2M = DMAX1(STR,STI)
    4113            0 :         IF (P2M.LE.ASCLE) GO TO 260
    4114            0 :         KFLAG = KFLAG + 1
    4115            0 :         ASCLE = BRY(KFLAG)
    4116            0 :         S1R = S1R*P1R
    4117            0 :         S1I = S1I*P1R
    4118              :         S2R = P2R
    4119              :         S2I = P2I
    4120            0 :         STR = CSSR(KFLAG)
    4121            0 :         S1R = S1R*STR
    4122            0 :         S1I = S1I*STR
    4123            0 :         S2R = S2R*STR
    4124            0 :         S2I = S2I*STR
    4125            0 :         P1R = CSRR(KFLAG)
    4126            0 :   260 CONTINUE
    4127            0 :       RETURN
    4128              : !C-----------------------------------------------------------------------
    4129              : !C     IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
    4130              : !C-----------------------------------------------------------------------
    4131              :   261 CONTINUE
    4132            0 :       HELIM = 0.5D0*ELIM
    4133            0 :       ELM = DEXP(-ELIM)
    4134            0 :       CELMR = ELM
    4135            0 :       ASCLE = BRY(1)
    4136            0 :       ZDR = ZR
    4137            0 :       ZDI = ZI
    4138            0 :       IC = -1
    4139            0 :       J = 2
    4140            0 :       DO 262 I=1,INU
    4141            0 :         STR = S2R
    4142            0 :         STI = S2I
    4143            0 :         S2R = STR*CKR-STI*CKI+S1R
    4144            0 :         S2I = STI*CKR+STR*CKI+S1I
    4145            0 :         S1R = STR
    4146            0 :         S1I = STI
    4147            0 :         CKR = CKR+RZR
    4148            0 :         CKI = CKI+RZI
    4149            0 :         AS = AZABS(S2R,S2I)
    4150            0 :         ALAS = DLOG(AS)
    4151            0 :         P2R = -ZDR+ALAS
    4152            0 :         IF(P2R.LT.(-ELIM)) GO TO 263
    4153            0 :         CALL AZLOG(S2R,S2I,STR,STI,IDUM)
    4154            0 :         P2R = -ZDR+STR
    4155            0 :         P2I = -ZDI+STI
    4156            0 :         P2M = DEXP(P2R)/TOL
    4157            0 :         P1R = P2M*DCOS(P2I)
    4158            0 :         P1I = P2M*DSIN(P2I)
    4159            0 :         CALL ZUCHK(P1R,P1I,NW,ASCLE,TOL)
    4160              :         IF(NW.NE.0) GO TO 263
    4161            0 :         J = 3 - J
    4162            0 :         CYR(J) = P1R
    4163            0 :         CYI(J) = P1I
    4164            0 :         IF(IC.EQ.(I-1)) GO TO 264
    4165              :         IC = I
    4166            0 :         GO TO 262
    4167              :   263   CONTINUE
    4168            0 :         IF(ALAS.LT.HELIM) GO TO 262
    4169            0 :         ZDR = ZDR-ELIM
    4170            0 :         S1R = S1R*CELMR
    4171            0 :         S1I = S1I*CELMR
    4172            0 :         S2R = S2R*CELMR
    4173            0 :         S2I = S2I*CELMR
    4174            0 :   262 CONTINUE
    4175            0 :       IF(N.NE.1) GO TO 270
    4176            0 :       S1R = S2R
    4177            0 :       S1I = S2I
    4178            0 :       GO TO 270
    4179              :   264 CONTINUE
    4180            0 :       KFLAG = 1
    4181            0 :       INUB = I+1
    4182            0 :       S2R = CYR(J)
    4183            0 :       S2I = CYI(J)
    4184            0 :       J = 3 - J
    4185            0 :       S1R = CYR(J)
    4186            0 :       S1I = CYI(J)
    4187            0 :       IF(INUB.LE.INU) GO TO 225
    4188            0 :       IF(N.NE.1) GO TO 240
    4189            0 :       S1R = S2R
    4190            0 :       S1I = S2I
    4191            0 :       GO TO 240
    4192              :   270 CONTINUE
    4193            0 :       YR(1) = S1R
    4194            0 :       YI(1) = S1I
    4195            0 :       IF(N.EQ.1) GO TO 280
    4196            0 :       YR(2) = S2R
    4197            0 :       YI(2) = S2I
    4198              :   280 CONTINUE
    4199            0 :       ASCLE = BRY(1)
    4200            0 :       CALL ZKSCL(ZDR,ZDI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
    4201            0 :       INU = N - NZ
    4202            0 :       IF (INU.LE.0) RETURN
    4203            0 :       KK = NZ + 1
    4204            0 :       S1R = YR(KK)
    4205            0 :       S1I = YI(KK)
    4206            0 :       YR(KK) = S1R*CSRR(1)
    4207            0 :       YI(KK) = S1I*CSRR(1)
    4208            0 :       IF (INU.EQ.1) RETURN
    4209            0 :       KK = NZ + 2
    4210            0 :       S2R = YR(KK)
    4211            0 :       S2I = YI(KK)
    4212            0 :       YR(KK) = S2R*CSRR(1)
    4213            0 :       YI(KK) = S2I*CSRR(1)
    4214            0 :       IF (INU.EQ.2) RETURN
    4215            0 :       T2 = FNU + DBLE(FLOAT(KK-1))
    4216            0 :       CKR = T2*RZR
    4217            0 :       CKI = T2*RZI
    4218            0 :       KFLAG = 1
    4219            0 :       GO TO 250
    4220              :   290 CONTINUE
    4221              : !C-----------------------------------------------------------------------
    4222              : !C     SCALE BY DEXP(Z), IFLAG = 1 CASES
    4223              : !C-----------------------------------------------------------------------
    4224            0 :       KODED = 2
    4225              :       IFLAG = 1
    4226              :       KFLAG = 2
    4227            0 :       GO TO 120
    4228              : !C-----------------------------------------------------------------------
    4229              : !C     FNU=HALF ODD INTEGER CASE, DNU=-0.5
    4230              : !C-----------------------------------------------------------------------
    4231              :   300 CONTINUE
    4232            0 :       S1R = COEFR
    4233            0 :       S1I = COEFI
    4234            0 :       S2R = COEFR
    4235            0 :       S2I = COEFI
    4236            0 :       GO TO 210
    4237              : !C
    4238              : !C
    4239              :   310 CONTINUE
    4240            0 :       NZ=-2
    4241            0 :       RETURN
    4242              :       END SUBROUTINE ZBKNU
    4243              : 
    4244            0 :       SUBROUTINE ZRATI(ZR, ZI, FNU, N, CYR, CYI, TOL)
    4245              : !C***BEGIN PROLOGUE  ZRATI
    4246              : !C***REFER TO  ZBESI,ZBESK,ZBESH
    4247              : !C
    4248              : !C     ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD
    4249              : !C     RECURRENCE.  THE STARTING INDEX IS DETERMINED BY FORWARD
    4250              : !C     RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B,
    4251              : !C     MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973,
    4252              : !C     BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER,
    4253              : !C     BY D. J. SOOKNE.
    4254              : !C
    4255              : !C***ROUTINES CALLED  AZABS,ZDIV
    4256              : !C***END PROLOGUE  ZRATI
    4257              : !C     COMPLEX Z,CY(1),CONE,CZERO,P1,P2,T1,RZ,PT,CDFNU
    4258              :       DOUBLE PRECISION AK, AMAGZ, AP1, AP2, ARG, AZ, CDFNUI, CDFNUR, &
    4259              :      & CONEI, CONER, CYI, CYR, CZEROI, CZEROR, DFNU, FDNU, FLAM, FNU, &
    4260              :      & FNUP, PTI, PTR, P1I, P1R, P2I, P2R, RAK, RAP1, RHO, RT2, RZI, &
    4261              :      & RZR, TEST, TEST1, TOL, TTI, TTR, T1I, T1R, ZI, ZR!, AZABS
    4262              :       INTEGER I, ID, IDNU, INU, ITIME, K, KK, MAGZ, N
    4263              :       DIMENSION CYR(N), CYI(N)
    4264              :       DATA CZEROR,CZEROI,CONER,CONEI,RT2/ &
    4265              :      & 0.0D0, 0.0D0, 1.0D0, 0.0D0, 1.41421356237309505D0 /
    4266            0 :       AZ = AZABS(ZR,ZI)
    4267            0 :       INU = INT(SNGL(FNU))
    4268            0 :       IDNU = INU + N - 1
    4269            0 :       MAGZ = INT(SNGL(AZ))
    4270            0 :       AMAGZ = DBLE(FLOAT(MAGZ+1))
    4271            0 :       FDNU = DBLE(FLOAT(IDNU))
    4272            0 :       FNUP = DMAX1(AMAGZ,FDNU)
    4273            0 :       ID = IDNU - MAGZ - 1
    4274            0 :       ITIME = 1
    4275            0 :       K = 1
    4276            0 :       PTR = 1.0D0/AZ
    4277            0 :       RZR = PTR*(ZR+ZR)*PTR
    4278            0 :       RZI = -PTR*(ZI+ZI)*PTR
    4279            0 :       T1R = RZR*FNUP
    4280            0 :       T1I = RZI*FNUP
    4281            0 :       P2R = -T1R
    4282            0 :       P2I = -T1I
    4283            0 :       P1R = CONER
    4284            0 :       P1I = CONEI
    4285            0 :       T1R = T1R + RZR
    4286            0 :       T1I = T1I + RZI
    4287            0 :       IF (ID.GT.0) ID = 0
    4288            0 :       AP2 = AZABS(P2R,P2I)
    4289            0 :       AP1 = AZABS(P1R,P1I)
    4290              : !C-----------------------------------------------------------------------
    4291              : !C     THE OVERFLOW TEST ON K(FNU+I-1,Z) BEFORE THE CALL TO CBKNU
    4292              : !C     GUARANTEES THAT P2 IS ON SCALE. SCALE TEST1 AND ALL SUBSEQUENT
    4293              : !C     P2 VALUES BY AP1 TO ENSURE THAT AN OVERFLOW DOES NOT OCCUR
    4294              : !C     PREMATURELY.
    4295              : !C-----------------------------------------------------------------------
    4296            0 :       ARG = (AP2+AP2)/(AP1*TOL)
    4297            0 :       TEST1 = DSQRT(ARG)
    4298            0 :       TEST = TEST1
    4299            0 :       RAP1 = 1.0D0/AP1
    4300            0 :       P1R = P1R*RAP1
    4301            0 :       P1I = P1I*RAP1
    4302            0 :       P2R = P2R*RAP1
    4303            0 :       P2I = P2I*RAP1
    4304            0 :       AP2 = AP2*RAP1
    4305              :    10 CONTINUE
    4306            0 :       K = K + 1
    4307            0 :       AP1 = AP2
    4308            0 :       PTR = P2R
    4309            0 :       PTI = P2I
    4310            0 :       P2R = P1R - (T1R*PTR-T1I*PTI)
    4311            0 :       P2I = P1I - (T1R*PTI+T1I*PTR)
    4312            0 :       P1R = PTR
    4313            0 :       P1I = PTI
    4314            0 :       T1R = T1R + RZR
    4315            0 :       T1I = T1I + RZI
    4316            0 :       AP2 = AZABS(P2R,P2I)
    4317            0 :       IF (AP1.LE.TEST) GO TO 10
    4318            0 :       IF (ITIME.EQ.2) GO TO 20
    4319            0 :       AK = AZABS(T1R,T1I)*0.5D0
    4320            0 :       FLAM = AK + DSQRT(AK*AK-1.0D0)
    4321            0 :       RHO = DMIN1(AP2/AP1,FLAM)
    4322            0 :       TEST = TEST1*DSQRT(RHO/(RHO*RHO-1.0D0))
    4323            0 :       ITIME = 2
    4324            0 :       GO TO 10
    4325              :    20 CONTINUE
    4326            0 :       KK = K + 1 - ID
    4327            0 :       AK = DBLE(FLOAT(KK))
    4328            0 :       T1R = AK
    4329            0 :       T1I = CZEROI
    4330            0 :       DFNU = FNU + DBLE(FLOAT(N-1))
    4331            0 :       P1R = 1.0D0/AP2
    4332            0 :       P1I = CZEROI
    4333            0 :       P2R = CZEROR
    4334            0 :       P2I = CZEROI
    4335            0 :       DO 30 I=1,KK
    4336            0 :         PTR = P1R
    4337            0 :         PTI = P1I
    4338            0 :         RAP1 = DFNU + T1R
    4339            0 :         TTR = RZR*RAP1
    4340            0 :         TTI = RZI*RAP1
    4341            0 :         P1R = (PTR*TTR-PTI*TTI) + P2R
    4342            0 :         P1I = (PTR*TTI+PTI*TTR) + P2I
    4343            0 :         P2R = PTR
    4344            0 :         P2I = PTI
    4345            0 :         T1R = T1R - CONER
    4346            0 :    30 CONTINUE
    4347            0 :       IF (P1R.NE.CZEROR .OR. P1I.NE.CZEROI) GO TO 40
    4348            0 :       P1R = TOL
    4349            0 :       P1I = TOL
    4350              :    40 CONTINUE
    4351            0 :       CALL ZDIV(P2R, P2I, P1R, P1I, CYR(N), CYI(N))
    4352            0 :       IF (N.EQ.1) RETURN
    4353            0 :       K = N - 1
    4354            0 :       AK = DBLE(FLOAT(K))
    4355            0 :       T1R = AK
    4356              :       T1I = CZEROI
    4357            0 :       CDFNUR = FNU*RZR
    4358            0 :       CDFNUI = FNU*RZI
    4359            0 :       DO 60 I=2,N
    4360            0 :         PTR = CDFNUR + (T1R*RZR-T1I*RZI) + CYR(K+1)
    4361            0 :         PTI = CDFNUI + (T1R*RZI+T1I*RZR) + CYI(K+1)
    4362            0 :         AK = AZABS(PTR,PTI)
    4363            0 :         IF (AK.NE.CZEROR) GO TO 50
    4364            0 :         PTR = TOL
    4365            0 :         PTI = TOL
    4366            0 :         AK = TOL*RT2
    4367              :    50   CONTINUE
    4368            0 :         RAK = CONER/AK
    4369            0 :         CYR(K) = RAK*PTR*RAK
    4370            0 :         CYI(K) = -RAK*PTI*RAK
    4371            0 :         T1R = T1R - CONER
    4372            0 :         K = K - 1
    4373            0 :    60 CONTINUE
    4374              :       RETURN
    4375              :       END SUBROUTINE ZRATI
    4376              : 
    4377            0 :       SUBROUTINE ZBUNI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NUI, NLAST, &
    4378              :      & FNUL, TOL, ELIM, ALIM)
    4379              : !C***BEGIN PROLOGUE  ZBUNI
    4380              : !C***REFER TO  ZBESI,ZBESK
    4381              : !C
    4382              : !C     ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT.
    4383              : !C     FNUL AND FNU+N-1.LT.FNUL. THE ORDER IS INCREASED FROM
    4384              : !C     FNU+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING
    4385              : !C     ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z)
    4386              : !C     ON IFORM=1 AND THE EXPANSION FOR J(FNU,Z) ON IFORM=2
    4387              : !C
    4388              : !C***ROUTINES CALLED  ZUNI1,ZUNI2,AZABS,D1MACH
    4389              : !C***END PROLOGUE  ZBUNI
    4390              : !C     COMPLEX CSCL,CSCR,CY,RZ,ST,S1,S2,Y,Z
    4391              :       DOUBLE PRECISION ALIM, AX, AY, CSCLR, CSCRR, CYI, CYR, DFNU, &
    4392              :      & ELIM, FNU, FNUI, FNUL, GNU, RAZ, RZI, RZR, STI, STR, S1I, S1R, &
    4393              :      & S2I, S2R, TOL, YI, YR, ZI, ZR, ASCLE, BRY, C1R, C1I, C1M!,AZABS &
    4394              :      !& D1MACH
    4395              :       INTEGER I, IFLAG, IFORM, K, KODE, N, NL, NLAST, NUI, NW, NZ
    4396              :       DIMENSION YR(N), YI(N), CYR(2), CYI(2), BRY(3)
    4397            0 :       NZ = 0
    4398            0 :       AX = DABS(ZR)*1.7321D0
    4399            0 :       AY = DABS(ZI)
    4400            0 :       IFORM = 1
    4401            0 :       IF (AY.GT.AX) IFORM = 2
    4402            0 :       IF (NUI.EQ.0) GO TO 60
    4403            0 :       FNUI = DBLE(FLOAT(NUI))
    4404            0 :       DFNU = FNU + DBLE(FLOAT(N-1))
    4405            0 :       GNU = DFNU + FNUI
    4406            0 :       IF (IFORM.EQ.2) GO TO 10
    4407              : !C-----------------------------------------------------------------------
    4408              : !C     ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
    4409              : !C     -PI/3.LE.ARG(Z).LE.PI/3
    4410              : !C-----------------------------------------------------------------------
    4411              :       CALL ZUNI1(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL, &
    4412            0 :      & ELIM, ALIM)
    4413            0 :       GO TO 20
    4414              :    10 CONTINUE
    4415              : !C-----------------------------------------------------------------------
    4416              : !C     ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
    4417              : !C     APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
    4418              : !C     AND HPI=PI/2
    4419              : !C-----------------------------------------------------------------------
    4420              :       CALL ZUNI2(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL, &
    4421            0 :      & ELIM, ALIM)
    4422              :    20 CONTINUE
    4423            0 :       IF (NW.LT.0) GO TO 50
    4424            0 :       IF (NW.NE.0) GO TO 90
    4425            0 :       STR = AZABS(CYR(1),CYI(1))
    4426              : !C----------------------------------------------------------------------
    4427              : !C     SCALE BACKWARD RECURRENCE, BRY(3) IS DEFINED BUT NEVER USED
    4428              : !C----------------------------------------------------------------------
    4429            0 :       BRY(1)=1.0D+3*D1MACH(1)/TOL
    4430            0 :       BRY(2) = 1.0D0/BRY(1)
    4431            0 :       BRY(3) = BRY(2)
    4432            0 :       IFLAG = 2
    4433            0 :       ASCLE = BRY(2)
    4434            0 :       CSCLR = 1.0D0
    4435            0 :       IF (STR.GT.BRY(1)) GO TO 21
    4436            0 :       IFLAG = 1
    4437            0 :       ASCLE = BRY(1)
    4438            0 :       CSCLR = 1.0D0/TOL
    4439            0 :       GO TO 25
    4440              :    21 CONTINUE
    4441            0 :       IF (STR.LT.BRY(2)) GO TO 25
    4442            0 :       IFLAG = 3
    4443            0 :       ASCLE=BRY(3)
    4444            0 :       CSCLR = TOL
    4445              :    25 CONTINUE
    4446            0 :       CSCRR = 1.0D0/CSCLR
    4447            0 :       S1R = CYR(2)*CSCLR
    4448            0 :       S1I = CYI(2)*CSCLR
    4449            0 :       S2R = CYR(1)*CSCLR
    4450            0 :       S2I = CYI(1)*CSCLR
    4451            0 :       RAZ = 1.0D0/AZABS(ZR,ZI)
    4452            0 :       STR = ZR*RAZ
    4453            0 :       STI = -ZI*RAZ
    4454            0 :       RZR = (STR+STR)*RAZ
    4455            0 :       RZI = (STI+STI)*RAZ
    4456            0 :       DO 30 I=1,NUI
    4457            0 :         STR = S2R
    4458            0 :         STI = S2I
    4459            0 :         S2R = (DFNU+FNUI)*(RZR*STR-RZI*STI) + S1R
    4460            0 :         S2I = (DFNU+FNUI)*(RZR*STI+RZI*STR) + S1I
    4461            0 :         S1R = STR
    4462            0 :         S1I = STI
    4463            0 :         FNUI = FNUI - 1.0D0
    4464            0 :         IF (IFLAG.GE.3) GO TO 30
    4465            0 :         STR = S2R*CSCRR
    4466            0 :         STI = S2I*CSCRR
    4467            0 :         C1R = DABS(STR)
    4468            0 :         C1I = DABS(STI)
    4469            0 :         C1M = DMAX1(C1R,C1I)
    4470            0 :         IF (C1M.LE.ASCLE) GO TO 30
    4471            0 :         IFLAG = IFLAG+1
    4472            0 :         ASCLE = BRY(IFLAG)
    4473            0 :         S1R = S1R*CSCRR
    4474            0 :         S1I = S1I*CSCRR
    4475            0 :         S2R = STR
    4476            0 :         S2I = STI
    4477            0 :         CSCLR = CSCLR*TOL
    4478            0 :         CSCRR = 1.0D0/CSCLR
    4479            0 :         S1R = S1R*CSCLR
    4480            0 :         S1I = S1I*CSCLR
    4481            0 :         S2R = S2R*CSCLR
    4482            0 :         S2I = S2I*CSCLR
    4483            0 :    30 CONTINUE
    4484            0 :       YR(N) = S2R*CSCRR
    4485            0 :       YI(N) = S2I*CSCRR
    4486            0 :       IF (N.EQ.1) RETURN
    4487            0 :       NL = N - 1
    4488            0 :       FNUI = DBLE(FLOAT(NL))
    4489            0 :       K = NL
    4490            0 :       DO 40 I=1,NL
    4491            0 :         STR = S2R
    4492            0 :         STI = S2I
    4493            0 :         S2R = (FNU+FNUI)*(RZR*STR-RZI*STI) + S1R
    4494            0 :         S2I = (FNU+FNUI)*(RZR*STI+RZI*STR) + S1I
    4495            0 :         S1R = STR
    4496            0 :         S1I = STI
    4497            0 :         STR = S2R*CSCRR
    4498            0 :         STI = S2I*CSCRR
    4499            0 :         YR(K) = STR
    4500            0 :         YI(K) = STI
    4501            0 :         FNUI = FNUI - 1.0D0
    4502            0 :         K = K - 1
    4503            0 :         IF (IFLAG.GE.3) GO TO 40
    4504            0 :         C1R = DABS(STR)
    4505            0 :         C1I = DABS(STI)
    4506            0 :         C1M = DMAX1(C1R,C1I)
    4507            0 :         IF (C1M.LE.ASCLE) GO TO 40
    4508            0 :         IFLAG = IFLAG+1
    4509            0 :         ASCLE = BRY(IFLAG)
    4510            0 :         S1R = S1R*CSCRR
    4511            0 :         S1I = S1I*CSCRR
    4512            0 :         S2R = STR
    4513            0 :         S2I = STI
    4514            0 :         CSCLR = CSCLR*TOL
    4515            0 :         CSCRR = 1.0D0/CSCLR
    4516            0 :         S1R = S1R*CSCLR
    4517            0 :         S1I = S1I*CSCLR
    4518            0 :         S2R = S2R*CSCLR
    4519            0 :         S2I = S2I*CSCLR
    4520            0 :    40 CONTINUE
    4521            0 :       RETURN
    4522              :    50 CONTINUE
    4523            0 :       NZ = -1
    4524            0 :       IF(NW.EQ.(-2)) NZ=-2
    4525            0 :       RETURN
    4526              :    60 CONTINUE
    4527            0 :       IF (IFORM.EQ.2) GO TO 70
    4528              : !C-----------------------------------------------------------------------
    4529              : !C     ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
    4530              : !C     -PI/3.LE.ARG(Z).LE.PI/3
    4531              : !C-----------------------------------------------------------------------
    4532              :       CALL ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL, &
    4533            0 :      & ELIM, ALIM)
    4534            0 :       GO TO 80
    4535              :    70 CONTINUE
    4536              : !C-----------------------------------------------------------------------
    4537              : !C     ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
    4538              : !C     APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
    4539              : !C     AND HPI=PI/2
    4540              : !C-----------------------------------------------------------------------
    4541              :       CALL ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL, &
    4542            0 :      & ELIM, ALIM)
    4543              :    80 CONTINUE
    4544            0 :       IF (NW.LT.0) GO TO 50
    4545            0 :       NZ = NW
    4546            0 :       RETURN
    4547              :    90 CONTINUE
    4548            0 :       NLAST = N
    4549            0 :       RETURN
    4550              :       END SUBROUTINE ZBUNI
    4551              : 
    4552            0 :       SUBROUTINE ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, &
    4553              :      & TOL, ELIM, ALIM)
    4554              : !C***BEGIN PROLOGUE  ZUNI1
    4555              : !C***REFER TO  ZBESI,ZBESK
    4556              : !C
    4557              : !C     ZUNI1 COMPUTES I(FNU,Z)  BY MEANS OF THE UNIFORM ASYMPTOTIC
    4558              : !C     EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.
    4559              : !C
    4560              : !C     FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
    4561              : !C     EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
    4562              : !C     NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
    4563              : !C     FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
    4564              : !C     Y(I)=CZERO FOR I=NLAST+1,N
    4565              : !C
    4566              : !C***ROUTINES CALLED  ZUCHK,ZUNIK,ZUOIK,D1MACH,AZABS
    4567              : !C***END PROLOGUE  ZUNI1
    4568              : !C     COMPLEX CFN,CONE,CRSC,CSCL,CSR,CSS,CWRK,CZERO,C1,C2,PHI,RZ,SUM,S1,
    4569              : !C    *S2,Y,Z,ZETA1,ZETA2
    4570              :       DOUBLE PRECISION ALIM, APHI, ASCLE, BRY, CONER, CRSC, &
    4571              :      & CSCL, CSRR, CSSR, CWRKI, CWRKR, C1R, C2I, C2M, C2R, ELIM, FN, &
    4572              :      & FNU, FNUL, PHII, PHIR, RAST, RS1, RZI, RZR, STI, STR, SUMI, &
    4573              :      & SUMR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I, &
    4574              :      & ZETA1R, ZETA2I, ZETA2R, ZI, ZR, CYR, CYI!, D1MACH, AZABS
    4575              :       INTEGER I, IFLAG, INIT, K, KODE, M, N, ND, NLAST, NN, NUF, NW, NZ
    4576              :       DIMENSION BRY(3), YR(N), YI(N), CWRKR(16), CWRKI(16), CSSR(3), &
    4577              :      & CSRR(3), CYR(2), CYI(2)
    4578              :       DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
    4579              : !C
    4580            0 :       NZ = 0
    4581            0 :       ND = N
    4582            0 :       NLAST = 0
    4583              : !C-----------------------------------------------------------------------
    4584              : !C     COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
    4585              : !C     NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
    4586              : !C     EXP(ALIM)=EXP(ELIM)*TOL
    4587              : !C-----------------------------------------------------------------------
    4588            0 :       CSCL = 1.0D0/TOL
    4589            0 :       CRSC = TOL
    4590            0 :       CSSR(1) = CSCL
    4591            0 :       CSSR(2) = CONER
    4592            0 :       CSSR(3) = CRSC
    4593            0 :       CSRR(1) = CRSC
    4594            0 :       CSRR(2) = CONER
    4595            0 :       CSRR(3) = CSCL
    4596            0 :       BRY(1) = 1.0D+3*D1MACH(1)/TOL
    4597              : !C-----------------------------------------------------------------------
    4598              : !C     CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
    4599              : !C-----------------------------------------------------------------------
    4600            0 :       FN = DMAX1(FNU,1.0D0)
    4601            0 :       INIT = 0
    4602              :       CALL ZUNIK(ZR, ZI, FN, 1, 1, TOL, INIT, PHIR, PHII, ZETA1R, &
    4603            0 :      & ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
    4604            0 :       IF (KODE.EQ.1) GO TO 10
    4605            0 :       STR = ZR + ZETA2R
    4606            0 :       STI = ZI + ZETA2I
    4607            0 :       RAST = FN/AZABS(STR,STI)
    4608            0 :       STR = STR*RAST*RAST
    4609            0 :       STI = -STI*RAST*RAST
    4610            0 :       S1R = -ZETA1R + STR
    4611            0 :       S1I = -ZETA1I + STI
    4612            0 :       GO TO 20
    4613              :    10 CONTINUE
    4614            0 :       S1R = -ZETA1R + ZETA2R
    4615            0 :       S1I = -ZETA1I + ZETA2I
    4616              :    20 CONTINUE
    4617            0 :       RS1 = S1R
    4618            0 :       IF (DABS(RS1).GT.ELIM) GO TO 130
    4619              :    30 CONTINUE
    4620            0 :       NN = MIN0(2,ND)
    4621            0 :       DO 80 I=1,NN
    4622            0 :         FN = FNU + DBLE(FLOAT(ND-I))
    4623            0 :         INIT = 0
    4624              :         CALL ZUNIK(ZR, ZI, FN, 1, 0, TOL, INIT, PHIR, PHII, ZETA1R, &
    4625            0 :      &   ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
    4626            0 :         IF (KODE.EQ.1) GO TO 40
    4627            0 :         STR = ZR + ZETA2R
    4628            0 :         STI = ZI + ZETA2I
    4629            0 :         RAST = FN/AZABS(STR,STI)
    4630            0 :         STR = STR*RAST*RAST
    4631            0 :         STI = -STI*RAST*RAST
    4632            0 :         S1R = -ZETA1R + STR
    4633            0 :         S1I = -ZETA1I + STI + ZI
    4634            0 :         GO TO 50
    4635              :    40   CONTINUE
    4636            0 :         S1R = -ZETA1R + ZETA2R
    4637            0 :         S1I = -ZETA1I + ZETA2I
    4638              :    50   CONTINUE
    4639              : !C-----------------------------------------------------------------------
    4640              : !C     TEST FOR UNDERFLOW AND OVERFLOW
    4641              : !C-----------------------------------------------------------------------
    4642            0 :         RS1 = S1R
    4643            0 :         IF (DABS(RS1).GT.ELIM) GO TO 110
    4644            0 :         IF (I.EQ.1) IFLAG = 2
    4645            0 :         IF (DABS(RS1).LT.ALIM) GO TO 60
    4646              : !C-----------------------------------------------------------------------
    4647              : !C     REFINE  TEST AND SCALE
    4648              : !C-----------------------------------------------------------------------
    4649            0 :         APHI = AZABS(PHIR,PHII)
    4650            0 :         RS1 = RS1 + DLOG(APHI)
    4651            0 :         IF (DABS(RS1).GT.ELIM) GO TO 110
    4652            0 :         IF (I.EQ.1) IFLAG = 1
    4653            0 :         IF (RS1.LT.0.0D0) GO TO 60
    4654            0 :         IF (I.EQ.1) IFLAG = 3
    4655              :    60   CONTINUE
    4656              : !C-----------------------------------------------------------------------
    4657              : !C     SCALE S1 IF CABS(S1).LT.ASCLE
    4658              : !C-----------------------------------------------------------------------
    4659            0 :         S2R = PHIR*SUMR - PHII*SUMI
    4660            0 :         S2I = PHIR*SUMI + PHII*SUMR
    4661            0 :         STR = DEXP(S1R)*CSSR(IFLAG)
    4662            0 :         S1R = STR*DCOS(S1I)
    4663            0 :         S1I = STR*DSIN(S1I)
    4664            0 :         STR = S2R*S1R - S2I*S1I
    4665            0 :         S2I = S2R*S1I + S2I*S1R
    4666            0 :         S2R = STR
    4667            0 :         IF (IFLAG.NE.1) GO TO 70
    4668            0 :         CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
    4669              :         IF (NW.NE.0) GO TO 110
    4670              :    70   CONTINUE
    4671            0 :         CYR(I) = S2R
    4672            0 :         CYI(I) = S2I
    4673            0 :         M = ND - I + 1
    4674            0 :         YR(M) = S2R*CSRR(IFLAG)
    4675            0 :         YI(M) = S2I*CSRR(IFLAG)
    4676            0 :    80 CONTINUE
    4677            0 :       IF (ND.LE.2) GO TO 100
    4678            0 :       RAST = 1.0D0/AZABS(ZR,ZI)
    4679            0 :       STR = ZR*RAST
    4680            0 :       STI = -ZI*RAST
    4681            0 :       RZR = (STR+STR)*RAST
    4682            0 :       RZI = (STI+STI)*RAST
    4683            0 :       BRY(2) = 1.0D0/BRY(1)
    4684            0 :       BRY(3) = D1MACH(2)
    4685            0 :       S1R = CYR(1)
    4686            0 :       S1I = CYI(1)
    4687            0 :       S2R = CYR(2)
    4688            0 :       S2I = CYI(2)
    4689            0 :       C1R = CSRR(IFLAG)
    4690            0 :       ASCLE = BRY(IFLAG)
    4691            0 :       K = ND - 2
    4692            0 :       FN = DBLE(FLOAT(K))
    4693            0 :       DO 90 I=3,ND
    4694            0 :         C2R = S2R
    4695            0 :         C2I = S2I
    4696            0 :         S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
    4697            0 :         S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
    4698            0 :         S1R = C2R
    4699            0 :         S1I = C2I
    4700            0 :         C2R = S2R*C1R
    4701            0 :         C2I = S2I*C1R
    4702            0 :         YR(K) = C2R
    4703            0 :         YI(K) = C2I
    4704            0 :         K = K - 1
    4705            0 :         FN = FN - 1.0D0
    4706            0 :         IF (IFLAG.GE.3) GO TO 90
    4707            0 :         STR = DABS(C2R)
    4708            0 :         STI = DABS(C2I)
    4709            0 :         C2M = DMAX1(STR,STI)
    4710            0 :         IF (C2M.LE.ASCLE) GO TO 90
    4711            0 :         IFLAG = IFLAG + 1
    4712            0 :         ASCLE = BRY(IFLAG)
    4713            0 :         S1R = S1R*C1R
    4714            0 :         S1I = S1I*C1R
    4715            0 :         S2R = C2R
    4716            0 :         S2I = C2I
    4717            0 :         S1R = S1R*CSSR(IFLAG)
    4718            0 :         S1I = S1I*CSSR(IFLAG)
    4719            0 :         S2R = S2R*CSSR(IFLAG)
    4720            0 :         S2I = S2I*CSSR(IFLAG)
    4721            0 :         C1R = CSRR(IFLAG)
    4722            0 :    90 CONTINUE
    4723              :   100 CONTINUE
    4724            0 :       RETURN
    4725              : !C-----------------------------------------------------------------------
    4726              : !C     SET UNDERFLOW AND UPDATE PARAMETERS
    4727              : !C-----------------------------------------------------------------------
    4728              :   110 CONTINUE
    4729            0 :       IF (RS1.GT.0.0D0) GO TO 120
    4730            0 :       YR(ND) = ZEROR
    4731            0 :       YI(ND) = ZEROI
    4732            0 :       NZ = NZ + 1
    4733            0 :       ND = ND - 1
    4734            0 :       IF (ND.EQ.0) GO TO 100
    4735            0 :       CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
    4736            0 :       IF (NUF.LT.0) GO TO 120
    4737            0 :       ND = ND - NUF
    4738            0 :       NZ = NZ + NUF
    4739            0 :       IF (ND.EQ.0) GO TO 100
    4740            0 :       FN = FNU + DBLE(FLOAT(ND-1))
    4741            0 :       IF (FN.GE.FNUL) GO TO 30
    4742            0 :       NLAST = ND
    4743            0 :       RETURN
    4744              :   120 CONTINUE
    4745            0 :       NZ = -1
    4746            0 :       RETURN
    4747              :   130 CONTINUE
    4748            0 :       IF (RS1.GT.0.0D0) GO TO 120
    4749            0 :       NZ = N
    4750            0 :       DO 140 I=1,N
    4751            0 :         YR(I) = ZEROR
    4752            0 :         YI(I) = ZEROI
    4753            0 :   140 CONTINUE
    4754              :       RETURN
    4755              :       END SUBROUTINE ZUNI1
    4756              : 
    4757            0 :       SUBROUTINE ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, &
    4758              :      & TOL, ELIM, ALIM)
    4759              : !C***BEGIN PROLOGUE  ZUNI2
    4760              : !C***REFER TO  ZBESI,ZBESK
    4761              : !C
    4762              : !C     ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF
    4763              : !C     UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I
    4764              : !C     OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.
    4765              : !C
    4766              : !C     FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
    4767              : !C     EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
    4768              : !C     NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
    4769              : !C     FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
    4770              : !C     Y(I)=CZERO FOR I=NLAST+1,N
    4771              : !C
    4772              : !C***ROUTINES CALLED  ZAIRY,ZUCHK,ZUNHJ,ZUOIK,D1MACH,AZABS
    4773              : !C***END PROLOGUE  ZUNI2
    4774              : !C     COMPLEX AI,ARG,ASUM,BSUM,CFN,CI,CID,CIP,CONE,CRSC,CSCL,CSR,CSS,
    4775              : !C    *CZERO,C1,C2,DAI,PHI,RZ,S1,S2,Y,Z,ZB,ZETA1,ZETA2,ZN
    4776              :       DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGI, &
    4777              :      & ARGR, ASCLE, ASUMI, ASUMR, BRY, BSUMI, BSUMR, CIDI, CIPI, CIPR, &
    4778              :      & CONER, CRSC, CSCL, CSRR, CSSR, C1R, C2I, C2M, C2R, DAII, &
    4779              :      & DAIR, ELIM, FN, FNU, FNUL, HPI, PHII, PHIR, RAST, RAZ, RS1, RZI, &
    4780              :      & RZR, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZBI, ZBR, ZEROI, &
    4781              :      & ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI, ZNI, ZNR, ZR, CYR, &
    4782              :      & CYI, CAR, SAR !D1MACH, AZABS
    4783              :       INTEGER I, IFLAG, IN, INU, J, K, KODE, N, NAI, ND, NDAI, NLAST, &
    4784              :      & NN, NUF, NW, NZ, IDUM
    4785              :       DIMENSION BRY(3), YR(N), YI(N), CIPR(4), CIPI(4), CSSR(3), &
    4786              :      & CSRR(3), CYR(2), CYI(2)
    4787              :       DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
    4788              :       DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4), &
    4789              :      & CIPI(4)/ 1.0D0,0.0D0, 0.0D0,1.0D0, -1.0D0,0.0D0, 0.0D0,-1.0D0/
    4790              :       DATA HPI, AIC  / &
    4791              :      &      1.57079632679489662D+00,     1.265512123484645396D+00/
    4792              : !C
    4793            0 :       NZ = 0
    4794            0 :       ND = N
    4795            0 :       NLAST = 0
    4796              : !C-----------------------------------------------------------------------
    4797              : !C     COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
    4798              : !C     NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
    4799              : !C     EXP(ALIM)=EXP(ELIM)*TOL
    4800              : !C-----------------------------------------------------------------------
    4801            0 :       CSCL = 1.0D0/TOL
    4802            0 :       CRSC = TOL
    4803            0 :       CSSR(1) = CSCL
    4804            0 :       CSSR(2) = CONER
    4805            0 :       CSSR(3) = CRSC
    4806            0 :       CSRR(1) = CRSC
    4807            0 :       CSRR(2) = CONER
    4808            0 :       CSRR(3) = CSCL
    4809            0 :       BRY(1) = 1.0D+3*D1MACH(1)/TOL
    4810              : !C-----------------------------------------------------------------------
    4811              : !C     ZN IS IN THE RIGHT HALF PLANE AFTER ROTATION BY CI OR -CI
    4812              : !C-----------------------------------------------------------------------
    4813            0 :       ZNR = ZI
    4814            0 :       ZNI = -ZR
    4815            0 :       ZBR = ZR
    4816            0 :       ZBI = ZI
    4817            0 :       CIDI = -CONER
    4818            0 :       INU = INT(SNGL(FNU))
    4819            0 :       ANG = HPI*(FNU-DBLE(FLOAT(INU)))
    4820            0 :       C2R = DCOS(ANG)
    4821            0 :       C2I = DSIN(ANG)
    4822            0 :       CAR = C2R
    4823            0 :       SAR = C2I
    4824            0 :       IN = INU + N - 1
    4825            0 :       IN = MOD(IN,4) + 1
    4826            0 :       STR = C2R*CIPR(IN) - C2I*CIPI(IN)
    4827            0 :       C2I = C2R*CIPI(IN) + C2I*CIPR(IN)
    4828            0 :       C2R = STR
    4829            0 :       IF (ZI.GT.0.0D0) GO TO 10
    4830            0 :       ZNR = -ZNR
    4831            0 :       ZBI = -ZBI
    4832            0 :       CIDI = -CIDI
    4833            0 :       C2I = -C2I
    4834              :    10 CONTINUE
    4835              : !C-----------------------------------------------------------------------
    4836              : !C     CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
    4837              : !C-----------------------------------------------------------------------
    4838            0 :       FN = DMAX1(FNU,1.0D0)
    4839              :       CALL ZUNHJ(ZNR, ZNI, FN, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
    4840            0 :      & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
    4841            0 :       IF (KODE.EQ.1) GO TO 20
    4842            0 :       STR = ZBR + ZETA2R
    4843            0 :       STI = ZBI + ZETA2I
    4844            0 :       RAST = FN/AZABS(STR,STI)
    4845            0 :       STR = STR*RAST*RAST
    4846            0 :       STI = -STI*RAST*RAST
    4847            0 :       S1R = -ZETA1R + STR
    4848            0 :       S1I = -ZETA1I + STI
    4849            0 :       GO TO 30
    4850              :    20 CONTINUE
    4851            0 :       S1R = -ZETA1R + ZETA2R
    4852            0 :       S1I = -ZETA1I + ZETA2I
    4853              :    30 CONTINUE
    4854            0 :       RS1 = S1R
    4855            0 :       IF (DABS(RS1).GT.ELIM) GO TO 150
    4856              :    40 CONTINUE
    4857            0 :       NN = MIN0(2,ND)
    4858            0 :       DO 90 I=1,NN
    4859            0 :         FN = FNU + DBLE(FLOAT(ND-I))
    4860              :         CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR, PHII, ARGR, ARGI, &
    4861            0 :      &   ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
    4862            0 :         IF (KODE.EQ.1) GO TO 50
    4863            0 :         STR = ZBR + ZETA2R
    4864            0 :         STI = ZBI + ZETA2I
    4865            0 :         RAST = FN/AZABS(STR,STI)
    4866            0 :         STR = STR*RAST*RAST
    4867            0 :         STI = -STI*RAST*RAST
    4868            0 :         S1R = -ZETA1R + STR
    4869            0 :         S1I = -ZETA1I + STI + DABS(ZI)
    4870            0 :         GO TO 60
    4871              :    50   CONTINUE
    4872            0 :         S1R = -ZETA1R + ZETA2R
    4873            0 :         S1I = -ZETA1I + ZETA2I
    4874              :    60   CONTINUE
    4875              : !C-----------------------------------------------------------------------
    4876              : !C     TEST FOR UNDERFLOW AND OVERFLOW
    4877              : !C-----------------------------------------------------------------------
    4878            0 :         RS1 = S1R
    4879            0 :         IF (DABS(RS1).GT.ELIM) GO TO 120
    4880            0 :         IF (I.EQ.1) IFLAG = 2
    4881            0 :         IF (DABS(RS1).LT.ALIM) GO TO 70
    4882              : !C-----------------------------------------------------------------------
    4883              : !C     REFINE  TEST AND SCALE
    4884              : !C-----------------------------------------------------------------------
    4885              : !C-----------------------------------------------------------------------
    4886            0 :         APHI = AZABS(PHIR,PHII)
    4887            0 :         AARG = AZABS(ARGR,ARGI)
    4888            0 :         RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
    4889            0 :         IF (DABS(RS1).GT.ELIM) GO TO 120
    4890            0 :         IF (I.EQ.1) IFLAG = 1
    4891            0 :         IF (RS1.LT.0.0D0) GO TO 70
    4892            0 :         IF (I.EQ.1) IFLAG = 3
    4893              :    70   CONTINUE
    4894              : !C-----------------------------------------------------------------------
    4895              : !C     SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
    4896              : !C     EXPONENT EXTREMES
    4897              : !C-----------------------------------------------------------------------
    4898            0 :         CALL ZAIRY(ARGR, ARGI, 0, 2, AIR, AII, NAI, IDUM)
    4899            0 :         CALL ZAIRY(ARGR, ARGI, 1, 2, DAIR, DAII, NDAI, IDUM)
    4900            0 :         STR = DAIR*BSUMR - DAII*BSUMI
    4901            0 :         STI = DAIR*BSUMI + DAII*BSUMR
    4902            0 :         STR = STR + (AIR*ASUMR-AII*ASUMI)
    4903            0 :         STI = STI + (AIR*ASUMI+AII*ASUMR)
    4904            0 :         S2R = PHIR*STR - PHII*STI
    4905            0 :         S2I = PHIR*STI + PHII*STR
    4906            0 :         STR = DEXP(S1R)*CSSR(IFLAG)
    4907            0 :         S1R = STR*DCOS(S1I)
    4908            0 :         S1I = STR*DSIN(S1I)
    4909            0 :         STR = S2R*S1R - S2I*S1I
    4910            0 :         S2I = S2R*S1I + S2I*S1R
    4911            0 :         S2R = STR
    4912            0 :         IF (IFLAG.NE.1) GO TO 80
    4913            0 :         CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
    4914              :         IF (NW.NE.0) GO TO 120
    4915              :    80   CONTINUE
    4916            0 :         IF (ZI.LE.0.0D0) S2I = -S2I
    4917            0 :         STR = S2R*C2R - S2I*C2I
    4918            0 :         S2I = S2R*C2I + S2I*C2R
    4919            0 :         S2R = STR
    4920            0 :         CYR(I) = S2R
    4921            0 :         CYI(I) = S2I
    4922            0 :         J = ND - I + 1
    4923            0 :         YR(J) = S2R*CSRR(IFLAG)
    4924            0 :         YI(J) = S2I*CSRR(IFLAG)
    4925            0 :         STR = -C2I*CIDI
    4926            0 :         C2I = C2R*CIDI
    4927            0 :         C2R = STR
    4928            0 :    90 CONTINUE
    4929            0 :       IF (ND.LE.2) GO TO 110
    4930            0 :       RAZ = 1.0D0/AZABS(ZR,ZI)
    4931            0 :       STR = ZR*RAZ
    4932            0 :       STI = -ZI*RAZ
    4933            0 :       RZR = (STR+STR)*RAZ
    4934            0 :       RZI = (STI+STI)*RAZ
    4935            0 :       BRY(2) = 1.0D0/BRY(1)
    4936            0 :       BRY(3) = D1MACH(2)
    4937            0 :       S1R = CYR(1)
    4938            0 :       S1I = CYI(1)
    4939            0 :       S2R = CYR(2)
    4940            0 :       S2I = CYI(2)
    4941            0 :       C1R = CSRR(IFLAG)
    4942            0 :       ASCLE = BRY(IFLAG)
    4943            0 :       K = ND - 2
    4944            0 :       FN = DBLE(FLOAT(K))
    4945            0 :       DO 100 I=3,ND
    4946            0 :         C2R = S2R
    4947            0 :         C2I = S2I
    4948            0 :         S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
    4949            0 :         S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
    4950            0 :         S1R = C2R
    4951            0 :         S1I = C2I
    4952            0 :         C2R = S2R*C1R
    4953            0 :         C2I = S2I*C1R
    4954            0 :         YR(K) = C2R
    4955            0 :         YI(K) = C2I
    4956            0 :         K = K - 1
    4957            0 :         FN = FN - 1.0D0
    4958            0 :         IF (IFLAG.GE.3) GO TO 100
    4959            0 :         STR = DABS(C2R)
    4960            0 :         STI = DABS(C2I)
    4961            0 :         C2M = DMAX1(STR,STI)
    4962            0 :         IF (C2M.LE.ASCLE) GO TO 100
    4963            0 :         IFLAG = IFLAG + 1
    4964            0 :         ASCLE = BRY(IFLAG)
    4965            0 :         S1R = S1R*C1R
    4966            0 :         S1I = S1I*C1R
    4967            0 :         S2R = C2R
    4968            0 :         S2I = C2I
    4969            0 :         S1R = S1R*CSSR(IFLAG)
    4970            0 :         S1I = S1I*CSSR(IFLAG)
    4971            0 :         S2R = S2R*CSSR(IFLAG)
    4972            0 :         S2I = S2I*CSSR(IFLAG)
    4973            0 :         C1R = CSRR(IFLAG)
    4974            0 :   100 CONTINUE
    4975              :   110 CONTINUE
    4976            0 :       RETURN
    4977              :   120 CONTINUE
    4978            0 :       IF (RS1.GT.0.0D0) GO TO 140
    4979              : !C-----------------------------------------------------------------------
    4980              : !C     SET UNDERFLOW AND UPDATE PARAMETERS
    4981              : !C-----------------------------------------------------------------------
    4982            0 :       YR(ND) = ZEROR
    4983            0 :       YI(ND) = ZEROI
    4984            0 :       NZ = NZ + 1
    4985            0 :       ND = ND - 1
    4986            0 :       IF (ND.EQ.0) GO TO 110
    4987            0 :       CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
    4988            0 :       IF (NUF.LT.0) GO TO 140
    4989            0 :       ND = ND - NUF
    4990            0 :       NZ = NZ + NUF
    4991            0 :       IF (ND.EQ.0) GO TO 110
    4992            0 :       FN = FNU + DBLE(FLOAT(ND-1))
    4993            0 :       IF (FN.LT.FNUL) GO TO 130
    4994              : !C      FN = CIDI
    4995              : !C      J = NUF + 1
    4996              : !C      K = MOD(J,4) + 1
    4997              : !C      S1R = CIPR(K)
    4998              : !C      S1I = CIPI(K)
    4999              : !C      IF (FN.LT.0.0D0) S1I = -S1I
    5000              : !C      STR = C2R*S1R - C2I*S1I
    5001              : !C      C2I = C2R*S1I + C2I*S1R
    5002              : !C      C2R = STR
    5003            0 :       IN = INU + ND - 1
    5004            0 :       IN = MOD(IN,4) + 1
    5005            0 :       C2R = CAR*CIPR(IN) - SAR*CIPI(IN)
    5006            0 :       C2I = CAR*CIPI(IN) + SAR*CIPR(IN)
    5007            0 :       IF (ZI.LE.0.0D0) C2I = -C2I
    5008            0 :       GO TO 40
    5009              :   130 CONTINUE
    5010            0 :       NLAST = ND
    5011            0 :       RETURN
    5012              :   140 CONTINUE
    5013            0 :       NZ = -1
    5014            0 :       RETURN
    5015              :   150 CONTINUE
    5016            0 :       IF (RS1.GT.0.0D0) GO TO 140
    5017            0 :       NZ = N
    5018            0 :       DO 160 I=1,N
    5019            0 :         YR(I) = ZEROR
    5020            0 :         YI(I) = ZEROI
    5021            0 :   160 CONTINUE
    5022              :       RETURN
    5023              :       END SUBROUTINE ZUNI2
    5024              : 
    5025            0 :       SUBROUTINE ZAIRY(ZR, ZI, ID, KODE, AIR, AII, NZ, IERR)
    5026              : !C***BEGIN PROLOGUE  ZAIRY
    5027              : !C***DATE WRITTEN   830501   (YYMMDD)
    5028              : !C***REVISION DATE  890801   (YYMMDD)
    5029              : !C***CATEGORY NO.  B5K
    5030              : !C***KEYWORDS  AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
    5031              : !C***AUTHOR  AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
    5032              : !C***PURPOSE  TO COMPUTE AIRY FUNCTIONS AI(Z) AND DAI(Z) FOR COMPLEX Z
    5033              : !C***DESCRIPTION
    5034              : !C
    5035              : !C                      ***A DOUBLE PRECISION ROUTINE***
    5036              : !C         ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR
    5037              : !C         ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
    5038              : !C         KODE=2, A SCALING OPTION CEXP(ZTA)*AI(Z) OR CEXP(ZTA)*
    5039              : !C         DAI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL DECAY IN
    5040              : !C         -PI/3.LT.ARG(Z).LT.PI/3 AND THE EXPONENTIAL GROWTH IN
    5041              : !C         PI/3.LT.ABS(ARG(Z)).LT.PI WHERE ZTA=(2/3)*Z*CSQRT(Z).
    5042              : !C
    5043              : !C         WHILE THE AIRY FUNCTIONS AI(Z) AND DAI(Z)/DZ ARE ANALYTIC IN
    5044              : !C         THE WHOLE Z PLANE, THE CORRESPONDING SCALED FUNCTIONS DEFINED
    5045              : !C         FOR KODE=2 HAVE A CUT ALONG THE NEGATIVE REAL AXIS.
    5046              : !C         DEFINITIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
    5047              : !C         MATHEMATICAL FUNCTIONS (REF. 1).
    5048              : !C
    5049              : !C         INPUT      ZR,ZI ARE DOUBLE PRECISION
    5050              : !C           ZR,ZI  - Z=CMPLX(ZR,ZI)
    5051              : !C           ID     - ORDER OF DERIVATIVE, ID=0 OR ID=1
    5052              : !C           KODE   - A PARAMETER TO INDICATE THE SCALING OPTION
    5053              : !C                    KODE= 1  RETURNS
    5054              : !C                             AI=AI(Z)                ON ID=0 OR
    5055              : !C                             AI=DAI(Z)/DZ            ON ID=1
    5056              : !C                        = 2  RETURNS
    5057              : !C                             AI=CEXP(ZTA)*AI(Z)       ON ID=0 OR
    5058              : !C                             AI=CEXP(ZTA)*DAI(Z)/DZ   ON ID=1 WHERE
    5059              : !C                             ZTA=(2/3)*Z*CSQRT(Z)
    5060              : !C
    5061              : !C         OUTPUT     AIR,AII ARE DOUBLE PRECISION
    5062              : !C           AIR,AII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
    5063              : !C                    KODE
    5064              : !C           NZ     - UNDERFLOW INDICATOR
    5065              : !C                    NZ= 0   , NORMAL RETURN
    5066              : !C                    NZ= 1   , AI=CMPLX(0.0D0,0.0D0) DUE TO UNDERFLOW IN
    5067              : !C                              -PI/3.LT.ARG(Z).LT.PI/3 ON KODE=1
    5068              : !C           IERR   - ERROR FLAG
    5069              : !C                    IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
    5070              : !C                    IERR=1, INPUT ERROR   - NO COMPUTATION
    5071              : !C                    IERR=2, OVERFLOW      - NO COMPUTATION, REAL(ZTA)
    5072              : !C                            TOO LARGE ON KODE=1
    5073              : !C                    IERR=3, CABS(Z) LARGE      - COMPUTATION COMPLETED
    5074              : !C                            LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
    5075              : !C                            PRODUCE LESS THAN HALF OF MACHINE ACCURACY
    5076              : !C                    IERR=4, CABS(Z) TOO LARGE  - NO COMPUTATION
    5077              : !C                            COMPLETE LOSS OF ACCURACY BY ARGUMENT
    5078              : !C                            REDUCTION
    5079              : !C                    IERR=5, ERROR              - NO COMPUTATION,
    5080              : !C                            ALGORITHM TERMINATION CONDITION NOT MET
    5081              : !C
    5082              : !C***LONG DESCRIPTION
    5083              : !C
    5084              : !C         AI AND DAI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE K BESSEL
    5085              : !C         FUNCTIONS BY
    5086              : !C
    5087              : !C            AI(Z)=C*SQRT(Z)*K(1/3,ZTA) , DAI(Z)=-C*Z*K(2/3,ZTA)
    5088              : !C                           C=1.0/(PI*SQRT(3.0))
    5089              : !C                            ZTA=(2/3)*Z**(3/2)
    5090              : !C
    5091              : !C         WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
    5092              : !C
    5093              : !C         IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
    5094              : !C         MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
    5095              : !C         OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
    5096              : !C         THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
    5097              : !C         THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
    5098              : !C         FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
    5099              : !C         DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
    5100              : !C         ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
    5101              : !C         ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
    5102              : !C         FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
    5103              : !C         LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
    5104              : !C         MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
    5105              : !C         AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
    5106              : !C         PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
    5107              : !C         PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
    5108              : !C         ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
    5109              : !C         NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
    5110              : !C         DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
    5111              : !C         EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
    5112              : !C         NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
    5113              : !C         PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER
    5114              : !C         MACHINES.
    5115              : !C
    5116              : !C         THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
    5117              : !C         BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
    5118              : !C         ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
    5119              : !C         SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
    5120              : !C         ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
    5121              : !C         ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
    5122              : !C         CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
    5123              : !C         HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
    5124              : !C         ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
    5125              : !C         SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
    5126              : !C         THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
    5127              : !C         0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
    5128              : !C         THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
    5129              : !C         COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
    5130              : !C         BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
    5131              : !C         COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
    5132              : !C         MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
    5133              : !C         THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
    5134              : !C         OR -PI/2+P.
    5135              : !C
    5136              : !C***REFERENCES  HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
    5137              : !C                 AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
    5138              : !C                 COMMERCE, 1955.
    5139              : !C
    5140              : !C               COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
    5141              : !C                 AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
    5142              : !C
    5143              : !C               A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
    5144              : !C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
    5145              : !C                 1018, MAY, 1985
    5146              : !C
    5147              : !C               A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
    5148              : !C                 ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
    5149              : !C                 MATH. SOFTWARE, 1986
    5150              : !C
    5151              : !C***ROUTINES CALLED  ZACAI,ZBKNU,AZEXP,AZSQRT,I1MACH,D1MACH
    5152              : !C***END PROLOGUE  ZAIRY
    5153              : !C     COMPLEX AI,CONE,CSQ,CY,S1,S2,TRM1,TRM2,Z,ZTA,Z3
    5154              :       DOUBLE PRECISION AA, AD, AII, AIR, AK, ALIM, ATRM, AZ, AZ3, BK, &
    5155              :      & CC, CK, COEF, CONEI, CONER, CSQI, CSQR, CYI, CYR, C1, C2, DIG, &
    5156              :      & DK, D1, D2, ELIM, FID, FNU, PTR, RL, R1M5, SFAC, STI, STR, &
    5157              :      & S1I, S1R, S2I, S2R, TOL, TRM1I, TRM1R, TRM2I, TRM2R, TTH, ZEROI, &
    5158              :      & ZEROR, ZI, ZR, ZTAI, ZTAR, Z3I, Z3R, BB, ALAZ ! D1MACH, AZABS
    5159              :       INTEGER ID, IERR, IFLAG, K, KODE, K1, K2, MR, NN, NZ!, I1MACH
    5160              :       DIMENSION CYR(1), CYI(1)
    5161              :       DATA TTH, C1, C2, COEF /6.66666666666666667D-01, &
    5162              :      & 3.55028053887817240D-01,2.58819403792806799D-01, &
    5163              :      & 1.83776298473930683D-01/
    5164              :       DATA ZEROR, ZEROI, CONER, CONEI /0.0D0,0.0D0,1.0D0,0.0D0/
    5165              : !C***FIRST EXECUTABLE STATEMENT  ZAIRY
    5166            0 :       IERR = 0
    5167            0 :       NZ=0
    5168            0 :       IF (ID.LT.0 .OR. ID.GT.1) IERR=1
    5169            0 :       IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
    5170            0 :       IF (IERR.NE.0) RETURN
    5171            0 :       AZ = AZABS(ZR,ZI)
    5172            0 :       TOL = DMAX1(D1MACH(4),1.0D-18)
    5173            0 :       FID = DBLE(FLOAT(ID))
    5174            0 :       IF (AZ.GT.1.0D0) GO TO 70
    5175              : !C-----------------------------------------------------------------------
    5176              : !C     POWER SERIES FOR CABS(Z).LE.1.
    5177              : !C-----------------------------------------------------------------------
    5178            0 :       S1R = CONER
    5179            0 :       S1I = CONEI
    5180            0 :       S2R = CONER
    5181            0 :       S2I = CONEI
    5182            0 :       IF (AZ.LT.TOL) GO TO 170
    5183            0 :       AA = AZ*AZ
    5184            0 :       IF (AA.LT.TOL/AZ) GO TO 40
    5185            0 :       TRM1R = CONER
    5186            0 :       TRM1I = CONEI
    5187            0 :       TRM2R = CONER
    5188            0 :       TRM2I = CONEI
    5189            0 :       ATRM = 1.0D0
    5190            0 :       STR = ZR*ZR - ZI*ZI
    5191            0 :       STI = ZR*ZI + ZI*ZR
    5192            0 :       Z3R = STR*ZR - STI*ZI
    5193            0 :       Z3I = STR*ZI + STI*ZR
    5194            0 :       AZ3 = AZ*AA
    5195            0 :       AK = 2.0D0 + FID
    5196            0 :       BK = 3.0D0 - FID - FID
    5197            0 :       CK = 4.0D0 - FID
    5198            0 :       DK = 3.0D0 + FID + FID
    5199            0 :       D1 = AK*DK
    5200            0 :       D2 = BK*CK
    5201            0 :       AD = DMIN1(D1,D2)
    5202            0 :       AK = 24.0D0 + 9.0D0*FID
    5203            0 :       BK = 30.0D0 - 9.0D0*FID
    5204            0 :       DO 30 K=1,25
    5205            0 :         STR = (TRM1R*Z3R-TRM1I*Z3I)/D1
    5206            0 :         TRM1I = (TRM1R*Z3I+TRM1I*Z3R)/D1
    5207            0 :         TRM1R = STR
    5208            0 :         S1R = S1R + TRM1R
    5209            0 :         S1I = S1I + TRM1I
    5210            0 :         STR = (TRM2R*Z3R-TRM2I*Z3I)/D2
    5211            0 :         TRM2I = (TRM2R*Z3I+TRM2I*Z3R)/D2
    5212            0 :         TRM2R = STR
    5213            0 :         S2R = S2R + TRM2R
    5214            0 :         S2I = S2I + TRM2I
    5215            0 :         ATRM = ATRM*AZ3/AD
    5216            0 :         D1 = D1 + AK
    5217            0 :         D2 = D2 + BK
    5218            0 :         AD = DMIN1(D1,D2)
    5219            0 :         IF (ATRM.LT.TOL*AD) GO TO 40
    5220            0 :         AK = AK + 18.0D0
    5221            0 :         BK = BK + 18.0D0
    5222            0 :    30 CONTINUE
    5223              :    40 CONTINUE
    5224            0 :       IF (ID.EQ.1) GO TO 50
    5225            0 :       AIR = S1R*C1 - C2*(ZR*S2R-ZI*S2I)
    5226            0 :       AII = S1I*C1 - C2*(ZR*S2I+ZI*S2R)
    5227            0 :       IF (KODE.EQ.1) RETURN
    5228            0 :       CALL AZSQRT(ZR, ZI, STR, STI)
    5229            0 :       ZTAR = TTH*(ZR*STR-ZI*STI)
    5230            0 :       ZTAI = TTH*(ZR*STI+ZI*STR)
    5231            0 :       CALL AZEXP(ZTAR, ZTAI, STR, STI)
    5232            0 :       PTR = AIR*STR - AII*STI
    5233            0 :       AII = AIR*STI + AII*STR
    5234            0 :       AIR = PTR
    5235            0 :       RETURN
    5236              :    50 CONTINUE
    5237            0 :       AIR = -S2R*C2
    5238            0 :       AII = -S2I*C2
    5239            0 :       IF (AZ.LE.TOL) GO TO 60
    5240            0 :       STR = ZR*S1R - ZI*S1I
    5241            0 :       STI = ZR*S1I + ZI*S1R
    5242            0 :       CC = C1/(1.0D0+FID)
    5243            0 :       AIR = AIR + CC*(STR*ZR-STI*ZI)
    5244            0 :       AII = AII + CC*(STR*ZI+STI*ZR)
    5245              :    60 CONTINUE
    5246            0 :       IF (KODE.EQ.1) RETURN
    5247            0 :       CALL AZSQRT(ZR, ZI, STR, STI)
    5248            0 :       ZTAR = TTH*(ZR*STR-ZI*STI)
    5249            0 :       ZTAI = TTH*(ZR*STI+ZI*STR)
    5250            0 :       CALL AZEXP(ZTAR, ZTAI, STR, STI)
    5251            0 :       PTR = STR*AIR - STI*AII
    5252            0 :       AII = STR*AII + STI*AIR
    5253            0 :       AIR = PTR
    5254            0 :       RETURN
    5255              : !C-----------------------------------------------------------------------
    5256              : !C     CASE FOR CABS(Z).GT.1.0
    5257              : !C-----------------------------------------------------------------------
    5258              :    70 CONTINUE
    5259            0 :       FNU = (1.0D0+FID)/3.0D0
    5260              : !C-----------------------------------------------------------------------
    5261              : !C     SET PARAMETERS RELATED TO MACHINE CONSTANTS.
    5262              : !C     TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0D-18.
    5263              : !C     ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
    5264              : !C     EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL    AND
    5265              : !C     EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL       ARE INTERVALS NEAR
    5266              : !C     UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
    5267              : !C     RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
    5268              : !C     DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
    5269              : !C-----------------------------------------------------------------------
    5270            0 :       K1 = I1MACH(15)
    5271            0 :       K2 = I1MACH(16)
    5272            0 :       R1M5 = D1MACH(5)
    5273            0 :       K = MIN0(IABS(K1),IABS(K2))
    5274            0 :       ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
    5275            0 :       K1 = I1MACH(14) - 1
    5276            0 :       AA = R1M5*DBLE(FLOAT(K1))
    5277            0 :       DIG = DMIN1(AA,18.0D0)
    5278            0 :       AA = AA*2.303D0
    5279            0 :       ALIM = ELIM + DMAX1(-AA,-41.45D0)
    5280            0 :       RL = 1.2D0*DIG + 3.0D0
    5281            0 :       ALAZ = DLOG(AZ)
    5282              : !C--------------------------------------------------------------------------
    5283              : !C     TEST FOR PROPER RANGE
    5284              : !C-----------------------------------------------------------------------
    5285            0 :       AA=0.5D0/TOL
    5286            0 :       BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
    5287            0 :       AA=DMIN1(AA,BB)
    5288            0 :       AA=AA**TTH
    5289            0 :       IF (AZ.GT.AA) GO TO 260
    5290            0 :       AA=DSQRT(AA)
    5291            0 :       IF (AZ.GT.AA) IERR=3
    5292            0 :       CALL AZSQRT(ZR, ZI, CSQR, CSQI)
    5293            0 :       ZTAR = TTH*(ZR*CSQR-ZI*CSQI)
    5294            0 :       ZTAI = TTH*(ZR*CSQI+ZI*CSQR)
    5295              : !C-----------------------------------------------------------------------
    5296              : !C     RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
    5297              : !C-----------------------------------------------------------------------
    5298            0 :       IFLAG = 0
    5299            0 :       SFAC = 1.0D0
    5300            0 :       AK = ZTAI
    5301            0 :       IF (ZR.GE.0.0D0) GO TO 80
    5302            0 :       BK = ZTAR
    5303            0 :       CK = -DABS(BK)
    5304            0 :       ZTAR = CK
    5305            0 :       ZTAI = AK
    5306              :    80 CONTINUE
    5307            0 :       IF (ZI.NE.0.0D0) GO TO 90
    5308            0 :       IF (ZR.GT.0.0D0) GO TO 90
    5309            0 :       ZTAR = 0.0D0
    5310            0 :       ZTAI = AK
    5311              :    90 CONTINUE
    5312            0 :       AA = ZTAR
    5313            0 :       IF (AA.GE.0.0D0 .AND. ZR.GT.0.0D0) GO TO 110
    5314            0 :       IF (KODE.EQ.2) GO TO 100
    5315              : !C-----------------------------------------------------------------------
    5316              : !C     OVERFLOW TEST
    5317              : !C-----------------------------------------------------------------------
    5318            0 :       IF (AA.GT.(-ALIM)) GO TO 100
    5319            0 :       AA = -AA + 0.25D0*ALAZ
    5320            0 :       IFLAG = 1
    5321            0 :       SFAC = TOL
    5322            0 :       IF (AA.GT.ELIM) GO TO 270
    5323              :   100 CONTINUE
    5324              : !C-----------------------------------------------------------------------
    5325              : !C     CBKNU AND CACON RETURN EXP(ZTA)*K(FNU,ZTA) ON KODE=2
    5326              : !C-----------------------------------------------------------------------
    5327            0 :       MR = 1
    5328            0 :       IF (ZI.LT.0.0D0) MR = -1
    5329              :       CALL ZACAI(ZTAR, ZTAI, FNU, KODE, MR, 1, CYR, CYI, NN, RL, TOL, &
    5330            0 :      & ELIM, ALIM)
    5331            0 :       IF (NN.LT.0) GO TO 280
    5332            0 :       NZ = NZ + NN
    5333            0 :       GO TO 130
    5334              :   110 CONTINUE
    5335            0 :       IF (KODE.EQ.2) GO TO 120
    5336              : !C-----------------------------------------------------------------------
    5337              : !C     UNDERFLOW TEST
    5338              : !C-----------------------------------------------------------------------
    5339            0 :       IF (AA.LT.ALIM) GO TO 120
    5340            0 :       AA = -AA - 0.25D0*ALAZ
    5341            0 :       IFLAG = 2
    5342            0 :       SFAC = 1.0D0/TOL
    5343            0 :       IF (AA.LT.(-ELIM)) GO TO 210
    5344              :   120 CONTINUE
    5345              :       CALL ZBKNU(ZTAR, ZTAI, FNU, KODE, 1, CYR, CYI, NZ, TOL, ELIM, &
    5346            0 :      & ALIM)
    5347              :   130 CONTINUE
    5348            0 :       S1R = CYR(1)*COEF
    5349            0 :       S1I = CYI(1)*COEF
    5350            0 :       IF (IFLAG.NE.0) GO TO 150
    5351            0 :       IF (ID.EQ.1) GO TO 140
    5352            0 :       AIR = CSQR*S1R - CSQI*S1I
    5353            0 :       AII = CSQR*S1I + CSQI*S1R
    5354            0 :       RETURN
    5355              :   140 CONTINUE
    5356            0 :       AIR = -(ZR*S1R-ZI*S1I)
    5357            0 :       AII = -(ZR*S1I+ZI*S1R)
    5358            0 :       RETURN
    5359              :   150 CONTINUE
    5360            0 :       S1R = S1R*SFAC
    5361            0 :       S1I = S1I*SFAC
    5362            0 :       IF (ID.EQ.1) GO TO 160
    5363            0 :       STR = S1R*CSQR - S1I*CSQI
    5364            0 :       S1I = S1R*CSQI + S1I*CSQR
    5365            0 :       S1R = STR
    5366            0 :       AIR = S1R/SFAC
    5367            0 :       AII = S1I/SFAC
    5368            0 :       RETURN
    5369              :   160 CONTINUE
    5370            0 :       STR = -(S1R*ZR-S1I*ZI)
    5371            0 :       S1I = -(S1R*ZI+S1I*ZR)
    5372            0 :       S1R = STR
    5373            0 :       AIR = S1R/SFAC
    5374            0 :       AII = S1I/SFAC
    5375            0 :       RETURN
    5376              :   170 CONTINUE
    5377            0 :       AA = 1.0D+3*D1MACH(1)
    5378            0 :       S1R = ZEROR
    5379            0 :       S1I = ZEROI
    5380            0 :       IF (ID.EQ.1) GO TO 190
    5381            0 :       IF (AZ.LE.AA) GO TO 180
    5382            0 :       S1R = C2*ZR
    5383            0 :       S1I = C2*ZI
    5384              :   180 CONTINUE
    5385            0 :       AIR = C1 - S1R
    5386            0 :       AII = -S1I
    5387            0 :       RETURN
    5388              :   190 CONTINUE
    5389            0 :       AIR = -C2
    5390              :       AII = 0.0D0
    5391            0 :       AA = DSQRT(AA)
    5392            0 :       IF (AZ.LE.AA) GO TO 200
    5393            0 :       S1R = 0.5D0*(ZR*ZR-ZI*ZI)
    5394            0 :       S1I = ZR*ZI
    5395              :   200 CONTINUE
    5396            0 :       AIR = AIR + C1*S1R
    5397            0 :       AII = AII + C1*S1I
    5398            0 :       RETURN
    5399              :   210 CONTINUE
    5400            0 :       NZ = 1
    5401            0 :       AIR = ZEROR
    5402            0 :       AII = ZEROI
    5403            0 :       RETURN
    5404              :   270 CONTINUE
    5405            0 :       NZ = 0
    5406            0 :       IERR=2
    5407            0 :       RETURN
    5408              :   280 CONTINUE
    5409            0 :       IF(NN.EQ.(-1)) GO TO 270
    5410            0 :       NZ=0
    5411            0 :       IERR=5
    5412            0 :       RETURN
    5413              :   260 CONTINUE
    5414            0 :       IERR=4
    5415            0 :       NZ=0
    5416            0 :       RETURN
    5417              :       END SUBROUTINE ZAIRY
    5418              : 
    5419              : 
    5420            0 :       SUBROUTINE ZACAI(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, TOL, &
    5421              :      & ELIM, ALIM)
    5422              : !C***BEGIN PROLOGUE  ZACAI
    5423              : !C***REFER TO  ZAIRY
    5424              : !C
    5425              : !C     ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA
    5426              : !C
    5427              : !C         K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
    5428              : !C                 MP=PI*MR*CMPLX(0.0,1.0)
    5429              : !C
    5430              : !C     TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
    5431              : !C     HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1.
    5432              : !C     ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND
    5433              : !C     RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON
    5434              : !C     IS CALLED FROM ZAIRY.
    5435              : !C
    5436              : !C***ROUTINES CALLED  ZASYI,ZBKNU,ZMLRI,ZSERI,ZS1S2,D1MACH,AZABS
    5437              : !C***END PROLOGUE  ZACAI
    5438              : !C     COMPLEX CSGN,CSPN,C1,C2,Y,Z,ZN,CY
    5439              :       DOUBLE PRECISION ALIM, ARG, ASCLE, AZ, CSGNR, CSGNI, CSPNR, &
    5440              :      & CSPNI, C1R, C1I, C2R, C2I, CYR, CYI, DFNU, ELIM, FMR, FNU, PI, &
    5441              :      & RL, SGN, TOL, YY, YR, YI, ZR, ZI, ZNR, ZNI!, D1MACH, AZABS
    5442              :       INTEGER INU, IUF, KODE, MR, N, NN, NW, NZ
    5443              :       DIMENSION YR(N), YI(N), CYR(2), CYI(2)
    5444              :       DATA PI / 3.14159265358979324D0 /
    5445            0 :       NZ = 0
    5446            0 :       ZNR = -ZR
    5447            0 :       ZNI = -ZI
    5448            0 :       AZ = AZABS(ZR,ZI)
    5449            0 :       NN = N
    5450            0 :       DFNU = FNU + DBLE(FLOAT(N-1))
    5451            0 :       IF (AZ.LE.2.0D0) GO TO 10
    5452            0 :       IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
    5453              :    10 CONTINUE
    5454              : !C-----------------------------------------------------------------------
    5455              : !C     POWER SERIES FOR THE I FUNCTION
    5456              : !C-----------------------------------------------------------------------
    5457            0 :       CALL ZSERI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL, ELIM, ALIM)
    5458            0 :       GO TO 40
    5459              :    20 CONTINUE
    5460            0 :       IF (AZ.LT.RL) GO TO 30
    5461              : !C-----------------------------------------------------------------------
    5462              : !C     ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION
    5463              : !C-----------------------------------------------------------------------
    5464              :       CALL ZASYI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, TOL, ELIM, &
    5465            0 :      & ALIM)
    5466            0 :       IF (NW.LT.0) GO TO 80
    5467            0 :       GO TO 40
    5468              :    30 CONTINUE
    5469              : !C-----------------------------------------------------------------------
    5470              : !C     MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION
    5471              : !C-----------------------------------------------------------------------
    5472            0 :       CALL ZMLRI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL)
    5473            0 :       IF(NW.LT.0) GO TO 80
    5474              :    40 CONTINUE
    5475              : !C-----------------------------------------------------------------------
    5476              : !C     ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
    5477              : !C-----------------------------------------------------------------------
    5478            0 :       CALL ZBKNU(ZNR, ZNI, FNU, KODE, 1, CYR, CYI, NW, TOL, ELIM, ALIM)
    5479            0 :       IF (NW.NE.0) GO TO 80
    5480            0 :       FMR = DBLE(FLOAT(MR))
    5481            0 :       SGN = -DSIGN(PI,FMR)
    5482            0 :       CSGNR = 0.0D0
    5483            0 :       CSGNI = SGN
    5484            0 :       IF (KODE.EQ.1) GO TO 50
    5485            0 :       YY = -ZNI
    5486            0 :       CSGNR = -CSGNI*DSIN(YY)
    5487            0 :       CSGNI = CSGNI*DCOS(YY)
    5488              :    50 CONTINUE
    5489              : !C-----------------------------------------------------------------------
    5490              : !C     CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
    5491              : !C     WHEN FNU IS LARGE
    5492              : !C-----------------------------------------------------------------------
    5493            0 :       INU = INT(SNGL(FNU))
    5494            0 :       ARG = (FNU-DBLE(FLOAT(INU)))*SGN
    5495            0 :       CSPNR = DCOS(ARG)
    5496            0 :       CSPNI = DSIN(ARG)
    5497            0 :       IF (MOD(INU,2).EQ.0) GO TO 60
    5498            0 :       CSPNR = -CSPNR
    5499            0 :       CSPNI = -CSPNI
    5500              :    60 CONTINUE
    5501            0 :       C1R = CYR(1)
    5502            0 :       C1I = CYI(1)
    5503            0 :       C2R = YR(1)
    5504            0 :       C2I = YI(1)
    5505            0 :       IF (KODE.EQ.1) GO TO 70
    5506            0 :       IUF = 0
    5507            0 :       ASCLE = 1.0D+3*D1MACH(1)/TOL
    5508            0 :       CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
    5509            0 :       NZ = NZ + NW
    5510              :    70 CONTINUE
    5511            0 :       YR(1) = CSPNR*C1R - CSPNI*C1I + CSGNR*C2R - CSGNI*C2I
    5512            0 :       YI(1) = CSPNR*C1I + CSPNI*C1R + CSGNR*C2I + CSGNI*C2R
    5513            0 :       RETURN
    5514              :    80 CONTINUE
    5515            0 :       NZ = -1
    5516            0 :       IF(NW.EQ.(-2)) NZ=-2
    5517              :       RETURN
    5518              :       END SUBROUTINE ZACAI
    5519              : 
    5520            0 :       SUBROUTINE ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NZ, ASCLE, ALIM, &
    5521              :      & IUF)
    5522              : !C***BEGIN PROLOGUE  ZS1S2
    5523              : !C***REFER TO  ZBESK,ZAIRY
    5524              : !C
    5525              : !C     ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE
    5526              : !C     ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON-
    5527              : !C     TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION.
    5528              : !C     ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF
    5529              : !C     MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER
    5530              : !C     OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE
    5531              : !C     PRECISION ABOVE THE UNDERFLOW LIMIT.
    5532              : !C
    5533              : !C***ROUTINES CALLED  AZABS,AZEXP,AZLOG
    5534              : !C***END PROLOGUE  ZS1S2
    5535              : !C     COMPLEX CZERO,C1,S1,S1D,S2,ZR
    5536              :       DOUBLE PRECISION AA, ALIM, ALN, ASCLE, AS1, AS2, C1I, C1R, S1DI, &
    5537              :      & S1DR, S1I, S1R, S2I, S2R, ZEROI, ZEROR, ZRI, ZRR!, AZABS
    5538              :       INTEGER IUF, IDUM, NZ
    5539              :       DATA ZEROR,ZEROI  / 0.0D0 , 0.0D0 /
    5540            0 :       NZ = 0
    5541            0 :       AS1 = AZABS(S1R,S1I)
    5542            0 :       AS2 = AZABS(S2R,S2I)
    5543            0 :       IF (S1R.EQ.0.0D0 .AND. S1I.EQ.0.0D0) GO TO 10
    5544            0 :       IF (AS1.EQ.0.0D0) GO TO 10
    5545            0 :       ALN = -ZRR - ZRR + DLOG(AS1)
    5546            0 :       S1DR = S1R
    5547            0 :       S1DI = S1I
    5548            0 :       S1R = ZEROR
    5549            0 :       S1I = ZEROI
    5550            0 :       AS1 = ZEROR
    5551            0 :       IF (ALN.LT.(-ALIM)) GO TO 10
    5552            0 :       CALL AZLOG(S1DR, S1DI, C1R, C1I, IDUM)
    5553            0 :       C1R = C1R - ZRR - ZRR
    5554            0 :       C1I = C1I - ZRI - ZRI
    5555            0 :       CALL AZEXP(C1R, C1I, S1R, S1I)
    5556            0 :       AS1 = AZABS(S1R,S1I)
    5557            0 :       IUF = IUF + 1
    5558              :    10 CONTINUE
    5559            0 :       AA = DMAX1(AS1,AS2)
    5560            0 :       IF (AA.GT.ASCLE) RETURN
    5561            0 :       S1R = ZEROR
    5562            0 :       S1I = ZEROI
    5563            0 :       S2R = ZEROR
    5564            0 :       S2I = ZEROI
    5565            0 :       NZ = 1
    5566            0 :       IUF = 0
    5567            0 :       RETURN
    5568              :       END SUBROUTINE ZS1S2
    5569              : 
    5570            0 :       SUBROUTINE ZSHCH(ZR, ZI, CSHR, CSHI, CCHR, CCHI)
    5571              : !C***BEGIN PROLOGUE  ZSHCH
    5572              : !C***REFER TO  ZBESK,ZBESH
    5573              : !C
    5574              : !C     ZSHCH COMPUTES THE COMPLEX HYPERBOLIC FUNCTIONS CSH=SINH(X+I*Y)
    5575              : !C     AND CCH=COSH(X+I*Y), WHERE I**2=-1.
    5576              : !C
    5577              : !C***ROUTINES CALLED  (NONE)
    5578              : !C***END PROLOGUE  ZSHCH
    5579              : !C
    5580              :       DOUBLE PRECISION CCHI, CCHR, CH, CN, CSHI, CSHR, SH, SN, ZI, ZR, &
    5581              :      & DCOSH, DSINH
    5582            0 :       SH = DSINH(ZR)
    5583            0 :       CH = DCOSH(ZR)
    5584            0 :       SN = DSIN(ZI)
    5585            0 :       CN = DCOS(ZI)
    5586            0 :       CSHR = SH*CN
    5587            0 :       CSHI = CH*SN
    5588            0 :       CCHR = CH*CN
    5589            0 :       CCHI = SH*SN
    5590            0 :       RETURN
    5591              :       END SUBROUTINE ZSHCH
    5592              : 
    5593            0 :       SUBROUTINE ZKSCL(ZRR,ZRI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
    5594              : !C***BEGIN PROLOGUE  ZKSCL
    5595              : !C***REFER TO  ZBESK
    5596              : !C
    5597              : !C     SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
    5598              : !C     ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
    5599              : !C     RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
    5600              : !C
    5601              : !C***ROUTINES CALLED  ZUCHK,AZABS,AZLOG
    5602              : !C***END PROLOGUE  ZKSCL
    5603              : !C     COMPLEX CK,CS,CY,CZERO,RZ,S1,S2,Y,ZR,ZD,CELM
    5604              :       DOUBLE PRECISION ACS, AS, ASCLE, CKI, CKR, CSI, CSR, CYI, &
    5605              :      & CYR, ELIM, FN, FNU, RZI, RZR, STR, S1I, S1R, S2I, &
    5606              :      & S2R, TOL, YI, YR, ZEROI, ZEROR, ZRI, ZRR, & !AZABS, &
    5607              :      & ZDR, ZDI, CELMR, ELM, HELIM, ALAS
    5608              :       INTEGER I, IC, IDUM, KK, N, NN, NW, NZ
    5609              :       DIMENSION YR(N), YI(N), CYR(2), CYI(2)
    5610              :       DATA ZEROR,ZEROI / 0.0D0 , 0.0D0 /
    5611              : !C
    5612            0 :       NZ = 0
    5613            0 :       IC = 0
    5614            0 :       NN = MIN0(2,N)
    5615            0 :       DO 10 I=1,NN
    5616            0 :         S1R = YR(I)
    5617            0 :         S1I = YI(I)
    5618            0 :         CYR(I) = S1R
    5619            0 :         CYI(I) = S1I
    5620            0 :         AS = AZABS(S1R,S1I)
    5621            0 :         ACS = -ZRR + DLOG(AS)
    5622            0 :         NZ = NZ + 1
    5623            0 :         YR(I) = ZEROR
    5624            0 :         YI(I) = ZEROI
    5625            0 :         IF (ACS.LT.(-ELIM)) GO TO 10
    5626            0 :         CALL AZLOG(S1R, S1I, CSR, CSI, IDUM)
    5627            0 :         CSR = CSR - ZRR
    5628            0 :         CSI = CSI - ZRI
    5629            0 :         STR = DEXP(CSR)/TOL
    5630            0 :         CSR = STR*DCOS(CSI)
    5631            0 :         CSI = STR*DSIN(CSI)
    5632            0 :         CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
    5633              :         IF (NW.NE.0) GO TO 10
    5634            0 :         YR(I) = CSR
    5635            0 :         YI(I) = CSI
    5636            0 :         IC = I
    5637            0 :         NZ = NZ - 1
    5638            0 :    10 CONTINUE
    5639            0 :       IF (N.EQ.1) RETURN
    5640            0 :       IF (IC.GT.1) GO TO 20
    5641            0 :       YR(1) = ZEROR
    5642            0 :       YI(1) = ZEROI
    5643            0 :       NZ = 2
    5644              :    20 CONTINUE
    5645            0 :       IF (N.EQ.2) RETURN
    5646            0 :       IF (NZ.EQ.0) RETURN
    5647            0 :       FN = FNU + 1.0D0
    5648            0 :       CKR = FN*RZR
    5649            0 :       CKI = FN*RZI
    5650            0 :       S1R = CYR(1)
    5651            0 :       S1I = CYI(1)
    5652            0 :       S2R = CYR(2)
    5653            0 :       S2I = CYI(2)
    5654            0 :       HELIM = 0.5D0*ELIM
    5655            0 :       ELM = DEXP(-ELIM)
    5656            0 :       CELMR = ELM
    5657            0 :       ZDR = ZRR
    5658            0 :       ZDI = ZRI
    5659              : !C
    5660              : !C     FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
    5661              : !C     S2 GETS LARGER THAN EXP(ELIM/2)
    5662              : !C
    5663            0 :       DO 30 I=3,N
    5664            0 :         KK = I
    5665            0 :         CSR = S2R
    5666            0 :         CSI = S2I
    5667            0 :         S2R = CKR*CSR - CKI*CSI + S1R
    5668            0 :         S2I = CKI*CSR + CKR*CSI + S1I
    5669            0 :         S1R = CSR
    5670            0 :         S1I = CSI
    5671            0 :         CKR = CKR + RZR
    5672            0 :         CKI = CKI + RZI
    5673            0 :         AS = AZABS(S2R,S2I)
    5674            0 :         ALAS = DLOG(AS)
    5675            0 :         ACS = -ZDR + ALAS
    5676            0 :         NZ = NZ + 1
    5677            0 :         YR(I) = ZEROR
    5678            0 :         YI(I) = ZEROI
    5679            0 :         IF (ACS.LT.(-ELIM)) GO TO 25
    5680            0 :         CALL AZLOG(S2R, S2I, CSR, CSI, IDUM)
    5681            0 :         CSR = CSR - ZDR
    5682            0 :         CSI = CSI - ZDI
    5683            0 :         STR = DEXP(CSR)/TOL
    5684            0 :         CSR = STR*DCOS(CSI)
    5685            0 :         CSI = STR*DSIN(CSI)
    5686            0 :         CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
    5687              :         IF (NW.NE.0) GO TO 25
    5688            0 :         YR(I) = CSR
    5689            0 :         YI(I) = CSI
    5690            0 :         NZ = NZ - 1
    5691            0 :         IF (IC.EQ.KK-1) GO TO 40
    5692              :         IC = KK
    5693            0 :         GO TO 30
    5694              :    25   CONTINUE
    5695            0 :         IF(ALAS.LT.HELIM) GO TO 30
    5696            0 :         ZDR = ZDR - ELIM
    5697            0 :         S1R = S1R*CELMR
    5698            0 :         S1I = S1I*CELMR
    5699            0 :         S2R = S2R*CELMR
    5700            0 :         S2I = S2I*CELMR
    5701            0 :    30 CONTINUE
    5702            0 :       NZ = N
    5703            0 :       IF(IC.EQ.N) NZ=N-1
    5704            0 :       GO TO 45
    5705              :    40 CONTINUE
    5706            0 :       NZ = KK - 2
    5707              :    45 CONTINUE
    5708            0 :       DO 50 I=1,NZ
    5709            0 :         YR(I) = ZEROR
    5710            0 :         YI(I) = ZEROI
    5711            0 :    50 CONTINUE
    5712              :       RETURN
    5713              :       END SUBROUTINE ZKSCL
    5714              : 
    5715            0 :       SUBROUTINE ZBUNK(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
    5716              :      & ALIM)
    5717              : !C***BEGIN PROLOGUE  ZBUNK
    5718              : !C***REFER TO  ZBESK,ZBESH
    5719              : !C
    5720              : !C     ZBUNK COMPUTES THE K BESSEL FUNCTION FOR FNU.GT.FNUL.
    5721              : !C     ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR K(FNU,Z)
    5722              : !C     IN ZUNK1 AND THE EXPANSION FOR H(2,FNU,Z) IN ZUNK2
    5723              : !C
    5724              : !C***ROUTINES CALLED  ZUNK1,ZUNK2
    5725              : !C***END PROLOGUE  ZBUNK
    5726              : !C     COMPLEX Y,Z
    5727              :       DOUBLE PRECISION ALIM, AX, AY, ELIM, FNU, TOL, YI, YR, ZI, ZR
    5728              :       INTEGER KODE, MR, N, NZ
    5729              :       DIMENSION YR(N), YI(N)
    5730            0 :       NZ = 0
    5731            0 :       AX = DABS(ZR)*1.7321D0
    5732            0 :       AY = DABS(ZI)
    5733            0 :       IF (AY.GT.AX) GO TO 10
    5734              : !C-----------------------------------------------------------------------
    5735              : !C     ASYMPTOTIC EXPANSION FOR K(FNU,Z) FOR LARGE FNU APPLIED IN
    5736              : !C     -PI/3.LE.ARG(Z).LE.PI/3
    5737              : !C-----------------------------------------------------------------------
    5738            0 :       CALL ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
    5739            0 :       GO TO 20
    5740              :    10 CONTINUE
    5741              : !C-----------------------------------------------------------------------
    5742              : !C     ASYMPTOTIC EXPANSION FOR H(2,FNU,Z*EXP(M*HPI)) FOR LARGE FNU
    5743              : !C     APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
    5744              : !C     AND HPI=PI/2
    5745              : !C-----------------------------------------------------------------------
    5746            0 :       CALL ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
    5747              :    20 CONTINUE
    5748            0 :       RETURN
    5749              :       END SUBROUTINE ZBUNK
    5750              : 
    5751              : 
    5752            0 :       SUBROUTINE ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
    5753              :      & ALIM)
    5754              : !C***BEGIN PROLOGUE  ZUNK1
    5755              : !C***REFER TO  ZBESK
    5756              : !C
    5757              : !C     ZUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
    5758              : !C     RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
    5759              : !C     UNIFORM ASYMPTOTIC EXPANSION.
    5760              : !C     MR INDICATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
    5761              : !C     NZ=-1 MEANS AN OVERFLOW WILL OCCUR
    5762              : !C
    5763              : !C***ROUTINES CALLED  ZKSCL,ZS1S2,ZUCHK,ZUNIK,D1MACH,AZABS
    5764              : !C***END PROLOGUE  ZUNK1
    5765              : !C     COMPLEX CFN,CK,CONE,CRSC,CS,CSCL,CSGN,CSPN,CSR,CSS,CWRK,CY,CZERO,
    5766              : !C    *C1,C2,PHI,PHID,RZ,SUM,SUMD,S1,S2,Y,Z,ZETA1,ZETA1D,ZETA2,ZETA2D,ZR
    5767              :       DOUBLE PRECISION ALIM, ANG, APHI, ASC, ASCLE, BRY, CKI, CKR, &
    5768              :      & CONER, CRSC, CSCL, CSGNI, CSPNI, CSPNR, CSR, CSRR, CSSR, &
    5769              :      & CWRKI, CWRKR, CYI, CYR, C1I, C1R, C2I, C2M, C2R, ELIM, FMR, FN, &
    5770              :      & FNF, FNU, PHIDI, PHIDR, PHII, PHIR, PI, RAST, RAZR, RS1, RZI, &
    5771              :      & RZR, SGN, STI, STR, SUMDI, SUMDR, SUMI, SUMR, S1I, S1R, S2I, &
    5772              :      & S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, &
    5773              :      & ZET1DI, ZET1DR, ZET2DI, ZET2DR, ZI, ZR, ZRI, ZRR!, D1MACH, AZABS
    5774              :       INTEGER I, IB, IFLAG, IFN, IL, INIT, INU, IUF, K, KDFLG, KFLAG, &
    5775              :      & KK, KODE, MR, N, NW, NZ, INITD, IC, IPARD, J, M
    5776              :       DIMENSION BRY(3), INIT(2), YR(N), YI(N), SUMR(2), SUMI(2), &
    5777              :      & ZETA1R(2), ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2), &
    5778              :      & CWRKR(16,3), CWRKI(16,3), CSSR(3), CSRR(3), PHIR(2), PHII(2)
    5779              :       DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
    5780              :       DATA PI / 3.14159265358979324D0 /
    5781              : !C
    5782            0 :       KDFLG = 1
    5783            0 :       NZ = 0
    5784              : !C-----------------------------------------------------------------------
    5785              : !C     EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
    5786              : !C     THE UNDERFLOW LIMIT
    5787              : !C-----------------------------------------------------------------------
    5788            0 :       CSCL = 1.0D0/TOL
    5789            0 :       CRSC = TOL
    5790            0 :       CSSR(1) = CSCL
    5791            0 :       CSSR(2) = CONER
    5792            0 :       CSSR(3) = CRSC
    5793            0 :       CSRR(1) = CRSC
    5794            0 :       CSRR(2) = CONER
    5795            0 :       CSRR(3) = CSCL
    5796            0 :       BRY(1) = 1.0D+3*D1MACH(1)/TOL
    5797            0 :       BRY(2) = 1.0D0/BRY(1)
    5798            0 :       BRY(3) = D1MACH(2)
    5799            0 :       ZRR = ZR
    5800            0 :       ZRI = ZI
    5801            0 :       IF (ZR.GE.0.0D0) GO TO 10
    5802            0 :       ZRR = -ZR
    5803            0 :       ZRI = -ZI
    5804              :    10 CONTINUE
    5805            0 :       J = 2
    5806            0 :       DO 70 I=1,N
    5807              : !C-----------------------------------------------------------------------
    5808              : !C     J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
    5809              : !C-----------------------------------------------------------------------
    5810            0 :         J = 3 - J
    5811            0 :         FN = FNU + DBLE(FLOAT(I-1))
    5812            0 :         INIT(J) = 0
    5813              :         CALL ZUNIK(ZRR, ZRI, FN, 2, 0, TOL, INIT(J), PHIR(J), PHII(J), &
    5814              :      &   ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), SUMR(J), SUMI(J), &
    5815            0 :      &   CWRKR(1,J), CWRKI(1,J))
    5816            0 :         IF (KODE.EQ.1) GO TO 20
    5817            0 :         STR = ZRR + ZETA2R(J)
    5818            0 :         STI = ZRI + ZETA2I(J)
    5819            0 :         RAST = FN/AZABS(STR,STI)
    5820            0 :         STR = STR*RAST*RAST
    5821            0 :         STI = -STI*RAST*RAST
    5822            0 :         S1R = ZETA1R(J) - STR
    5823            0 :         S1I = ZETA1I(J) - STI
    5824            0 :         GO TO 30
    5825              :    20   CONTINUE
    5826            0 :         S1R = ZETA1R(J) - ZETA2R(J)
    5827            0 :         S1I = ZETA1I(J) - ZETA2I(J)
    5828              :    30   CONTINUE
    5829            0 :         RS1 = S1R
    5830              : !C-----------------------------------------------------------------------
    5831              : !C     TEST FOR UNDERFLOW AND OVERFLOW
    5832              : !C-----------------------------------------------------------------------
    5833            0 :         IF (DABS(RS1).GT.ELIM) GO TO 60
    5834            0 :         IF (KDFLG.EQ.1) KFLAG = 2
    5835            0 :         IF (DABS(RS1).LT.ALIM) GO TO 40
    5836              : !C-----------------------------------------------------------------------
    5837              : !C     REFINE  TEST AND SCALE
    5838              : !C-----------------------------------------------------------------------
    5839            0 :         APHI = AZABS(PHIR(J),PHII(J))
    5840            0 :         RS1 = RS1 + DLOG(APHI)
    5841            0 :         IF (DABS(RS1).GT.ELIM) GO TO 60
    5842            0 :         IF (KDFLG.EQ.1) KFLAG = 1
    5843            0 :         IF (RS1.LT.0.0D0) GO TO 40
    5844            0 :         IF (KDFLG.EQ.1) KFLAG = 3
    5845              :    40   CONTINUE
    5846              : !C-----------------------------------------------------------------------
    5847              : !C     SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
    5848              : !C     EXPONENT EXTREMES
    5849              : !C-----------------------------------------------------------------------
    5850            0 :         S2R = PHIR(J)*SUMR(J) - PHII(J)*SUMI(J)
    5851            0 :         S2I = PHIR(J)*SUMI(J) + PHII(J)*SUMR(J)
    5852            0 :         STR = DEXP(S1R)*CSSR(KFLAG)
    5853            0 :         S1R = STR*DCOS(S1I)
    5854            0 :         S1I = STR*DSIN(S1I)
    5855            0 :         STR = S2R*S1R - S2I*S1I
    5856            0 :         S2I = S1R*S2I + S2R*S1I
    5857            0 :         S2R = STR
    5858            0 :         IF (KFLAG.NE.1) GO TO 50
    5859            0 :         CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
    5860            0 :         IF (NW.NE.0) GO TO 60
    5861              :    50   CONTINUE
    5862            0 :         CYR(KDFLG) = S2R
    5863            0 :         CYI(KDFLG) = S2I
    5864            0 :         YR(I) = S2R*CSRR(KFLAG)
    5865            0 :         YI(I) = S2I*CSRR(KFLAG)
    5866            0 :         IF (KDFLG.EQ.2) GO TO 75
    5867              :         KDFLG = 2
    5868            0 :         GO TO 70
    5869              :    60   CONTINUE
    5870            0 :         IF (RS1.GT.0.0D0) GO TO 300
    5871              : !C-----------------------------------------------------------------------
    5872              : !C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
    5873              : !C-----------------------------------------------------------------------
    5874            0 :         IF (ZR.LT.0.0D0) GO TO 300
    5875            0 :         KDFLG = 1
    5876            0 :         YR(I)=ZEROR
    5877            0 :         YI(I)=ZEROI
    5878            0 :         NZ=NZ+1
    5879            0 :         IF (I.EQ.1) GO TO 70
    5880            0 :         IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 70
    5881            0 :         YR(I-1)=ZEROR
    5882            0 :         YI(I-1)=ZEROI
    5883            0 :         NZ=NZ+1
    5884            0 :    70 CONTINUE
    5885            0 :       I = N
    5886              :    75 CONTINUE
    5887            0 :       RAZR = 1.0D0/AZABS(ZRR,ZRI)
    5888            0 :       STR = ZRR*RAZR
    5889            0 :       STI = -ZRI*RAZR
    5890            0 :       RZR = (STR+STR)*RAZR
    5891            0 :       RZI = (STI+STI)*RAZR
    5892            0 :       CKR = FN*RZR
    5893            0 :       CKI = FN*RZI
    5894            0 :       IB = I + 1
    5895            0 :       IF (N.LT.IB) GO TO 160
    5896              : !C-----------------------------------------------------------------------
    5897              : !C     TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
    5898              : !C     ON UNDERFLOW.
    5899              : !C-----------------------------------------------------------------------
    5900            0 :       FN = FNU + DBLE(FLOAT(N-1))
    5901            0 :       IPARD = 1
    5902            0 :       IF (MR.NE.0) IPARD = 0
    5903            0 :       INITD = 0
    5904              :       CALL ZUNIK(ZRR, ZRI, FN, 2, IPARD, TOL, INITD, PHIDR, PHIDI, &
    5905              :      & ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI, CWRKR(1,3), &
    5906            0 :      & CWRKI(1,3))
    5907            0 :       IF (KODE.EQ.1) GO TO 80
    5908            0 :       STR = ZRR + ZET2DR
    5909            0 :       STI = ZRI + ZET2DI
    5910            0 :       RAST = FN/AZABS(STR,STI)
    5911            0 :       STR = STR*RAST*RAST
    5912            0 :       STI = -STI*RAST*RAST
    5913            0 :       S1R = ZET1DR - STR
    5914            0 :       S1I = ZET1DI - STI
    5915            0 :       GO TO 90
    5916              :    80 CONTINUE
    5917            0 :       S1R = ZET1DR - ZET2DR
    5918            0 :       S1I = ZET1DI - ZET2DI
    5919              :    90 CONTINUE
    5920            0 :       RS1 = S1R
    5921            0 :       IF (DABS(RS1).GT.ELIM) GO TO 95
    5922            0 :       IF (DABS(RS1).LT.ALIM) GO TO 100
    5923              : !C----------------------------------------------------------------------------
    5924              : !C     REFINE ESTIMATE AND TEST
    5925              : !C-------------------------------------------------------------------------
    5926            0 :       APHI = AZABS(PHIDR,PHIDI)
    5927            0 :       RS1 = RS1+DLOG(APHI)
    5928            0 :       IF (DABS(RS1).LT.ELIM) GO TO 100
    5929              :    95 CONTINUE
    5930            0 :       IF (DABS(RS1).GT.0.0D0) GO TO 300
    5931              : !C-----------------------------------------------------------------------
    5932              : !C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
    5933              : !C-----------------------------------------------------------------------
    5934            0 :       IF (ZR.LT.0.0D0) GO TO 300
    5935            0 :       NZ = N
    5936            0 :       DO 96 I=1,N
    5937            0 :         YR(I) = ZEROR
    5938            0 :         YI(I) = ZEROI
    5939            0 :    96 CONTINUE
    5940            0 :       RETURN
    5941              : !C---------------------------------------------------------------------------
    5942              : !C     FORWARD RECUR FOR REMAINDER OF THE SEQUENCE
    5943              : !C----------------------------------------------------------------------------
    5944              :   100 CONTINUE
    5945            0 :       S1R = CYR(1)
    5946            0 :       S1I = CYI(1)
    5947            0 :       S2R = CYR(2)
    5948            0 :       S2I = CYI(2)
    5949            0 :       C1R = CSRR(KFLAG)
    5950            0 :       ASCLE = BRY(KFLAG)
    5951            0 :       DO 120 I=IB,N
    5952            0 :         C2R = S2R
    5953            0 :         C2I = S2I
    5954            0 :         S2R = CKR*C2R - CKI*C2I + S1R
    5955            0 :         S2I = CKR*C2I + CKI*C2R + S1I
    5956            0 :         S1R = C2R
    5957            0 :         S1I = C2I
    5958            0 :         CKR = CKR + RZR
    5959            0 :         CKI = CKI + RZI
    5960            0 :         C2R = S2R*C1R
    5961            0 :         C2I = S2I*C1R
    5962            0 :         YR(I) = C2R
    5963            0 :         YI(I) = C2I
    5964            0 :         IF (KFLAG.GE.3) GO TO 120
    5965            0 :         STR = DABS(C2R)
    5966            0 :         STI = DABS(C2I)
    5967            0 :         C2M = DMAX1(STR,STI)
    5968            0 :         IF (C2M.LE.ASCLE) GO TO 120
    5969            0 :         KFLAG = KFLAG + 1
    5970            0 :         ASCLE = BRY(KFLAG)
    5971            0 :         S1R = S1R*C1R
    5972            0 :         S1I = S1I*C1R
    5973              :         S2R = C2R
    5974              :         S2I = C2I
    5975            0 :         S1R = S1R*CSSR(KFLAG)
    5976            0 :         S1I = S1I*CSSR(KFLAG)
    5977            0 :         S2R = S2R*CSSR(KFLAG)
    5978            0 :         S2I = S2I*CSSR(KFLAG)
    5979            0 :         C1R = CSRR(KFLAG)
    5980            0 :   120 CONTINUE
    5981              :   160 CONTINUE
    5982            0 :       IF (MR.EQ.0) RETURN
    5983              : !C-----------------------------------------------------------------------
    5984              : !C     ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
    5985              : !C-----------------------------------------------------------------------
    5986            0 :       NZ = 0
    5987            0 :       FMR = DBLE(FLOAT(MR))
    5988            0 :       SGN = -DSIGN(PI,FMR)
    5989              : !C-----------------------------------------------------------------------
    5990              : !C     CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
    5991              : !C-----------------------------------------------------------------------
    5992            0 :       CSGNI = SGN
    5993            0 :       INU = INT(SNGL(FNU))
    5994            0 :       FNF = FNU - DBLE(FLOAT(INU))
    5995            0 :       IFN = INU + N - 1
    5996            0 :       ANG = FNF*SGN
    5997            0 :       CSPNR = DCOS(ANG)
    5998            0 :       CSPNI = DSIN(ANG)
    5999            0 :       IF (MOD(IFN,2).EQ.0) GO TO 170
    6000            0 :       CSPNR = -CSPNR
    6001            0 :       CSPNI = -CSPNI
    6002              :   170 CONTINUE
    6003            0 :       ASC = BRY(1)
    6004            0 :       IUF = 0
    6005            0 :       KK = N
    6006            0 :       KDFLG = 1
    6007            0 :       IB = IB - 1
    6008            0 :       IC = IB - 1
    6009            0 :       DO 270 K=1,N
    6010            0 :         FN = FNU + DBLE(FLOAT(KK-1))
    6011              : !C-----------------------------------------------------------------------
    6012              : !C     LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
    6013              : !C     FUNCTION ABOVE
    6014              : !C-----------------------------------------------------------------------
    6015            0 :         M=3
    6016            0 :         IF (N.GT.2) GO TO 175
    6017              :   172   CONTINUE
    6018            0 :         INITD = INIT(J)
    6019            0 :         PHIDR = PHIR(J)
    6020            0 :         PHIDI = PHII(J)
    6021            0 :         ZET1DR = ZETA1R(J)
    6022            0 :         ZET1DI = ZETA1I(J)
    6023            0 :         ZET2DR = ZETA2R(J)
    6024            0 :         ZET2DI = ZETA2I(J)
    6025            0 :         SUMDR = SUMR(J)
    6026            0 :         SUMDI = SUMI(J)
    6027            0 :         M = J
    6028            0 :         J = 3 - J
    6029            0 :         GO TO 180
    6030              :   175   CONTINUE
    6031            0 :         IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 180
    6032            0 :         IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
    6033            0 :         INITD = 0
    6034              :   180   CONTINUE
    6035              :         CALL ZUNIK(ZRR, ZRI, FN, 1, 0, TOL, INITD, PHIDR, PHIDI, &
    6036              :      &   ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI, &
    6037            0 :      &   CWRKR(1,M), CWRKI(1,M))
    6038            0 :         IF (KODE.EQ.1) GO TO 200
    6039            0 :         STR = ZRR + ZET2DR
    6040            0 :         STI = ZRI + ZET2DI
    6041            0 :         RAST = FN/AZABS(STR,STI)
    6042            0 :         STR = STR*RAST*RAST
    6043            0 :         STI = -STI*RAST*RAST
    6044            0 :         S1R = -ZET1DR + STR
    6045            0 :         S1I = -ZET1DI + STI
    6046            0 :         GO TO 210
    6047              :   200   CONTINUE
    6048            0 :         S1R = -ZET1DR + ZET2DR
    6049            0 :         S1I = -ZET1DI + ZET2DI
    6050              :   210   CONTINUE
    6051              : !C-----------------------------------------------------------------------
    6052              : !C     TEST FOR UNDERFLOW AND OVERFLOW
    6053              : !C-----------------------------------------------------------------------
    6054            0 :         RS1 = S1R
    6055            0 :         IF (DABS(RS1).GT.ELIM) GO TO 260
    6056            0 :         IF (KDFLG.EQ.1) IFLAG = 2
    6057            0 :         IF (DABS(RS1).LT.ALIM) GO TO 220
    6058              : !C-----------------------------------------------------------------------
    6059              : !C     REFINE  TEST AND SCALE
    6060              : !C-----------------------------------------------------------------------
    6061            0 :         APHI = AZABS(PHIDR,PHIDI)
    6062            0 :         RS1 = RS1 + DLOG(APHI)
    6063            0 :         IF (DABS(RS1).GT.ELIM) GO TO 260
    6064            0 :         IF (KDFLG.EQ.1) IFLAG = 1
    6065            0 :         IF (RS1.LT.0.0D0) GO TO 220
    6066            0 :         IF (KDFLG.EQ.1) IFLAG = 3
    6067              :   220   CONTINUE
    6068            0 :         STR = PHIDR*SUMDR - PHIDI*SUMDI
    6069            0 :         STI = PHIDR*SUMDI + PHIDI*SUMDR
    6070            0 :         S2R = -CSGNI*STI
    6071            0 :         S2I = CSGNI*STR
    6072            0 :         STR = DEXP(S1R)*CSSR(IFLAG)
    6073            0 :         S1R = STR*DCOS(S1I)
    6074            0 :         S1I = STR*DSIN(S1I)
    6075            0 :         STR = S2R*S1R - S2I*S1I
    6076            0 :         S2I = S2R*S1I + S2I*S1R
    6077            0 :         S2R = STR
    6078            0 :         IF (IFLAG.NE.1) GO TO 230
    6079            0 :         CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
    6080            0 :         IF (NW.EQ.0) GO TO 230
    6081            0 :         S2R = ZEROR
    6082            0 :         S2I = ZEROI
    6083              :   230   CONTINUE
    6084            0 :         CYR(KDFLG) = S2R
    6085            0 :         CYI(KDFLG) = S2I
    6086            0 :         C2R = S2R
    6087            0 :         C2I = S2I
    6088            0 :         S2R = S2R*CSRR(IFLAG)
    6089            0 :         S2I = S2I*CSRR(IFLAG)
    6090              : !C-----------------------------------------------------------------------
    6091              : !C     ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
    6092              : !C-----------------------------------------------------------------------
    6093            0 :         S1R = YR(KK)
    6094            0 :         S1I = YI(KK)
    6095            0 :         IF (KODE.EQ.1) GO TO 250
    6096            0 :         CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
    6097            0 :         NZ = NZ + NW
    6098              :   250   CONTINUE
    6099            0 :         YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
    6100            0 :         YI(KK) = CSPNR*S1I + CSPNI*S1R + S2I
    6101            0 :         KK = KK - 1
    6102            0 :         CSPNR = -CSPNR
    6103            0 :         CSPNI = -CSPNI
    6104            0 :         IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
    6105              :         KDFLG = 1
    6106            0 :         GO TO 270
    6107              :   255   CONTINUE
    6108            0 :         IF (KDFLG.EQ.2) GO TO 275
    6109              :         KDFLG = 2
    6110            0 :         GO TO 270
    6111              :   260   CONTINUE
    6112            0 :         IF (RS1.GT.0.0D0) GO TO 300
    6113            0 :         S2R = ZEROR
    6114            0 :         S2I = ZEROI
    6115            0 :         GO TO 230
    6116            0 :   270 CONTINUE
    6117            0 :       K = N
    6118              :   275 CONTINUE
    6119            0 :       IL = N - K
    6120            0 :       IF (IL.EQ.0) RETURN
    6121              : !C-----------------------------------------------------------------------
    6122              : !C     RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
    6123              : !C     K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
    6124              : !C     INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
    6125              : !C-----------------------------------------------------------------------
    6126            0 :       S1R = CYR(1)
    6127            0 :       S1I = CYI(1)
    6128            0 :       S2R = CYR(2)
    6129            0 :       S2I = CYI(2)
    6130            0 :       CSR = CSRR(IFLAG)
    6131            0 :       ASCLE = BRY(IFLAG)
    6132            0 :       FN = DBLE(FLOAT(INU+IL))
    6133            0 :       DO 290 I=1,IL
    6134            0 :         C2R = S2R
    6135            0 :         C2I = S2I
    6136            0 :         S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
    6137            0 :         S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
    6138            0 :         S1R = C2R
    6139            0 :         S1I = C2I
    6140            0 :         FN = FN - 1.0D0
    6141            0 :         C2R = S2R*CSR
    6142            0 :         C2I = S2I*CSR
    6143            0 :         CKR = C2R
    6144            0 :         CKI = C2I
    6145            0 :         C1R = YR(KK)
    6146            0 :         C1I = YI(KK)
    6147            0 :         IF (KODE.EQ.1) GO TO 280
    6148            0 :         CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
    6149            0 :         NZ = NZ + NW
    6150              :   280   CONTINUE
    6151            0 :         YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
    6152            0 :         YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
    6153            0 :         KK = KK - 1
    6154            0 :         CSPNR = -CSPNR
    6155            0 :         CSPNI = -CSPNI
    6156            0 :         IF (IFLAG.GE.3) GO TO 290
    6157            0 :         C2R = DABS(CKR)
    6158            0 :         C2I = DABS(CKI)
    6159            0 :         C2M = DMAX1(C2R,C2I)
    6160            0 :         IF (C2M.LE.ASCLE) GO TO 290
    6161            0 :         IFLAG = IFLAG + 1
    6162            0 :         ASCLE = BRY(IFLAG)
    6163            0 :         S1R = S1R*CSR
    6164            0 :         S1I = S1I*CSR
    6165              :         S2R = CKR
    6166              :         S2I = CKI
    6167            0 :         S1R = S1R*CSSR(IFLAG)
    6168            0 :         S1I = S1I*CSSR(IFLAG)
    6169            0 :         S2R = S2R*CSSR(IFLAG)
    6170            0 :         S2I = S2I*CSSR(IFLAG)
    6171            0 :         CSR = CSRR(IFLAG)
    6172            0 :   290 CONTINUE
    6173            0 :       RETURN
    6174              :   300 CONTINUE
    6175            0 :       NZ = -1
    6176            0 :       RETURN
    6177              :       END SUBROUTINE ZUNK1
    6178              : 
    6179            0 :       SUBROUTINE ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
    6180              :      & ALIM)
    6181              : !C***BEGIN PROLOGUE  ZUNK2
    6182              : !C***REFER TO  ZBESK
    6183              : !C
    6184              : !C     ZUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
    6185              : !C     RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
    6186              : !C     UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN)
    6187              : !C     WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR
    6188              : !C     -1. HERE ZN=ZR*I OR -ZR*I WHERE ZR=Z IF Z IS IN THE RIGHT
    6189              : !C     HALF PLANE OR ZR=-Z IF Z IS IN THE LEFT HALF PLANE. MR INDIC-
    6190              : !C     ATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
    6191              : !C     NZ=-1 MEANS AN OVERFLOW WILL OCCUR
    6192              : !C
    6193              : !C***ROUTINES CALLED  ZAIRY,ZKSCL,ZS1S2,ZUCHK,ZUNHJ,D1MACH,AZABS
    6194              : !C***END PROLOGUE  ZUNK2
    6195              : !C     COMPLEX AI,ARG,ARGD,ASUM,ASUMD,BSUM,BSUMD,CFN,CI,CIP,CK,CONE,CRSC,
    6196              : !C    *CR1,CR2,CS,CSCL,CSGN,CSPN,CSR,CSS,CY,CZERO,C1,C2,DAI,PHI,PHID,RZ,
    6197              : !C    *S1,S2,Y,Z,ZB,ZETA1,ZETA1D,ZETA2,ZETA2D,ZN,ZR
    6198              :       DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGDI, &
    6199              :      & ARGDR, ARGI, ARGR, ASC, ASCLE, ASUMDI, ASUMDR, ASUMI, ASUMR, &
    6200              :      & BRY, BSUMDI, BSUMDR, BSUMI, BSUMR, CAR, CIPI, CIPR, CKI, CKR, &
    6201              :      & CONER, CRSC, CR1I, CR1R, CR2I, CR2R, CSCL, CSGNI, CSI, &
    6202              :      & CSPNI, CSPNR, CSR, CSRR, CSSR, CYI, CYR, C1I, C1R, C2I, C2M, &
    6203              :      & C2R, DAII, DAIR, ELIM, FMR, FN, FNF, FNU, HPI, PHIDI, PHIDR, &
    6204              :      & PHII, PHIR, PI, PTI, PTR, RAST, RAZR, RS1, RZI, RZR, SAR, SGN, &
    6205              :      & STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, YY, ZBI, ZBR, ZEROI, &
    6206              :      & ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZET1DI, ZET1DR, ZET2DI, &
    6207              :      & ZET2DR, ZI, ZNI, ZNR, ZR, ZRI, ZRR!, D1MACH, AZABS
    6208              :       INTEGER I, IB, IFLAG, IFN, IL, IN, INU, IUF, K, KDFLG, KFLAG, KK, &
    6209              :      & KODE, MR, N, NAI, NDAI, NW, NZ, IDUM, J, IPARD, IC
    6210              :       DIMENSION BRY(3), YR(N), YI(N), ASUMR(2), ASUMI(2), BSUMR(2), &
    6211              :      & BSUMI(2), PHIR(2), PHII(2), ARGR(2), ARGI(2), ZETA1R(2), &
    6212              :      & ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2), CIPR(4), &
    6213              :      & CIPI(4), CSSR(3), CSRR(3)
    6214              :       DATA ZEROR,ZEROI,CONER,CR1R,CR1I,CR2R,CR2I / &
    6215              :      &         0.0D0, 0.0D0, 1.0D0, &
    6216              :      & 1.0D0,1.73205080756887729D0 , -0.5D0,-8.66025403784438647D-01 /
    6217              :       DATA HPI, PI, AIC / &
    6218              :      &     1.57079632679489662D+00,     3.14159265358979324D+00, &
    6219              :      &     1.26551212348464539D+00/
    6220              :       DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4), &
    6221              :      & CIPI(4) / &
    6222              :      &  1.0D0,0.0D0 ,  0.0D0,-1.0D0 ,  -1.0D0,0.0D0 ,  0.0D0,1.0D0 /
    6223              : !C
    6224            0 :       KDFLG = 1
    6225            0 :       NZ = 0
    6226              : !C-----------------------------------------------------------------------
    6227              : !C     EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
    6228              : !C     THE UNDERFLOW LIMIT
    6229              : !C-----------------------------------------------------------------------
    6230            0 :       CSCL = 1.0D0/TOL
    6231            0 :       CRSC = TOL
    6232            0 :       CSSR(1) = CSCL
    6233            0 :       CSSR(2) = CONER
    6234            0 :       CSSR(3) = CRSC
    6235            0 :       CSRR(1) = CRSC
    6236            0 :       CSRR(2) = CONER
    6237            0 :       CSRR(3) = CSCL
    6238            0 :       BRY(1) = 1.0D+3*D1MACH(1)/TOL
    6239            0 :       BRY(2) = 1.0D0/BRY(1)
    6240            0 :       BRY(3) = D1MACH(2)
    6241            0 :       ZRR = ZR
    6242            0 :       ZRI = ZI
    6243            0 :       IF (ZR.GE.0.0D0) GO TO 10
    6244            0 :       ZRR = -ZR
    6245            0 :       ZRI = -ZI
    6246              :    10 CONTINUE
    6247            0 :       YY = ZRI
    6248            0 :       ZNR = ZRI
    6249            0 :       ZNI = -ZRR
    6250            0 :       ZBR = ZRR
    6251            0 :       ZBI = ZRI
    6252            0 :       INU = INT(SNGL(FNU))
    6253            0 :       FNF = FNU - DBLE(FLOAT(INU))
    6254            0 :       ANG = -HPI*FNF
    6255            0 :       CAR = DCOS(ANG)
    6256            0 :       SAR = DSIN(ANG)
    6257            0 :       C2R = HPI*SAR
    6258            0 :       C2I = -HPI*CAR
    6259            0 :       KK = MOD(INU,4) + 1
    6260            0 :       STR = C2R*CIPR(KK) - C2I*CIPI(KK)
    6261            0 :       STI = C2R*CIPI(KK) + C2I*CIPR(KK)
    6262            0 :       CSR = CR1R*STR - CR1I*STI
    6263            0 :       CSI = CR1R*STI + CR1I*STR
    6264            0 :       IF (YY.GT.0.0D0) GO TO 20
    6265            0 :       ZNR = -ZNR
    6266            0 :       ZBI = -ZBI
    6267              :    20 CONTINUE
    6268              : !C-----------------------------------------------------------------------
    6269              : !C     K(FNU,Z) IS COMPUTED FROM H(2,FNU,-I*Z) WHERE Z IS IN THE FIRST
    6270              : !C     QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
    6271              : !C     CONJUGATION SINCE THE K FUNCTION IS REAL ON THE POSITIVE REAL AXIS
    6272              : !C-----------------------------------------------------------------------
    6273            0 :       J = 2
    6274            0 :       DO 80 I=1,N
    6275              : !C-----------------------------------------------------------------------
    6276              : !C     J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
    6277              : !C-----------------------------------------------------------------------
    6278            0 :         J = 3 - J
    6279            0 :         FN = FNU + DBLE(FLOAT(I-1))
    6280              :         CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR(J), PHII(J), ARGR(J), &
    6281              :      &   ARGI(J), ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), ASUMR(J), &
    6282            0 :      &   ASUMI(J), BSUMR(J), BSUMI(J))
    6283            0 :         IF (KODE.EQ.1) GO TO 30
    6284            0 :         STR = ZBR + ZETA2R(J)
    6285            0 :         STI = ZBI + ZETA2I(J)
    6286            0 :         RAST = FN/AZABS(STR,STI)
    6287            0 :         STR = STR*RAST*RAST
    6288            0 :         STI = -STI*RAST*RAST
    6289            0 :         S1R = ZETA1R(J) - STR
    6290            0 :         S1I = ZETA1I(J) - STI
    6291            0 :         GO TO 40
    6292              :    30   CONTINUE
    6293            0 :         S1R = ZETA1R(J) - ZETA2R(J)
    6294            0 :         S1I = ZETA1I(J) - ZETA2I(J)
    6295              :    40   CONTINUE
    6296              : !C-----------------------------------------------------------------------
    6297              : !C     TEST FOR UNDERFLOW AND OVERFLOW
    6298              : !C-----------------------------------------------------------------------
    6299            0 :         RS1 = S1R
    6300            0 :         IF (DABS(RS1).GT.ELIM) GO TO 70
    6301            0 :         IF (KDFLG.EQ.1) KFLAG = 2
    6302            0 :         IF (DABS(RS1).LT.ALIM) GO TO 50
    6303              : !C-----------------------------------------------------------------------
    6304              : !C     REFINE  TEST AND SCALE
    6305              : !C-----------------------------------------------------------------------
    6306            0 :         APHI = AZABS(PHIR(J),PHII(J))
    6307            0 :         AARG = AZABS(ARGR(J),ARGI(J))
    6308            0 :         RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
    6309            0 :         IF (DABS(RS1).GT.ELIM) GO TO 70
    6310            0 :         IF (KDFLG.EQ.1) KFLAG = 1
    6311            0 :         IF (RS1.LT.0.0D0) GO TO 50
    6312            0 :         IF (KDFLG.EQ.1) KFLAG = 3
    6313              :    50   CONTINUE
    6314              : !C-----------------------------------------------------------------------
    6315              : !C     SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
    6316              : !C     EXPONENT EXTREMES
    6317              : !C-----------------------------------------------------------------------
    6318            0 :         C2R = ARGR(J)*CR2R - ARGI(J)*CR2I
    6319            0 :         C2I = ARGR(J)*CR2I + ARGI(J)*CR2R
    6320            0 :         CALL ZAIRY(C2R, C2I, 0, 2, AIR, AII, NAI, IDUM)
    6321            0 :         CALL ZAIRY(C2R, C2I, 1, 2, DAIR, DAII, NDAI, IDUM)
    6322            0 :         STR = DAIR*BSUMR(J) - DAII*BSUMI(J)
    6323            0 :         STI = DAIR*BSUMI(J) + DAII*BSUMR(J)
    6324            0 :         PTR = STR*CR2R - STI*CR2I
    6325            0 :         PTI = STR*CR2I + STI*CR2R
    6326            0 :         STR = PTR + (AIR*ASUMR(J)-AII*ASUMI(J))
    6327            0 :         STI = PTI + (AIR*ASUMI(J)+AII*ASUMR(J))
    6328            0 :         PTR = STR*PHIR(J) - STI*PHII(J)
    6329            0 :         PTI = STR*PHII(J) + STI*PHIR(J)
    6330            0 :         S2R = PTR*CSR - PTI*CSI
    6331            0 :         S2I = PTR*CSI + PTI*CSR
    6332            0 :         STR = DEXP(S1R)*CSSR(KFLAG)
    6333            0 :         S1R = STR*DCOS(S1I)
    6334            0 :         S1I = STR*DSIN(S1I)
    6335            0 :         STR = S2R*S1R - S2I*S1I
    6336            0 :         S2I = S1R*S2I + S2R*S1I
    6337            0 :         S2R = STR
    6338            0 :         IF (KFLAG.NE.1) GO TO 60
    6339            0 :         CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
    6340            0 :         IF (NW.NE.0) GO TO 70
    6341              :    60   CONTINUE
    6342            0 :         IF (YY.LE.0.0D0) S2I = -S2I
    6343            0 :         CYR(KDFLG) = S2R
    6344            0 :         CYI(KDFLG) = S2I
    6345            0 :         YR(I) = S2R*CSRR(KFLAG)
    6346            0 :         YI(I) = S2I*CSRR(KFLAG)
    6347            0 :         STR = CSI
    6348            0 :         CSI = -CSR
    6349            0 :         CSR = STR
    6350            0 :         IF (KDFLG.EQ.2) GO TO 85
    6351              :         KDFLG = 2
    6352            0 :         GO TO 80
    6353              :    70   CONTINUE
    6354            0 :         IF (RS1.GT.0.0D0) GO TO 320
    6355              : !C-----------------------------------------------------------------------
    6356              : !C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
    6357              : !C-----------------------------------------------------------------------
    6358            0 :         IF (ZR.LT.0.0D0) GO TO 320
    6359            0 :         KDFLG = 1
    6360            0 :         YR(I)=ZEROR
    6361            0 :         YI(I)=ZEROI
    6362            0 :         NZ=NZ+1
    6363            0 :         STR = CSI
    6364            0 :         CSI =-CSR
    6365            0 :         CSR = STR
    6366            0 :         IF (I.EQ.1) GO TO 80
    6367            0 :         IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 80
    6368            0 :         YR(I-1)=ZEROR
    6369            0 :         YI(I-1)=ZEROI
    6370            0 :         NZ=NZ+1
    6371            0 :    80 CONTINUE
    6372            0 :       I = N
    6373              :    85 CONTINUE
    6374            0 :       RAZR = 1.0D0/AZABS(ZRR,ZRI)
    6375            0 :       STR = ZRR*RAZR
    6376            0 :       STI = -ZRI*RAZR
    6377            0 :       RZR = (STR+STR)*RAZR
    6378            0 :       RZI = (STI+STI)*RAZR
    6379            0 :       CKR = FN*RZR
    6380            0 :       CKI = FN*RZI
    6381            0 :       IB = I + 1
    6382            0 :       IF (N.LT.IB) GO TO 180
    6383              : !C-----------------------------------------------------------------------
    6384              : !C     TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
    6385              : !C     ON UNDERFLOW.
    6386              : !C-----------------------------------------------------------------------
    6387            0 :       FN = FNU + DBLE(FLOAT(N-1))
    6388            0 :       IPARD = 1
    6389            0 :       IF (MR.NE.0) IPARD = 0
    6390              :       CALL ZUNHJ(ZNR, ZNI, FN, IPARD, TOL, PHIDR, PHIDI, ARGDR, ARGDI, &
    6391            0 :      & ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR, ASUMDI, BSUMDR, BSUMDI)
    6392            0 :       IF (KODE.EQ.1) GO TO 90
    6393            0 :       STR = ZBR + ZET2DR
    6394            0 :       STI = ZBI + ZET2DI
    6395            0 :       RAST = FN/AZABS(STR,STI)
    6396            0 :       STR = STR*RAST*RAST
    6397            0 :       STI = -STI*RAST*RAST
    6398            0 :       S1R = ZET1DR - STR
    6399            0 :       S1I = ZET1DI - STI
    6400            0 :       GO TO 100
    6401              :    90 CONTINUE
    6402            0 :       S1R = ZET1DR - ZET2DR
    6403            0 :       S1I = ZET1DI - ZET2DI
    6404              :   100 CONTINUE
    6405            0 :       RS1 = S1R
    6406            0 :       IF (DABS(RS1).GT.ELIM) GO TO 105
    6407            0 :       IF (DABS(RS1).LT.ALIM) GO TO 120
    6408              : !C----------------------------------------------------------------------------
    6409              : !C     REFINE ESTIMATE AND TEST
    6410              : !C-------------------------------------------------------------------------
    6411            0 :       APHI = AZABS(PHIDR,PHIDI)
    6412            0 :       RS1 = RS1+DLOG(APHI)
    6413            0 :       IF (DABS(RS1).LT.ELIM) GO TO 120
    6414              :   105 CONTINUE
    6415            0 :       IF (RS1.GT.0.0D0) GO TO 320
    6416              : !C-----------------------------------------------------------------------
    6417              : !C     FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
    6418              : !C-----------------------------------------------------------------------
    6419            0 :       IF (ZR.LT.0.0D0) GO TO 320
    6420            0 :       NZ = N
    6421            0 :       DO 106 I=1,N
    6422            0 :         YR(I) = ZEROR
    6423            0 :         YI(I) = ZEROI
    6424            0 :   106 CONTINUE
    6425            0 :       RETURN
    6426              :   120 CONTINUE
    6427            0 :       S1R = CYR(1)
    6428            0 :       S1I = CYI(1)
    6429            0 :       S2R = CYR(2)
    6430            0 :       S2I = CYI(2)
    6431            0 :       C1R = CSRR(KFLAG)
    6432            0 :       ASCLE = BRY(KFLAG)
    6433            0 :       DO 130 I=IB,N
    6434            0 :         C2R = S2R
    6435            0 :         C2I = S2I
    6436            0 :         S2R = CKR*C2R - CKI*C2I + S1R
    6437            0 :         S2I = CKR*C2I + CKI*C2R + S1I
    6438            0 :         S1R = C2R
    6439            0 :         S1I = C2I
    6440            0 :         CKR = CKR + RZR
    6441            0 :         CKI = CKI + RZI
    6442            0 :         C2R = S2R*C1R
    6443            0 :         C2I = S2I*C1R
    6444            0 :         YR(I) = C2R
    6445            0 :         YI(I) = C2I
    6446            0 :         IF (KFLAG.GE.3) GO TO 130
    6447            0 :         STR = DABS(C2R)
    6448            0 :         STI = DABS(C2I)
    6449            0 :         C2M = DMAX1(STR,STI)
    6450            0 :         IF (C2M.LE.ASCLE) GO TO 130
    6451            0 :         KFLAG = KFLAG + 1
    6452            0 :         ASCLE = BRY(KFLAG)
    6453            0 :         S1R = S1R*C1R
    6454            0 :         S1I = S1I*C1R
    6455              :         S2R = C2R
    6456              :         S2I = C2I
    6457            0 :         S1R = S1R*CSSR(KFLAG)
    6458            0 :         S1I = S1I*CSSR(KFLAG)
    6459            0 :         S2R = S2R*CSSR(KFLAG)
    6460            0 :         S2I = S2I*CSSR(KFLAG)
    6461            0 :         C1R = CSRR(KFLAG)
    6462            0 :   130 CONTINUE
    6463              :   180 CONTINUE
    6464            0 :       IF (MR.EQ.0) RETURN
    6465              : !C-----------------------------------------------------------------------
    6466              : !C     ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
    6467              : !C-----------------------------------------------------------------------
    6468            0 :       NZ = 0
    6469            0 :       FMR = DBLE(FLOAT(MR))
    6470            0 :       SGN = -DSIGN(PI,FMR)
    6471              : !C-----------------------------------------------------------------------
    6472              : !C     CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
    6473              : !C-----------------------------------------------------------------------
    6474            0 :       CSGNI = SGN
    6475            0 :       IF (YY.LE.0.0D0) CSGNI = -CSGNI
    6476            0 :       IFN = INU + N - 1
    6477            0 :       ANG = FNF*SGN
    6478            0 :       CSPNR = DCOS(ANG)
    6479            0 :       CSPNI = DSIN(ANG)
    6480            0 :       IF (MOD(IFN,2).EQ.0) GO TO 190
    6481            0 :       CSPNR = -CSPNR
    6482            0 :       CSPNI = -CSPNI
    6483              :   190 CONTINUE
    6484              : !C-----------------------------------------------------------------------
    6485              : !C     CS=COEFF OF THE J FUNCTION TO GET THE I FUNCTION. I(FNU,Z) IS
    6486              : !C     COMPUTED FROM EXP(I*FNU*HPI)*J(FNU,-I*Z) WHERE Z IS IN THE FIRST
    6487              : !C     QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
    6488              : !C     CONJUGATION SINCE THE I FUNCTION IS REAL ON THE POSITIVE REAL AXIS
    6489              : !C-----------------------------------------------------------------------
    6490            0 :       CSR = SAR*CSGNI
    6491            0 :       CSI = CAR*CSGNI
    6492            0 :       IN = MOD(IFN,4) + 1
    6493            0 :       C2R = CIPR(IN)
    6494            0 :       C2I = CIPI(IN)
    6495            0 :       STR = CSR*C2R + CSI*C2I
    6496            0 :       CSI = -CSR*C2I + CSI*C2R
    6497            0 :       CSR = STR
    6498            0 :       ASC = BRY(1)
    6499            0 :       IUF = 0
    6500            0 :       KK = N
    6501            0 :       KDFLG = 1
    6502            0 :       IB = IB - 1
    6503            0 :       IC = IB - 1
    6504            0 :       DO 290 K=1,N
    6505            0 :         FN = FNU + DBLE(FLOAT(KK-1))
    6506              : !C-----------------------------------------------------------------------
    6507              : !C     LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
    6508              : !C     FUNCTION ABOVE
    6509              : !C-----------------------------------------------------------------------
    6510            0 :         IF (N.GT.2) GO TO 175
    6511              :   172   CONTINUE
    6512            0 :         PHIDR = PHIR(J)
    6513            0 :         PHIDI = PHII(J)
    6514            0 :         ARGDR = ARGR(J)
    6515            0 :         ARGDI = ARGI(J)
    6516            0 :         ZET1DR = ZETA1R(J)
    6517            0 :         ZET1DI = ZETA1I(J)
    6518            0 :         ZET2DR = ZETA2R(J)
    6519            0 :         ZET2DI = ZETA2I(J)
    6520            0 :         ASUMDR = ASUMR(J)
    6521            0 :         ASUMDI = ASUMI(J)
    6522            0 :         BSUMDR = BSUMR(J)
    6523            0 :         BSUMDI = BSUMI(J)
    6524            0 :         J = 3 - J
    6525            0 :         GO TO 210
    6526              :   175   CONTINUE
    6527            0 :         IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 210
    6528            0 :         IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
    6529              :         CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIDR, PHIDI, ARGDR, &
    6530              :      &   ARGDI, ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR, &
    6531            0 :      &   ASUMDI, BSUMDR, BSUMDI)
    6532              :   210   CONTINUE
    6533            0 :         IF (KODE.EQ.1) GO TO 220
    6534            0 :         STR = ZBR + ZET2DR
    6535            0 :         STI = ZBI + ZET2DI
    6536            0 :         RAST = FN/AZABS(STR,STI)
    6537            0 :         STR = STR*RAST*RAST
    6538            0 :         STI = -STI*RAST*RAST
    6539            0 :         S1R = -ZET1DR + STR
    6540            0 :         S1I = -ZET1DI + STI
    6541            0 :         GO TO 230
    6542              :   220   CONTINUE
    6543            0 :         S1R = -ZET1DR + ZET2DR
    6544            0 :         S1I = -ZET1DI + ZET2DI
    6545              :   230   CONTINUE
    6546              : !C-----------------------------------------------------------------------
    6547              : !C     TEST FOR UNDERFLOW AND OVERFLOW
    6548              : !C-----------------------------------------------------------------------
    6549            0 :         RS1 = S1R
    6550            0 :         IF (DABS(RS1).GT.ELIM) GO TO 280
    6551            0 :         IF (KDFLG.EQ.1) IFLAG = 2
    6552            0 :         IF (DABS(RS1).LT.ALIM) GO TO 240
    6553              : !C-----------------------------------------------------------------------
    6554              : !C     REFINE  TEST AND SCALE
    6555              : !C-----------------------------------------------------------------------
    6556            0 :         APHI = AZABS(PHIDR,PHIDI)
    6557            0 :         AARG = AZABS(ARGDR,ARGDI)
    6558            0 :         RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
    6559            0 :         IF (DABS(RS1).GT.ELIM) GO TO 280
    6560            0 :         IF (KDFLG.EQ.1) IFLAG = 1
    6561            0 :         IF (RS1.LT.0.0D0) GO TO 240
    6562            0 :         IF (KDFLG.EQ.1) IFLAG = 3
    6563              :   240   CONTINUE
    6564            0 :         CALL ZAIRY(ARGDR, ARGDI, 0, 2, AIR, AII, NAI, IDUM)
    6565            0 :         CALL ZAIRY(ARGDR, ARGDI, 1, 2, DAIR, DAII, NDAI, IDUM)
    6566            0 :         STR = DAIR*BSUMDR - DAII*BSUMDI
    6567            0 :         STI = DAIR*BSUMDI + DAII*BSUMDR
    6568            0 :         STR = STR + (AIR*ASUMDR-AII*ASUMDI)
    6569            0 :         STI = STI + (AIR*ASUMDI+AII*ASUMDR)
    6570            0 :         PTR = STR*PHIDR - STI*PHIDI
    6571            0 :         PTI = STR*PHIDI + STI*PHIDR
    6572            0 :         S2R = PTR*CSR - PTI*CSI
    6573            0 :         S2I = PTR*CSI + PTI*CSR
    6574            0 :         STR = DEXP(S1R)*CSSR(IFLAG)
    6575            0 :         S1R = STR*DCOS(S1I)
    6576            0 :         S1I = STR*DSIN(S1I)
    6577            0 :         STR = S2R*S1R - S2I*S1I
    6578            0 :         S2I = S2R*S1I + S2I*S1R
    6579            0 :         S2R = STR
    6580            0 :         IF (IFLAG.NE.1) GO TO 250
    6581            0 :         CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
    6582            0 :         IF (NW.EQ.0) GO TO 250
    6583            0 :         S2R = ZEROR
    6584            0 :         S2I = ZEROI
    6585              :   250   CONTINUE
    6586            0 :         IF (YY.LE.0.0D0) S2I = -S2I
    6587            0 :         CYR(KDFLG) = S2R
    6588            0 :         CYI(KDFLG) = S2I
    6589            0 :         C2R = S2R
    6590            0 :         C2I = S2I
    6591            0 :         S2R = S2R*CSRR(IFLAG)
    6592            0 :         S2I = S2I*CSRR(IFLAG)
    6593              : !C-----------------------------------------------------------------------
    6594              : !C     ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
    6595              : !C-----------------------------------------------------------------------
    6596            0 :         S1R = YR(KK)
    6597            0 :         S1I = YI(KK)
    6598            0 :         IF (KODE.EQ.1) GO TO 270
    6599            0 :         CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
    6600            0 :         NZ = NZ + NW
    6601              :   270   CONTINUE
    6602            0 :         YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
    6603            0 :         YI(KK) = S1R*CSPNI + S1I*CSPNR + S2I
    6604            0 :         KK = KK - 1
    6605            0 :         CSPNR = -CSPNR
    6606            0 :         CSPNI = -CSPNI
    6607            0 :         STR = CSI
    6608            0 :         CSI = -CSR
    6609            0 :         CSR = STR
    6610            0 :         IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
    6611              :         KDFLG = 1
    6612            0 :         GO TO 290
    6613              :   255   CONTINUE
    6614            0 :         IF (KDFLG.EQ.2) GO TO 295
    6615              :         KDFLG = 2
    6616            0 :         GO TO 290
    6617              :   280   CONTINUE
    6618            0 :         IF (RS1.GT.0.0D0) GO TO 320
    6619            0 :         S2R = ZEROR
    6620            0 :         S2I = ZEROI
    6621            0 :         GO TO 250
    6622            0 :   290 CONTINUE
    6623            0 :       K = N
    6624              :   295 CONTINUE
    6625            0 :       IL = N - K
    6626            0 :       IF (IL.EQ.0) RETURN
    6627              : !C-----------------------------------------------------------------------
    6628              : !C     RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
    6629              : !C     K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
    6630              : !C     INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
    6631              : !C-----------------------------------------------------------------------
    6632            0 :       S1R = CYR(1)
    6633            0 :       S1I = CYI(1)
    6634            0 :       S2R = CYR(2)
    6635            0 :       S2I = CYI(2)
    6636            0 :       CSR = CSRR(IFLAG)
    6637            0 :       ASCLE = BRY(IFLAG)
    6638            0 :       FN = DBLE(FLOAT(INU+IL))
    6639            0 :       DO 310 I=1,IL
    6640            0 :         C2R = S2R
    6641            0 :         C2I = S2I
    6642            0 :         S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
    6643            0 :         S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
    6644            0 :         S1R = C2R
    6645            0 :         S1I = C2I
    6646            0 :         FN = FN - 1.0D0
    6647            0 :         C2R = S2R*CSR
    6648            0 :         C2I = S2I*CSR
    6649            0 :         CKR = C2R
    6650            0 :         CKI = C2I
    6651            0 :         C1R = YR(KK)
    6652            0 :         C1I = YI(KK)
    6653            0 :         IF (KODE.EQ.1) GO TO 300
    6654            0 :         CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
    6655            0 :         NZ = NZ + NW
    6656              :   300   CONTINUE
    6657            0 :         YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
    6658            0 :         YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
    6659            0 :         KK = KK - 1
    6660            0 :         CSPNR = -CSPNR
    6661            0 :         CSPNI = -CSPNI
    6662            0 :         IF (IFLAG.GE.3) GO TO 310
    6663            0 :         C2R = DABS(CKR)
    6664            0 :         C2I = DABS(CKI)
    6665            0 :         C2M = DMAX1(C2R,C2I)
    6666            0 :         IF (C2M.LE.ASCLE) GO TO 310
    6667            0 :         IFLAG = IFLAG + 1
    6668            0 :         ASCLE = BRY(IFLAG)
    6669            0 :         S1R = S1R*CSR
    6670            0 :         S1I = S1I*CSR
    6671              :         S2R = CKR
    6672              :         S2I = CKI
    6673            0 :         S1R = S1R*CSSR(IFLAG)
    6674            0 :         S1I = S1I*CSSR(IFLAG)
    6675            0 :         S2R = S2R*CSSR(IFLAG)
    6676            0 :         S2I = S2I*CSSR(IFLAG)
    6677            0 :         CSR = CSRR(IFLAG)
    6678            0 :   310 CONTINUE
    6679            0 :       RETURN
    6680              :   320 CONTINUE
    6681            0 :       NZ = -1
    6682            0 :       RETURN
    6683              :       END SUBROUTINE ZUNK2
    6684              : 
    6685              : !----------------------------------------------------------------------
    6686              : 
    6687              : 
    6688              : END MODULE m_bessel2
    6689              : !!***
    6690              : 
        

Generated by: LCOV version 2.3-1