123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- *DECK CUOIK
- SUBROUTINE CUOIK (Z, FNU, KODE, IKFLG, N, Y, NUF, TOL, ELIM, ALIM)
- C***BEGIN PROLOGUE CUOIK
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to CBESH, CBESI and CBESK
- C***LIBRARY SLATEC
- C***TYPE ALL (CUOIK-A, ZUOIK-A)
- C***AUTHOR Amos, D. E., (SNL)
- C***DESCRIPTION
- C
- C CUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
- C EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
- C (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
- C WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
- C EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
- C THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
- C MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE
- C EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
- C EXP(-ELIM)/TOL
- C
- C IKFLG=1 MEANS THE I SEQUENCE IS TESTED
- C =2 MEANS THE K SEQUENCE IS TESTED
- C NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
- C =-1 MEANS AN OVERFLOW WOULD OCCUR
- C IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
- C THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
- C IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
- C IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
- C ANOTHER ROUTINE
- C
- C***SEE ALSO CBESH, CBESI, CBESK
- C***ROUTINES CALLED CUCHK, CUNHJ, CUNIK, R1MACH
- C***REVISION HISTORY (YYMMDD)
- C 830501 DATE WRITTEN
- C 910415 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE CUOIK
- COMPLEX ARG, ASUM, BSUM, CWRK, CZ, CZERO, PHI, SUM, Y, Z, ZB,
- * ZETA1, ZETA2, ZN, ZR
- REAL AARG, AIC, ALIM, APHI, ASCLE, AX, AY, ELIM, FNN, FNU, GNN,
- * GNU, RCZ, TOL, X, YY, R1MACH
- INTEGER I, IFORM, IKFLG, INIT, KODE, N, NN, NUF, NW
- DIMENSION Y(N), CWRK(16)
- DATA CZERO / (0.0E0,0.0E0) /
- DATA AIC / 1.265512123484645396E+00 /
- C***FIRST EXECUTABLE STATEMENT CUOIK
- NUF = 0
- NN = N
- X = REAL(Z)
- ZR = Z
- IF (X.LT.0.0E0) ZR = -Z
- ZB = ZR
- YY = AIMAG(ZR)
- AX = ABS(X)*1.7321E0
- AY = ABS(YY)
- IFORM = 1
- IF (AY.GT.AX) IFORM = 2
- GNU = MAX(FNU,1.0E0)
- IF (IKFLG.EQ.1) GO TO 10
- FNN = NN
- GNN = FNU + FNN - 1.0E0
- GNU = MAX(GNN,FNN)
- 10 CONTINUE
- C-----------------------------------------------------------------------
- C ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
- C REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
- C THE SIGN OF THE IMAGINARY PART CORRECT.
- C-----------------------------------------------------------------------
- IF (IFORM.EQ.2) GO TO 20
- INIT = 0
- CALL CUNIK(ZR, GNU, IKFLG, 1, TOL, INIT, PHI, ZETA1, ZETA2, SUM,
- * CWRK)
- CZ = -ZETA1 + ZETA2
- GO TO 40
- 20 CONTINUE
- ZN = -ZR*CMPLX(0.0E0,1.0E0)
- IF (YY.GT.0.0E0) GO TO 30
- ZN = CONJG(-ZN)
- 30 CONTINUE
- CALL CUNHJ(ZN, GNU, 1, TOL, PHI, ARG, ZETA1, ZETA2, ASUM, BSUM)
- CZ = -ZETA1 + ZETA2
- AARG = ABS(ARG)
- 40 CONTINUE
- IF (KODE.EQ.2) CZ = CZ - ZB
- IF (IKFLG.EQ.2) CZ = -CZ
- APHI = ABS(PHI)
- RCZ = REAL(CZ)
- C-----------------------------------------------------------------------
- C OVERFLOW TEST
- C-----------------------------------------------------------------------
- IF (RCZ.GT.ELIM) GO TO 170
- IF (RCZ.LT.ALIM) GO TO 50
- RCZ = RCZ + ALOG(APHI)
- IF (IFORM.EQ.2) RCZ = RCZ - 0.25E0*ALOG(AARG) - AIC
- IF (RCZ.GT.ELIM) GO TO 170
- GO TO 100
- 50 CONTINUE
- C-----------------------------------------------------------------------
- C UNDERFLOW TEST
- C-----------------------------------------------------------------------
- IF (RCZ.LT.(-ELIM)) GO TO 60
- IF (RCZ.GT.(-ALIM)) GO TO 100
- RCZ = RCZ + ALOG(APHI)
- IF (IFORM.EQ.2) RCZ = RCZ - 0.25E0*ALOG(AARG) - AIC
- IF (RCZ.GT.(-ELIM)) GO TO 80
- 60 CONTINUE
- DO 70 I=1,NN
- Y(I) = CZERO
- 70 CONTINUE
- NUF = NN
- RETURN
- 80 CONTINUE
- ASCLE = 1.0E+3*R1MACH(1)/TOL
- CZ = CZ + CLOG(PHI)
- IF (IFORM.EQ.1) GO TO 90
- CZ = CZ - CMPLX(0.25E0,0.0E0)*CLOG(ARG) - CMPLX(AIC,0.0E0)
- 90 CONTINUE
- AX = EXP(RCZ)/TOL
- AY = AIMAG(CZ)
- CZ = CMPLX(AX,0.0E0)*CMPLX(COS(AY),SIN(AY))
- CALL CUCHK(CZ, NW, ASCLE, TOL)
- IF (NW.EQ.1) GO TO 60
- 100 CONTINUE
- IF (IKFLG.EQ.2) RETURN
- IF (N.EQ.1) RETURN
- C-----------------------------------------------------------------------
- C SET UNDERFLOWS ON I SEQUENCE
- C-----------------------------------------------------------------------
- 110 CONTINUE
- GNU = FNU + (NN-1)
- IF (IFORM.EQ.2) GO TO 120
- INIT = 0
- CALL CUNIK(ZR, GNU, IKFLG, 1, TOL, INIT, PHI, ZETA1, ZETA2, SUM,
- * CWRK)
- CZ = -ZETA1 + ZETA2
- GO TO 130
- 120 CONTINUE
- CALL CUNHJ(ZN, GNU, 1, TOL, PHI, ARG, ZETA1, ZETA2, ASUM, BSUM)
- CZ = -ZETA1 + ZETA2
- AARG = ABS(ARG)
- 130 CONTINUE
- IF (KODE.EQ.2) CZ = CZ - ZB
- APHI = ABS(PHI)
- RCZ = REAL(CZ)
- IF (RCZ.LT.(-ELIM)) GO TO 140
- IF (RCZ.GT.(-ALIM)) RETURN
- RCZ = RCZ + ALOG(APHI)
- IF (IFORM.EQ.2) RCZ = RCZ - 0.25E0*ALOG(AARG) - AIC
- IF (RCZ.GT.(-ELIM)) GO TO 150
- 140 CONTINUE
- Y(NN) = CZERO
- NN = NN - 1
- NUF = NUF + 1
- IF (NN.EQ.0) RETURN
- GO TO 110
- 150 CONTINUE
- ASCLE = 1.0E+3*R1MACH(1)/TOL
- CZ = CZ + CLOG(PHI)
- IF (IFORM.EQ.1) GO TO 160
- CZ = CZ - CMPLX(0.25E0,0.0E0)*CLOG(ARG) - CMPLX(AIC,0.0E0)
- 160 CONTINUE
- AX = EXP(RCZ)/TOL
- AY = AIMAG(CZ)
- CZ = CMPLX(AX,0.0E0)*CMPLX(COS(AY),SIN(AY))
- CALL CUCHK(CZ, NW, ASCLE, TOL)
- IF (NW.EQ.1) GO TO 140
- RETURN
- 170 CONTINUE
- NUF = -1
- RETURN
- END
|