1      SUBROUTINE ZBINU(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL,
2     * TOL, ELIM, ALIM)
3C***BEGIN PROLOGUE  ZBINU
4C***REFER TO  ZBESH,ZBESI,ZBESJ,ZBESK,ZAIRY,ZBIRY
5C
6C     ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
7C
8C***ROUTINES CALLED  ZABS,ZASYI,ZBUNI,ZMLRI,ZSERI,ZUOIK,ZWRSK
9C***END PROLOGUE  ZBINU
10      DOUBLE PRECISION ALIM, AZ, CWI, CWR, CYI, CYR, DFNU, ELIM, FNU,
11     * FNUL, RL, TOL, ZEROI, ZEROR, ZI, ZR, ZABS
12      INTEGER I, INW, KODE, N, NLAST, NN, NUI, NW, NZ
13      DIMENSION CYR(N), CYI(N), CWR(2), CWI(2)
14      DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
15C
16      NZ = 0
17      AZ = ZABS(CMPLX(ZR,ZI,kind=KIND(1.0D0)))
18      NN = N
19      DFNU = FNU + DBLE(FLOAT(N-1))
20      IF (AZ.LE.2.0D0) GO TO 10
21      IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
22   10 CONTINUE
23C-----------------------------------------------------------------------
24C     POWER SERIES
25C-----------------------------------------------------------------------
26      CALL ZSERI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
27      INW = IABS(NW)
28      NZ = NZ + INW
29      NN = NN - INW
30      IF (NN.EQ.0) RETURN
31      IF (NW.GE.0) GO TO 120
32      DFNU = FNU + DBLE(FLOAT(NN-1))
33   20 CONTINUE
34      IF (AZ.LT.RL) GO TO 40
35      IF (DFNU.LE.1.0D0) GO TO 30
36      IF (AZ+AZ.LT.DFNU*DFNU) GO TO 50
37C-----------------------------------------------------------------------
38C     ASYMPTOTIC EXPANSION FOR LARGE Z
39C-----------------------------------------------------------------------
40   30 CONTINUE
41      CALL ZASYI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, RL, TOL, ELIM,
42     * ALIM)
43      IF (NW.LT.0) GO TO 130
44      GO TO 120
45   40 CONTINUE
46      IF (DFNU.LE.1.0D0) GO TO 70
47   50 CONTINUE
48C-----------------------------------------------------------------------
49C     OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
50C-----------------------------------------------------------------------
51      CALL ZUOIK(ZR, ZI, FNU, KODE, 1, NN, CYR, CYI, NW, TOL, ELIM,
52     * ALIM)
53      IF (NW.LT.0) GO TO 130
54      NZ = NZ + NW
55      NN = NN - NW
56      IF (NN.EQ.0) RETURN
57      DFNU = FNU+DBLE(FLOAT(NN-1))
58      IF (DFNU.GT.FNUL) GO TO 110
59      IF (AZ.GT.FNUL) GO TO 110
60   60 CONTINUE
61      IF (AZ.GT.RL) GO TO 80
62   70 CONTINUE
63C-----------------------------------------------------------------------
64C     MILLER ALGORITHM NORMALIZED BY THE SERIES
65C-----------------------------------------------------------------------
66      CALL ZMLRI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL)
67      IF(NW.LT.0) GO TO 130
68      GO TO 120
69   80 CONTINUE
70C-----------------------------------------------------------------------
71C     MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
72C-----------------------------------------------------------------------
73C-----------------------------------------------------------------------
74C     OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
75C-----------------------------------------------------------------------
76      CALL ZUOIK(ZR, ZI, FNU, KODE, 2, 2, CWR, CWI, NW, TOL, ELIM,
77     * ALIM)
78      IF (NW.GE.0) GO TO 100
79      NZ = NN
80      DO 90 I=1,NN
81        CYR(I) = ZEROR
82        CYI(I) = ZEROI
83   90 CONTINUE
84      RETURN
85  100 CONTINUE
86      IF (NW.GT.0) GO TO 130
87      CALL ZWRSK(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, CWR, CWI, TOL,
88     * ELIM, ALIM)
89      IF (NW.LT.0) GO TO 130
90      GO TO 120
91  110 CONTINUE
92C-----------------------------------------------------------------------
93C     INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
94C-----------------------------------------------------------------------
95      NUI = INT(SNGL(FNUL-DFNU)) + 1
96      NUI = MAX0(NUI,0)
97      CALL ZBUNI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, NUI, NLAST, FNUL,
98     * TOL, ELIM, ALIM)
99      IF (NW.LT.0) GO TO 130
100      NZ = NZ + NW
101      IF (NLAST.EQ.0) GO TO 120
102      NN = NLAST
103      GO TO 60
104  120 CONTINUE
105      RETURN
106  130 CONTINUE
107      NZ = -1
108      IF(NW.EQ.(-2)) NZ=-2
109      RETURN
110      END
111