123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- *DECK ZBINU
- SUBROUTINE ZBINU (ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL,
- + TOL, ELIM, ALIM)
- C***BEGIN PROLOGUE ZBINU
- C***SUBSIDIARY
- C***PURPOSE Subsidiary to ZAIRY, ZBESH, ZBESI, ZBESJ, ZBESK and ZBIRY
- C***LIBRARY SLATEC
- C***TYPE ALL (CBINU-A, ZBINU-A)
- C***AUTHOR Amos, D. E., (SNL)
- C***DESCRIPTION
- C
- C ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
- C
- C***SEE ALSO ZAIRY, ZBESH, ZBESI, ZBESJ, ZBESK, ZBIRY
- C***ROUTINES CALLED ZABS, ZASYI, ZBUNI, ZMLRI, ZSERI, ZUOIK, ZWRSK
- C***REVISION HISTORY (YYMMDD)
- C 830501 DATE WRITTEN
- C 910415 Prologue converted to Version 4.0 format. (BAB)
- C***END PROLOGUE ZBINU
- DOUBLE PRECISION ALIM, AZ, CWI, CWR, CYI, CYR, DFNU, ELIM, FNU,
- * FNUL, RL, TOL, ZEROI, ZEROR, ZI, ZR, ZABS
- INTEGER I, INW, KODE, N, NLAST, NN, NUI, NW, NZ
- DIMENSION CYR(N), CYI(N), CWR(2), CWI(2)
- EXTERNAL ZABS
- DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
- C***FIRST EXECUTABLE STATEMENT ZBINU
- NZ = 0
- AZ = ZABS(ZR,ZI)
- NN = N
- DFNU = FNU + (N-1)
- IF (AZ.LE.2.0D0) GO TO 10
- IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
- 10 CONTINUE
- C-----------------------------------------------------------------------
- C POWER SERIES
- C-----------------------------------------------------------------------
- CALL ZSERI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
- INW = ABS(NW)
- NZ = NZ + INW
- NN = NN - INW
- IF (NN.EQ.0) RETURN
- IF (NW.GE.0) GO TO 120
- DFNU = FNU + (NN-1)
- 20 CONTINUE
- IF (AZ.LT.RL) GO TO 40
- IF (DFNU.LE.1.0D0) GO TO 30
- IF (AZ+AZ.LT.DFNU*DFNU) GO TO 50
- C-----------------------------------------------------------------------
- C ASYMPTOTIC EXPANSION FOR LARGE Z
- C-----------------------------------------------------------------------
- 30 CONTINUE
- CALL ZASYI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, RL, TOL, ELIM,
- * ALIM)
- IF (NW.LT.0) GO TO 130
- GO TO 120
- 40 CONTINUE
- IF (DFNU.LE.1.0D0) GO TO 70
- 50 CONTINUE
- C-----------------------------------------------------------------------
- C OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
- C-----------------------------------------------------------------------
- CALL ZUOIK(ZR, ZI, FNU, KODE, 1, NN, CYR, CYI, NW, TOL, ELIM,
- * ALIM)
- IF (NW.LT.0) GO TO 130
- NZ = NZ + NW
- NN = NN - NW
- IF (NN.EQ.0) RETURN
- DFNU = FNU+(NN-1)
- IF (DFNU.GT.FNUL) GO TO 110
- IF (AZ.GT.FNUL) GO TO 110
- 60 CONTINUE
- IF (AZ.GT.RL) GO TO 80
- 70 CONTINUE
- C-----------------------------------------------------------------------
- C MILLER ALGORITHM NORMALIZED BY THE SERIES
- C-----------------------------------------------------------------------
- CALL ZMLRI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL)
- IF(NW.LT.0) GO TO 130
- GO TO 120
- 80 CONTINUE
- C-----------------------------------------------------------------------
- C MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
- C-----------------------------------------------------------------------
- C-----------------------------------------------------------------------
- C OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
- C-----------------------------------------------------------------------
- CALL ZUOIK(ZR, ZI, FNU, KODE, 2, 2, CWR, CWI, NW, TOL, ELIM,
- * ALIM)
- IF (NW.GE.0) GO TO 100
- NZ = NN
- DO 90 I=1,NN
- CYR(I) = ZEROR
- CYI(I) = ZEROI
- 90 CONTINUE
- RETURN
- 100 CONTINUE
- IF (NW.GT.0) GO TO 130
- CALL ZWRSK(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, CWR, CWI, TOL,
- * ELIM, ALIM)
- IF (NW.LT.0) GO TO 130
- GO TO 120
- 110 CONTINUE
- C-----------------------------------------------------------------------
- C INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
- C-----------------------------------------------------------------------
- NUI = FNUL-DFNU + 1
- NUI = MAX(NUI,0)
- CALL ZBUNI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, NUI, NLAST, FNUL,
- * TOL, ELIM, ALIM)
- IF (NW.LT.0) GO TO 130
- NZ = NZ + NW
- IF (NLAST.EQ.0) GO TO 120
- NN = NLAST
- GO TO 60
- 120 CONTINUE
- RETURN
- 130 CONTINUE
- NZ = -1
- IF(NW.EQ.(-2)) NZ=-2
- RETURN
- END
|