1C       COMPUTATION OF SPECIAL FUNCTIONS
2C
3C          Shanjie Zhang and Jianming Jin
4C
5C       Copyrighted but permission granted to use code in programs.
6C       Buy their book "Computation of Special Functions", 1996, John Wiley & Sons, Inc.
7C
8C       Scipy changes:
9C       - Compiled into a single source file and changed REAL To DBLE throughout.
10C       - Changed according to ERRATA.
11C       - Changed GAMMA to GAMMA2 and PSI to PSI_SPEC to avoid potential conflicts.
12C       - Made functions return sf_error codes in ISFER variables instead
13C         of printing warnings. The codes are
14C         - SF_ERROR_OK        = 0: no error
15C         - SF_ERROR_SINGULAR  = 1: singularity encountered
16C         - SF_ERROR_UNDERFLOW = 2: floating point underflow
17C         - SF_ERROR_OVERFLOW  = 3: floating point overflow
18C         - SF_ERROR_SLOW      = 4: too many iterations required
19C         - SF_ERROR_LOSS      = 5: loss of precision
20C         - SF_ERROR_NO_RESULT = 6: no result obtained
21C         - SF_ERROR_DOMAIN    = 7: out of domain
22C         - SF_ERROR_ARG       = 8: invalid input parameter
23C         - SF_ERROR_OTHER     = 9: unclassified error
24C
25        FUNCTION DNAN()
26        DOUBLE PRECISION DNAN
27        DNAN = 0.0D0
28        DNAN = 0.0D0/DNAN
29        END
30
31        FUNCTION DINF()
32        DOUBLE PRECISION DINF
33        DINF = 1.0D300
34        DINF = DINF*DINF
35        END
36
37        SUBROUTINE CPDSA(N,Z,CDN)
38C
39C       ===========================================================
40C       Purpose: Compute complex parabolic cylinder function Dn(z)
41C                for small argument
42C       Input:   z   --- complex argument of D(z)
43C                n   --- Order of D(z) (n = 0,-1,-2,...)
44C       Output:  CDN --- Dn(z)
45C       Routine called: GAIH for computing Г(x), x=n/2 (n=1,2,...)
46C       ===========================================================
47C
48        IMPLICIT DOUBLE PRECISION (A-B,D-H,O-Y)
49        IMPLICIT COMPLEX*16 (C,Z)
50        EPS=1.0D-15
51        PI=3.141592653589793D0
52        SQ2=DSQRT(2.0D0)
53        CA0=CDEXP(-.25D0*Z*Z)
54        VA0=0.5D0*(1.0D0-N)
55        IF (N.EQ.0.0) THEN
56           CDN=CA0
57        ELSE
58           IF (CDABS(Z).EQ.0.0) THEN
59              IF (VA0.LE.0.0.AND.VA0.EQ.INT(VA0)) THEN
60                 CDN=0.0D0
61              ELSE
62                 CALL GAIH(VA0,GA0)
63                 PD=DSQRT(PI)/(2.0D0**(-.5D0*N)*GA0)
64                 CDN = DCMPLX(PD, 0.0D0)
65              ENDIF
66           ELSE
67              XN=-N
68              CALL GAIH(XN,G1)
69              CB0=2.0D0**(-0.5D0*N-1.0D0)*CA0/G1
70              VT=-.5D0*N
71              CALL GAIH(VT,G0)
72              CDN = DCMPLX(G0, 0.0D0)
73              CR=(1.0D0,0.0D0)
74              DO 10 M=1,250
75                 VM=.5D0*(M-N)
76                 CALL GAIH(VM,GM)
77                 CR=-CR*SQ2*Z/M
78                 CDW=GM*CR
79                 CDN=CDN+CDW
80                 IF (CDABS(CDW).LT.CDABS(CDN)*EPS) GO TO 20
8110            CONTINUE
8220            CDN=CB0*CDN
83           ENDIF
84        ENDIF
85        RETURN
86        END
87
88
89
90C       **********************************
91
92        SUBROUTINE CFS(Z,ZF,ZD)
93C
94C       =========================================================
95C       Purpose: Compute complex Fresnel Integral S(z) and S'(z)
96C       Input :  z  --- Argument of S(z)
97C       Output:  ZF --- S(z)
98C                ZD --- S'(z)
99C       =========================================================
100C
101        IMPLICIT DOUBLE PRECISION (E,P,W)
102        IMPLICIT COMPLEX *16 (C,S,Z)
103        EPS=1.0D-14
104        PI=3.141592653589793D0
105        W0=CDABS(Z)
106        ZP=0.5D0*PI*Z*Z
107        ZP2=ZP*ZP
108        Z0=(0.0D0,0.0D0)
109        IF (Z.EQ.Z0) THEN
110           S=Z0
111        ELSE IF (W0.LE.2.5) THEN
112           S=Z*ZP/3.0D0
113           CR=S
114           WB0=0.0D0
115           DO 10 K=1,80
116              CR=-.5D0*CR*(4.0D0*K-1.0D0)/K/(2.0D0*K+1.0D0)
117     &          /(4.0D0*K+3.0D0)*ZP2
118              S=S+CR
119              WB=CDABS(S)
120              IF (DABS(WB-WB0).LT.EPS.AND.K.GT.10) GO TO 30
12110            WB0=WB
122        ELSE IF (W0.GT.2.5.AND.W0.LT.4.5) THEN
123           M=85
124           S=Z0
125           CF1=Z0
126           CF0=(1.0D-100,0.0D0)
127           DO 15 K=M,0,-1
128              CF=(2.0D0*K+3.0D0)*CF0/ZP-CF1
129              IF (K.NE.INT(K/2)*2) S=S+CF
130              CF1=CF0
13115            CF0=CF
132           S=CDSQRT(2.0D0/(PI*ZP))*CDSIN(ZP)/CF*S
133        ELSE
134           CR=(1.0D0,0.0D0)
135           CF=(1.0D0,0.0D0)
136           DO 20 K=1,20
137              CR=-.25D0*CR*(4.0D0*K-1.0D0)*(4.0D0*K-3.0D0)/ZP2
13820            CF=CF+CR
139           CR=1.0D0
140           CG=CR
141           DO 25 K=1,12
142              CR=-.25D0*CR*(4.0D0*K+1.0D0)*(4.0D0*K-1.0D0)/ZP2
14325            CG=CG+CR
144           CG = CG/(PI*Z*Z)
145           S=.5D0-(CF*CDCOS(ZP)+CG*CDSIN(ZP))/(PI*Z)
146        ENDIF
14730      ZF=S
148        ZD=CDSIN(0.5*PI*Z*Z)
149        RETURN
150        END
151
152C       **********************************
153
154        SUBROUTINE LQMN(MM,M,N,X,QM,QD)
155C
156C       ==========================================================
157C       Purpose: Compute the associated Legendre functions of the
158C                second kind, Qmn(x) and Qmn'(x)
159C       Input :  x  --- Argument of Qmn(x)
160C                m  --- Order of Qmn(x)  ( m = 0,1,2,… )
161C                n  --- Degree of Qmn(x) ( n = 0,1,2,… )
162C                mm --- Physical dimension of QM and QD
163C       Output:  QM(m,n) --- Qmn(x)
164C                QD(m,n) --- Qmn'(x)
165C       ==========================================================
166C
167        IMPLICIT DOUBLE PRECISION (Q,X)
168        DIMENSION QM(0:MM,0:N),QD(0:MM,0:N)
169        IF (DABS(X).EQ.1.0D0) THEN
170           DO 10 I=0,M
171           DO 10 J=0,N
172              QM(I,J)=1.0D+300
173              QD(I,J)=1.0D+300
17410         CONTINUE
175           RETURN
176        ENDIF
177        LS=1
178        IF (DABS(X).GT.1.0D0) LS=-1
179        XS=LS*(1.0D0-X*X)
180        XQ=DSQRT(XS)
181        Q0=0.5D0*DLOG(DABS((X+1.0D0)/(X-1.0D0)))
182        IF (DABS(X).LT.1.0001D0) THEN
183           QM(0,0)=Q0
184           QM(0,1)=X*Q0-1.0D0
185           QM(1,0)=-1.0D0/XQ
186           QM(1,1)=-LS*XQ*(Q0+X/(1.0D0-X*X))
187           DO 15 I=0,1
188           DO 15 J=2,N
189              QM(I,J)=((2.0D0*J-1.0D0)*X*QM(I,J-1)
190     &               -(J+I-1.0D0)*QM(I,J-2))/(J-I)
19115         CONTINUE
192           DO 20 J=0,N
193           DO 20 I=2,M
194              QM(I,J)=-2.0D0*(I-1.0D0)*X/XQ*QM(I-1,J)-LS*
195     &                (J+I-1.0D0)*(J-I+2.0D0)*QM(I-2,J)
19620         CONTINUE
197        ELSE
198           IF (DABS(X).GT.1.1D0) THEN
199              KM=40+M+N
200           ELSE
201              KM=(40+M+N)*INT(-1.0-1.8*LOG(X-1.0))
202           ENDIF
203           QF2=0.0D0
204           QF1=1.0D0
205           QF0=0.0D0
206           DO 25 K=KM,0,-1
207              QF0=((2*K+3.0D0)*X*QF1-(K+2.0D0)*QF2)/(K+1.0D0)
208              IF (K.LE.N) QM(0,K)=QF0
209              QF2=QF1
21025            QF1=QF0
211           DO 30 K=0,N
21230            QM(0,K)=Q0*QM(0,K)/QF0
213           QF2=0.0D0
214           QF1=1.0D0
215           DO 35 K=KM,0,-1
216              QF0=((2*K+3.0D0)*X*QF1-(K+1.0D0)*QF2)/(K+2.0D0)
217              IF (K.LE.N) QM(1,K)=QF0
218              QF2=QF1
21935            QF1=QF0
220           Q10=-1.0D0/XQ
221           DO 40 K=0,N
22240            QM(1,K)=Q10*QM(1,K)/QF0
223           DO 45 J=0,N
224              Q0=QM(0,J)
225              Q1=QM(1,J)
226              DO 45 I=0,M-2
227                 QF=-2.0D0*(I+1)*X/XQ*Q1+(J-I)*(J+I+1.0D0)*Q0
228                 QM(I+2,J)=QF
229                 Q0=Q1
230                 Q1=QF
23145         CONTINUE
232        ENDIF
233        QD(0,0)=LS/XS
234        DO 50 J=1,N
23550         QD(0,J)=LS*J*(QM(0,J-1)-X*QM(0,J))/XS
236        DO 55 J=0,N
237        DO 55 I=1,M
238           QD(I,J)=LS*I*X/XS*QM(I,J)+(I+J)*(J-I+1.0D0)/XQ*QM(I-1,J)
23955      CONTINUE
240        RETURN
241        END
242
243C       **********************************
244
245        SUBROUTINE CLPMN(MM,M,N,X,Y,NTYPE,CPM,CPD)
246C
247C       =========================================================
248C       Purpose: Compute the associated Legendre functions Pmn(z)
249C                and their derivatives Pmn'(z) for a complex
250C                argument
251C       Input :  x     --- Real part of z
252C                y     --- Imaginary part of z
253C                m     --- Order of Pmn(z),  m = 0,1,2,...,n
254C                n     --- Degree of Pmn(z), n = 0,1,2,...,N
255C                mm    --- Physical dimension of CPM and CPD
256C                ntype --- type of cut, either 2 or 3
257C       Output:  CPM(m,n) --- Pmn(z)
258C                CPD(m,n) --- Pmn'(z)
259C       =========================================================
260C
261        IMPLICIT DOUBLE PRECISION (D,X,Y)
262        IMPLICIT COMPLEX*16 (C,Z)
263        DIMENSION CPM(0:MM,0:N),CPD(0:MM,0:N)
264        Z = DCMPLX(X, Y)
265        DO 10 I=0,N
266        DO 10 J=0,M
267           CPM(J,I)=(0.0D0,0.0D0)
26810         CPD(J,I)=(0.0D0,0.0D0)
269        CPM(0,0)=(1.0D0,0.0D0)
270        IF (N.EQ.0) RETURN
271        IF (DABS(X).EQ.1.0D0.AND.Y.EQ.0.0D0) THEN
272           DO 15 I=1,N
273              CPM(0,I)=X**I
27415            CPD(0,I)=0.5D0*I*(I+1)*X**(I+1)
275           DO 20 J=1,N
276           DO 20 I=1,M
277              IF (I.EQ.1) THEN
278                 CPD(I,J)=DINF()
279              ELSE IF (I.EQ.2) THEN
280                 CPD(I,J)=-0.25D0*(J+2)*(J+1)*J*(J-1)*X**(J+1)
281              ENDIF
28220         CONTINUE
283           RETURN
284        ENDIF
285        if (NTYPE.EQ.2) THEN
286C       sqrt(1 - z^2) with branch cut on |x|>1
287           ZS=(1.0D0-Z*Z)
288           ZQ=-CDSQRT(ZS)
289           LS=-1
290        ELSE
291C       sqrt(z^2 - 1) with branch cut between [-1, 1]
292           ZS=(Z*Z-1.0D0)
293           ZQ=CDSQRT(ZS)
294           IF (X.LT.0D0) THEN
295              ZQ=-ZQ
296           END IF
297           LS=1
298        END IF
299        DO 25 I=1,M
300C       DLMF 14.7.15
30125         CPM(I,I)=(2.0D0*I-1.0D0)*ZQ*CPM(I-1,I-1)
302        DO 30 I=0,MIN(M,N-1)
303C       DLMF 14.10.7
30430         CPM(I,I+1)=(2.0D0*I+1.0D0)*Z*CPM(I,I)
305        DO 35 I=0,M
306        DO 35 J=I+2,N
307C       DLMF 14.10.3
308           CPM(I,J)=((2.0D0*J-1.0D0)*Z*CPM(I,J-1)-(I+J-
309     &              1.0D0)*CPM(I,J-2))/(J-I)
31035      CONTINUE
311        CPD(0,0)=(0.0D0,0.0D0)
312        DO 40 J=1,N
313C       DLMF 14.10.5
31440         CPD(0,J)=LS*J*(Z*CPM(0,J)-CPM(0,J-1))/ZS
315        DO 45 I=1,M
316        DO 45 J=I,N
317C       derivative of DLMF 14.7.11 & DLMF 14.10.6 for type 3
318C       derivative of DLMF 14.7.8 & DLMF 14.10.1 for type 2
319           CPD(I,J)=LS*(-I*Z*CPM(I,J)/ZS+(J+I)*(J-I+1.0D0)
320     &                  /ZQ*CPM(I-1,J))
32145      CONTINUE
322        RETURN
323        END
324
325C       **********************************
326
327        SUBROUTINE VVSA(VA,X,PV)
328C
329C       ===================================================
330C       Purpose: Compute parabolic cylinder function Vv(x)
331C                for small argument
332C       Input:   x  --- Argument
333C                va --- Order
334C       Output:  PV --- Vv(x)
335C       Routine called : GAMMA2 for computing Г(x)
336C       ===================================================
337C
338        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
339        EPS=1.0D-15
340        PI=3.141592653589793D0
341        EP=DEXP(-.25D0*X*X)
342        VA0=1.0D0+0.5D0*VA
343        IF (X.EQ.0.0) THEN
344           IF (VA0.LE.0.0.AND.VA0.EQ.INT(VA0).OR.VA.EQ.0.0) THEN
345              PV=0.0D0
346           ELSE
347              VB0=-0.5D0*VA
348              SV0=DSIN(VA0*PI)
349              CALL GAMMA2(VA0,GA0)
350              PV=2.0D0**VB0*SV0/GA0
351           ENDIF
352        ELSE
353           SQ2=DSQRT(2.0D0)
354           A0=2.0D0**(-.5D0*VA)*EP/(2.0D0*PI)
355           SV=DSIN(-(VA+.5D0)*PI)
356           V1=-.5D0*VA
357           CALL GAMMA2(V1,G1)
358           PV=(SV+1.0D0)*G1
359           R=1.0D0
360           FAC=1.0D0
361           DO 10 M=1,250
362              VM=.5D0*(M-VA)
363              CALL GAMMA2(VM,GM)
364              R=R*SQ2*X/M
365              FAC=-FAC
366              GW=FAC*SV+1.0D0
367              R1=GW*R*GM
368              PV=PV+R1
369              IF (DABS(R1/PV).LT.EPS.AND.GW.NE.0.0) GO TO 15
37010         CONTINUE
37115         PV=A0*PV
372        ENDIF
373        RETURN
374        END
375
376
377
378C       **********************************
379C       SciPy: Changed P from a character array to an integer array.
380        SUBROUTINE JDZO(NT,N,M,P,ZO)
381C
382C       ===========================================================
383C       Purpose: Compute the zeros of Bessel functions Jn(x) and
384C                Jn'(x), and arrange them in the order of their
385C                magnitudes
386C       Input :  NT    --- Number of total zeros ( NT ≤ 1200 )
387C       Output:  ZO(L) --- Value of the L-th zero of Jn(x)
388C                          and Jn'(x)
389C                N(L)  --- n, order of Jn(x) or Jn'(x) associated
390C                          with the L-th zero
391C                M(L)  --- m, serial number of the zeros of Jn(x)
392C                          or Jn'(x) associated with the L-th zero
393C                          ( L is the serial number of all the
394C                            zeros of Jn(x) and Jn'(x) )
395C                P(L)  --- 0 (TM) or 1 (TE), a code for designating the
396C                          zeros of Jn(x)  or Jn'(x).
397C                          In the waveguide applications, the zeros
398C                          of Jn(x) correspond to TM modes and
399C                          those of Jn'(x) correspond to TE modes
400C       Routine called:    BJNDD for computing Jn(x), Jn'(x) and
401C                          Jn''(x)
402C       =============================================================
403C
404        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
405        INTEGER P(1400), P1(70)
406        DIMENSION N(1400),M(1400),ZO(0:1400),N1(70),M1(70),
407     &            ZOC(0:70),BJ(101),DJ(101),FJ(101)
408        X = 0
409        ZOC(0) = 0
410        IF (NT.LT.600) THEN
411           XM=-1.0+2.248485*NT**0.5-.0159382*NT+3.208775E-4
412     &        *NT**1.5
413           NM=INT(14.5+.05875*NT)
414           MM=INT(.02*NT)+6
415        ELSE
416           XM=5.0+1.445389*NT**.5+.01889876*NT-2.147763E-4
417     &        *NT**1.5
418           NM=INT(27.8+.0327*NT)
419           MM=INT(.01088*NT)+10
420        ENDIF
421        L0=0
422        DO 45 I=1,NM
423           X1=.407658+.4795504*(I-1)**.5+.983618*(I-1)
424           X2=1.99535+.8333883*(I-1)**.5+.984584*(I-1)
425           L1=0
426           DO 30 J=1,MM
427              IF (I.EQ.1.AND.J.EQ.1) GO TO 15
428              X=X1
42910            CALL BJNDD(I,X,BJ,DJ,FJ)
430              X0=X
431              X=X-DJ(I)/FJ(I)
432              IF (X1.GT.XM) GO TO 20
433              IF (DABS(X-X0).GT.1.0D-10) GO TO 10
43415            L1=L1+1
435              N1(L1)=I-1
436              M1(L1)=J
437              IF (I.EQ.1) M1(L1)=J-1
438              P1(L1)=1
439              ZOC(L1)=X
440              IF (I.LE.15) THEN
441                 X1=X+3.057+.0122*(I-1)+(1.555+.41575*(I-1))/(J+1)**2
442              ELSE
443                 X1=X+2.918+.01924*(I-1)+(6.26+.13205*(I-1))/(J+1)**2
444              ENDIF
44520            X=X2
44625            CALL BJNDD(I,X,BJ,DJ,FJ)
447              X0=X
448              X=X-BJ(I)/DJ(I)
449              IF (X.GT.XM) GO TO 30
450              IF (DABS(X-X0).GT.1.0D-10) GO TO 25
451              L1=L1+1
452              N1(L1)=I-1
453              M1(L1)=J
454              P1(L1)=0
455              ZOC(L1)=X
456              IF (I.LE.15) THEN
457                 X2=X+3.11+.0138*(I-1)+(.04832+.2804*(I-1))/(J+1)**2
458              ELSE
459                 X2=X+3.001+.0105*(I-1)+(11.52+.48525*(I-1))/(J+3)**2
460              ENDIF
46130         CONTINUE
462           L=L0+L1
463           L2=L
46435         IF (L0.EQ.0) THEN
465              DO 40 K=1,L
466                 ZO(K)=ZOC(K)
467                 N(K)=N1(K)
468                 M(K)=M1(K)
46940               P(K)=P1(K)
470              L1=0
471           ELSE IF (L0.NE.0) THEN
472              IF (ZO(L0).GE.ZOC(L1)) THEN
473                 ZO(L0+L1)=ZO(L0)
474                 N(L0+L1)=N(L0)
475                 M(L0+L1)=M(L0)
476                 P(L0+L1)=P(L0)
477                 L0=L0-1
478              ELSE
479                 ZO(L0+L1)=ZOC(L1)
480                 N(L0+L1)=N1(L1)
481                 M(L0+L1)=M1(L1)
482                 P(L0+L1)=P1(L1)
483                 L1=L1-1
484              ENDIF
485           ENDIF
486           IF (L1.NE.0) GO TO 35
48745         L0=L2
488        RETURN
489        END
490
491
492
493C       **********************************
494
495        SUBROUTINE CBK(M,N,C,CV,QT,CK,BK)
496C
497C       =====================================================
498C       Purpose: Compute coefficient Bk's for oblate radial
499C                functions with a small argument
500C       =====================================================
501C
502        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
503        DIMENSION BK(200),CK(200),U(200),V(200),W(200)
504        EPS=1.0D-14
505        IP=1
506        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
507        NM=25+INT(0.5*(N-M)+C)
508        U(1)=0.0D0
509        N2=NM-2
510        DO 10 J=2,N2
51110         U(J)=C*C
512        DO 15 J=1,N2
51315         V(J)=(2.0*J-1.0-IP)*(2.0*(J-M)-IP)+M*(M-1.0)-CV
514        DO 20 J=1,NM-1
51520         W(J)=(2.0*J-IP)*(2.0*J+1.0-IP)
516        IF (IP.EQ.0) THEN
517           SW=0.0D0
518           DO 40 K=0,N2-1
519              S1=0.0D0
520              I1=K-M+1
521              DO 30 I=I1,NM
522                 IF (I.LT.0) GO TO 30
523                 R1=1.0D0
524                 DO 25 J=1,K
52525                  R1=R1*(I+M-J)/J
526                 S1=S1+CK(I+1)*(2.0*I+M)*R1
527                 IF (DABS(S1-SW).LT.DABS(S1)*EPS) GO TO 35
528                 SW=S1
52930            CONTINUE
53035            BK(K+1)=QT*S1
53140         CONTINUE
532        ELSE IF (IP.EQ.1) THEN
533           SW=0.0D0
534           DO 60 K=0,N2-1
535              S1=0.0D0
536              I1=K-M+1
537              DO 50 I=I1,NM
538                 IF (I.LT.0) GO TO 50
539                 R1=1.0D0
540                 DO 45 J=1,K
54145                  R1=R1*(I+M-J)/J
542                 IF (I.GT.0) S1=S1+CK(I)*(2.0*I+M-1)*R1
543                 S1=S1-CK(I+1)*(2.0*I+M)*R1
544                 IF (DABS(S1-SW).LT.DABS(S1)*EPS) GO TO 55
545                 SW=S1
54650            CONTINUE
54755            BK(K+1)=QT*S1
54860         CONTINUE
549        ENDIF
550        W(1)=W(1)/V(1)
551        BK(1)=BK(1)/V(1)
552        DO 65 K=2,N2
553           T=V(K)-W(K-1)*U(K)
554           W(K)=W(K)/T
55565         BK(K)=(BK(K)-BK(K-1)*U(K))/T
556        DO 70 K=N2-1,1,-1
55770         BK(K)=BK(K)-W(K)*BK(K+1)
558        RETURN
559        END
560
561
562
563C       **********************************
564
565        SUBROUTINE RMN2SP(M,N,C,X,CV,DF,KD,R2F,R2D)
566C
567C       ======================================================
568C       Purpose: Compute prolate spheroidal radial function
569C                of the second kind with a small argument
570C       Routines called:
571C            (1) LPMNS for computing the associated Legendre
572C                functions of the first kind
573C            (2) LQMNS for computing the associated Legendre
574C                functions of the second kind
575C            (3) KMN for computing expansion coefficients
576C                and joining factors
577C       ======================================================
578C
579        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
580        DIMENSION PM(0:251),PD(0:251),QM(0:251),QD(0:251),
581     &            DN(200),DF(200)
582        IF (DABS(DF(1)).LT.1.0D-280) THEN
583           R2F=1.0D+300
584           R2D=1.0D+300
585           RETURN
586        ENDIF
587        EPS=1.0D-14
588        IP=1
589        NM1=INT((N-M)/2)
590        IF (N-M.EQ.2*NM1) IP=0
591        NM=25+NM1+INT(C)
592        NM2=2*NM+M
593        CALL KMN(M,N,C,CV,KD,DF,DN,CK1,CK2)
594        CALL LPMNS(M,NM2,X,PM,PD)
595        CALL LQMNS(M,NM2,X,QM,QD)
596        SU0=0.0D0
597        SW=0.0D0
598        DO 10 K=1,NM
599          J=2*K-2+M+IP
600          SU0=SU0+DF(K)*QM(J)
601          IF (K.GT.NM1.AND.DABS(SU0-SW).LT.DABS(SU0)*EPS) GO TO 15
60210        SW=SU0
60315      SD0=0.0D0
604        DO 20 K=1,NM
605          J=2*K-2+M+IP
606          SD0=SD0+DF(K)*QD(J)
607          IF (K.GT.NM1.AND.DABS(SD0-SW).LT.DABS(SD0)*EPS) GO TO 25
60820        SW=SD0
60925        SU1=0.0D0
610          SD1=0.0D0
611          DO 30 K=1,M
612             J=M-2*K+IP
613             IF (J.LT.0) J=-J-1
614             SU1=SU1+DN(K)*QM(J)
61530           SD1=SD1+DN(K)*QD(J)
616          GA=((X-1.0D0)/(X+1.0D0))**(0.5D0*M)
617          DO 55 K=1,M
618             J=M-2*K+IP
619             IF (J.GE.0) GO TO 55
620             IF (J.LT.0) J=-J-1
621             R1=1.0D0
622             DO 35 J1=1,J
62335              R1=(M+J1)*R1
624             R2=1.0D0
625             DO 40 J2=1,M-J-2
62640              R2=J2*R2
627             R3=1.0D0
628             SF=1.0D0
629             DO 45 L1=1,J
630                R3=0.5D0*R3*(-J+L1-1.0)*(J+L1)/((M+L1)*L1)*(1.0-X)
63145              SF=SF+R3
632             IF (M-J.GE.2) GB=(M-J-1.0D0)*R2
633             IF (M-J.LE.1) GB=1.0D0
634             SPL=R1*GA*GB*SF
635             SU1=SU1+(-1)**(J+M)*DN(K)*SPL
636             SPD1=M/(X*X-1.0D0)*SPL
637             GC=0.5D0*J*(J+1.0)/(M+1.0)
638             SD=1.0D0
639             R4=1.0D0
640             DO 50 L1=1,J-1
641                R4=0.5D0*R4*(-J+L1)*(J+L1+1.0)/((M+L1+1.0)*L1)
642     &             *(1.0-X)
64350              SD=SD+R4
644             SPD2=R1*GA*GB*GC*SD
645             SD1=SD1+(-1)**(J+M)*DN(K)*(SPD1+SPD2)
64655        CONTINUE
647          SU2=0.0D0
648          KI=(2*M+1+IP)/2
649          NM3=NM+KI
650          DO 60 K=KI,NM3
651             J=2*K-1-M-IP
652             SU2=SU2+DN(K)*PM(J)
653             IF (J.GT.M.AND.DABS(SU2-SW).LT.DABS(SU2)*EPS) GO TO 65
65460           SW=SU2
65565        SD2=0.0D0
656          DO 70 K=KI,NM3
657             J=2*K-1-M-IP
658             SD2=SD2+DN(K)*PD(J)
659             IF (J.GT.M.AND.DABS(SD2-SW).LT.DABS(SD2)*EPS) GO TO 75
66070           SW=SD2
66175      SUM=SU0+SU1+SU2
662        SDM=SD0+SD1+SD2
663        R2F=SUM/CK2
664        R2D=SDM/CK2
665        RETURN
666        END
667
668
669
670C       **********************************
671
672        SUBROUTINE BERNOB(N,BN)
673C
674C       ======================================
675C       Purpose: Compute Bernoulli number Bn
676C       Input :  n --- Serial number
677C       Output:  BN(n) --- Bn
678C       ======================================
679C
680        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
681        DIMENSION BN(0:N)
682        TPI=6.283185307179586D0
683        BN(0)=1.0D0
684        BN(1)=-0.5D0
685        BN(2)=1.0D0/6.0D0
686        R1=(2.0D0/TPI)**2
687        DO 20 M=4,N,2
688           R1=-R1*(M-1)*M/(TPI*TPI)
689           R2=1.0D0
690           DO 10 K=2,10000
691              S=(1.0D0/K)**M
692              R2=R2+S
693              IF (S.LT.1.0D-15) GOTO 20
69410         CONTINUE
69520         BN(M)=R1*R2
696        RETURN
697        END
698
699C       **********************************
700
701        SUBROUTINE BERNOA(N,BN)
702C
703C       ======================================
704C       Purpose: Compute Bernoulli number Bn
705C       Input :  n --- Serial number
706C       Output:  BN(n) --- Bn
707C       ======================================
708C
709        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
710        DIMENSION BN(0:N)
711        BN(0)=1.0D0
712        BN(1)=-0.5D0
713        DO 30 M=2,N
714           S=-(1.0D0/(M+1.0D0)-0.5D0)
715           DO 20 K=2,M-1
716              R=1.0D0
717              DO 10 J=2,K
71810               R=R*(J+M-K)/J
71920            S=S-R*BN(K)
72030         BN(M)=S
721        DO 40 M=3,N,2
72240         BN(M)=0.0D0
723        RETURN
724        END
725
726C       **********************************
727
728        SUBROUTINE QSTAR(M,N,C,CK,CK1,QS,QT)
729C
730C       =========================================================
731C       Purpose: Compute Q*mn(-ic) for oblate radial functions
732C                with a small argument
733C       =========================================================
734C
735        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
736        DIMENSION AP(200),CK(200)
737        IP=1
738        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
739        R=1.0D0/CK(1)**2
740        AP(1)=R
741        DO 20 I=1,M
742           S=0.0D0
743           DO 15 L=1,I
744              SK=0.0D0
745              DO 10 K=0,L
74610               SK=SK+CK(K+1)*CK(L-K+1)
74715            S=S+SK*AP(I-L+1)
74820      AP(I+1)=-R*S
749        QS0=AP(M+1)
750        DO 30 L=1,M
751           R=1.0D0
752           DO 25 K=1,L
75325            R=R*(2.0D0*K+IP)*(2.0D0*K-1.0D0+IP)/(2.0D0*K)**2
75430         QS0=QS0+AP(M-L+1)*R
755        QS=(-1)**IP*CK1*(CK1*QS0)/C
756        QT=-2.0D0/CK1*QS
757        RETURN
758        END
759
760
761
762C       **********************************
763
764        SUBROUTINE CV0(KD,M,Q,A0)
765C
766C       =====================================================
767C       Purpose: Compute the initial characteristic value of
768C                Mathieu functions for m ≤ 12  or q ≤ 300 or
769C                q ≥ m*m
770C       Input :  m  --- Order of Mathieu functions
771C                q  --- Parameter of Mathieu functions
772C       Output:  A0 --- Characteristic value
773C       Routines called:
774C             (1) CVQM for computing initial characteristic
775C                 value for q ≤ 3*m
776C             (2) CVQL for computing initial characteristic
777C                 value for q ≥ m*m
778C       ====================================================
779C
780        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
781        Q2=Q*Q
782        IF (M.EQ.0) THEN
783           IF (Q.LE.1.0) THEN
784              A0=(((.0036392*Q2-.0125868)*Q2+.0546875)*Q2-.5)*Q2
785           ELSE IF (Q.LE.10.0) THEN
786              A0=((3.999267D-3*Q-9.638957D-2)*Q-.88297)*Q
787     &           +.5542818
788           ELSE
789              CALL CVQL(KD,M,Q,A0)
790           ENDIF
791        ELSE IF (M.EQ.1) THEN
792           IF (Q.LE.1.0.AND.KD.EQ.2) THEN
793              A0=(((-6.51E-4*Q-.015625)*Q-.125)*Q+1.0)*Q+1.0
794           ELSE IF (Q.LE.1.0.AND.KD.EQ.3) THEN
795              A0=(((-6.51E-4*Q+.015625)*Q-.125)*Q-1.0)*Q+1.0
796           ELSE IF (Q.LE.10.0.AND. KD.EQ.2) THEN
797              A0=(((-4.94603D-4*Q+1.92917D-2)*Q-.3089229)
798     &           *Q+1.33372)*Q+.811752
799           ELSE IF (Q.LE.10.0.AND.KD.EQ.3) THEN
800              A0=((1.971096D-3*Q-5.482465D-2)*Q-1.152218)
801     &           *Q+1.10427
802           ELSE
803              CALL CVQL(KD,M,Q,A0)
804           ENDIF
805        ELSE IF (M.EQ.2) THEN
806           IF (Q.LE.1.0.AND.KD.EQ.1) THEN
807              A0=(((-.0036391*Q2+.0125888)*Q2-.0551939)*Q2
808     &           +.416667)*Q2+4.0
809           ELSE IF (Q.LE.1.0.AND.KD.EQ.4) THEN
810              A0=(.0003617*Q2-.0833333)*Q2+4.0
811           ELSE IF (Q.LE.15.AND.KD.EQ.1) THEN
812              A0=(((3.200972D-4*Q-8.667445D-3)*Q
813     &           -1.829032D-4)*Q+.9919999)*Q+3.3290504
814           ELSE IF (Q.LE.10.0.AND.KD.EQ.4) THEN
815              A0=((2.38446D-3*Q-.08725329)*Q-4.732542D-3)
816     &           *Q+4.00909
817           ELSE
818              CALL CVQL(KD,M,Q,A0)
819           ENDIF
820        ELSE IF (M.EQ.3) THEN
821           IF (Q.LE.1.0.AND.KD.EQ.2) THEN
822              A0=((6.348E-4*Q+.015625)*Q+.0625)*Q2+9.0
823           ELSE IF (Q.LE.1.0.AND.KD.EQ.3) THEN
824              A0=((6.348E-4*Q-.015625)*Q+.0625)*Q2+9.0
825           ELSE IF (Q.LE.20.0.AND.KD.EQ.2) THEN
826              A0=(((3.035731D-4*Q-1.453021D-2)*Q
827     &           +.19069602)*Q-.1039356)*Q+8.9449274
828           ELSE IF (Q.LE.15.0.AND.KD.EQ.3) THEN
829              A0=((9.369364D-5*Q-.03569325)*Q+.2689874)*Q
830     &           +8.771735
831           ELSE
832              CALL CVQL(KD,M,Q,A0)
833           ENDIF
834        ELSE IF (M.EQ.4) THEN
835           IF (Q.LE.1.0.AND.KD.EQ.1) THEN
836              A0=((-2.1E-6*Q2+5.012E-4)*Q2+.0333333)*Q2+16.0
837           ELSE IF (Q.LE.1.0.AND.KD.EQ.4) THEN
838              A0=((3.7E-6*Q2-3.669E-4)*Q2+.0333333)*Q2+16.0
839           ELSE IF (Q.LE.25.0.AND.KD.EQ.1) THEN
840              A0=(((1.076676D-4*Q-7.9684875D-3)*Q
841     &           +.17344854)*Q-.5924058)*Q+16.620847
842           ELSE IF (Q.LE.20.0.AND.KD.EQ.4) THEN
843              A0=((-7.08719D-4*Q+3.8216144D-3)*Q
844     &           +.1907493)*Q+15.744
845           ELSE
846              CALL CVQL(KD,M,Q,A0)
847           ENDIF
848        ELSE IF (M.EQ.5) THEN
849           IF (Q.LE.1.0.AND.KD.EQ.2) THEN
850              A0=((6.8E-6*Q+1.42E-5)*Q2+.0208333)*Q2+25.0
851           ELSE IF (Q.LE.1.0.AND.KD.EQ.3) THEN
852              A0=((-6.8E-6*Q+1.42E-5)*Q2+.0208333)*Q2+25.0
853           ELSE IF (Q.LE.35.0.AND.KD.EQ.2) THEN
854              A0=(((2.238231D-5*Q-2.983416D-3)*Q
855     &           +.10706975)*Q-.600205)*Q+25.93515
856           ELSE IF (Q.LE.25.0.AND.KD.EQ.3) THEN
857              A0=((-7.425364D-4*Q+2.18225D-2)*Q
858     &           +4.16399D-2)*Q+24.897
859           ELSE
860              CALL CVQL(KD,M,Q,A0)
861           ENDIF
862        ELSE IF (M.EQ.6) THEN
863           IF (Q.LE.1.0) THEN
864              A0=(.4D-6*Q2+.0142857)*Q2+36.0
865           ELSE IF (Q.LE.40.0.AND.KD.EQ.1) THEN
866              A0=(((-1.66846D-5*Q+4.80263D-4)*Q
867     &           +2.53998D-2)*Q-.181233)*Q+36.423
868           ELSE IF (Q.LE.35.0.AND.KD.EQ.4) THEN
869              A0=((-4.57146D-4*Q+2.16609D-2)*Q-2.349616D-2)*Q
870     &           +35.99251
871           ELSE
872              CALL CVQL(KD,M,Q,A0)
873           ENDIF
874        ELSE IF (M.EQ.7) THEN
875           IF (Q.LE.10.0) THEN
876              CALL CVQM(M,Q,A0)
877           ELSE IF (Q.LE.50.0.AND.KD.EQ.2) THEN
878              A0=(((-1.411114D-5*Q+9.730514D-4)*Q
879     &           -3.097887D-3)*Q+3.533597D-2)*Q+49.0547
880           ELSE IF (Q.LE.40.0.AND.KD.EQ.3) THEN
881              A0=((-3.043872D-4*Q+2.05511D-2)*Q
882     &           -9.16292D-2)*Q+49.19035
883           ELSE
884              CALL CVQL(KD,M,Q,A0)
885           ENDIF
886        ELSE IF (M.GE.8) THEN
887           IF (Q.LE.3.*M) THEN
888              CALL CVQM(M,Q,A0)
889           ELSE IF (Q.GT.M*M) THEN
890              CALL CVQL(KD,M,Q,A0)
891           ELSE
892              IF (M.EQ.8.AND.KD.EQ.1) THEN
893                 A0=(((8.634308D-6*Q-2.100289D-3)*Q+.169072)*Q
894     &              -4.64336)*Q+109.4211
895              ELSE IF (M.EQ.8.AND.KD.EQ.4) THEN
896                 A0=((-6.7842D-5*Q+2.2057D-3)*Q+.48296)*Q+56.59
897              ELSE IF (M.EQ.9.AND.KD.EQ.2) THEN
898                 A0=(((2.906435D-6*Q-1.019893D-3)*Q+.1101965)*Q
899     &              -3.821851)*Q+127.6098
900              ELSE IF (M.EQ.9.AND.KD.EQ.3) THEN
901                 A0=((-9.577289D-5*Q+.01043839)*Q+.06588934)*Q
902     &              +78.0198
903              ELSE IF (M.EQ.10.AND.KD.EQ.1) THEN
904                 A0=(((5.44927D-7*Q-3.926119D-4)*Q+.0612099)*Q
905     &              -2.600805)*Q+138.1923
906              ELSE IF (M.EQ.10.AND.KD.EQ.4) THEN
907                 A0=((-7.660143D-5*Q+.01132506)*Q-.09746023)*Q
908     &              +99.29494
909              ELSE IF (M.EQ.11.AND.KD.EQ.2) THEN
910                 A0=(((-5.67615D-7*Q+7.152722D-6)*Q+.01920291)*Q
911     &              -1.081583)*Q+140.88
912              ELSE IF (M.EQ.11.AND.KD.EQ.3) THEN
913                 A0=((-6.310551D-5*Q+.0119247)*Q-.2681195)*Q
914     &              +123.667
915              ELSE IF (M.EQ.12.AND.KD.EQ.1) THEN
916                 A0=(((-2.38351D-7*Q-2.90139D-5)*Q+.02023088)*Q
917     &              -1.289)*Q+171.2723
918              ELSE IF (M.EQ.12.AND.KD.EQ.4) THEN
919                 A0=(((3.08902D-7*Q-1.577869D-4)*Q+.0247911)*Q
920     &              -1.05454)*Q+161.471
921              ENDIF
922           ENDIF
923        ENDIF
924        RETURN
925        END
926
927
928
929C       **********************************
930
931        SUBROUTINE CVQM(M,Q,A0)
932C
933C       =====================================================
934C       Purpose: Compute the characteristic value of Mathieu
935C                functions for q ≤ m*m
936C       Input :  m  --- Order of Mathieu functions
937C                q  --- Parameter of Mathieu functions
938C       Output:  A0 --- Initial characteristic value
939C       =====================================================
940C
941        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
942        HM1=.5*Q/(M*M-1.0)
943        HM3=.25*HM1**3/(M*M-4.0)
944        HM5=HM1*HM3*Q/((M*M-1.0)*(M*M-9.0))
945        A0=M*M+Q*(HM1+(5.0*M*M+7.0)*HM3
946     &     +(9.0*M**4+58.0*M*M+29.0)*HM5)
947        RETURN
948        END
949
950C       **********************************
951
952        SUBROUTINE CVQL(KD,M,Q,A0)
953C
954C       ========================================================
955C       Purpose: Compute the characteristic value of Mathieu
956C                functions  for q ≥ 3m
957C       Input :  m  --- Order of Mathieu functions
958C                q  --- Parameter of Mathieu functions
959C       Output:  A0 --- Initial characteristic value
960C       ========================================================
961C
962        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
963        W=0.0D0
964        IF (KD.EQ.1.OR.KD.EQ.2) W=2.0D0*M+1.0D0
965        IF (KD.EQ.3.OR.KD.EQ.4) W=2.0D0*M-1.0D0
966        W2=W*W
967        W3=W*W2
968        W4=W2*W2
969        W6=W2*W4
970        D1=5.0+34.0/W2+9.0/W4
971        D2=(33.0+410.0/W2+405.0/W4)/W
972        D3=(63.0+1260.0/W2+2943.0/W4+486.0/W6)/W2
973        D4=(527.0+15617.0/W2+69001.0/W4+41607.0/W6)/W3
974        C1=128.0
975        P2=Q/W4
976        P1=DSQRT(P2)
977        CV1=-2.0*Q+2.0*W*DSQRT(Q)-(W2+1.0)/8.0
978        CV2=(W+3.0/W)+D1/(32.0*P1)+D2/(8.0*C1*P2)
979        CV2=CV2+D3/(64.0*C1*P1*P2)+D4/(16.0*C1*C1*P2*P2)
980        A0=CV1-CV2/(C1*P1)
981        RETURN
982        END
983
984
985
986        INTEGER FUNCTION MSTA1(X,MP)
987C
988C       ===================================================
989C       Purpose: Determine the starting point for backward
990C                recurrence such that the magnitude of
991C                Jn(x) at that point is about 10^(-MP)
992C       Input :  x     --- Argument of Jn(x)
993C                MP    --- Value of magnitude
994C       Output:  MSTA1 --- Starting point
995C       ===================================================
996C
997        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
998        A0=DABS(X)
999        N0=INT(1.1D0*A0)+1
1000        F0=ENVJ(N0,A0)-MP
1001        N1=N0+5
1002        F1=ENVJ(N1,A0)-MP
1003        DO 10 IT=1,20
1004           NN=N1-(N1-N0)/(1.0D0-F0/F1)
1005           F=ENVJ(NN,A0)-MP
1006           IF(ABS(NN-N1).LT.1) GO TO 20
1007           N0=N1
1008           F0=F1
1009           N1=NN
1010 10        F1=F
1011 20     MSTA1=NN
1012        RETURN
1013        END
1014
1015
1016        INTEGER FUNCTION MSTA2(X,N,MP)
1017C
1018C       ===================================================
1019C       Purpose: Determine the starting point for backward
1020C                recurrence such that all Jn(x) has MP
1021C                significant digits
1022C       Input :  x  --- Argument of Jn(x)
1023C                n  --- Order of Jn(x)
1024C                MP --- Significant digit
1025C       Output:  MSTA2 --- Starting point
1026C       ===================================================
1027C
1028        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1029        A0=DABS(X)
1030        HMP=0.5D0*MP
1031        EJN=ENVJ(N,A0)
1032        IF (EJN.LE.HMP) THEN
1033           OBJ=MP
1034           N0=INT(1.1*A0)+1
1035        ELSE
1036           OBJ=HMP+EJN
1037           N0=N
1038        ENDIF
1039        F0=ENVJ(N0,A0)-OBJ
1040        N1=N0+5
1041        F1=ENVJ(N1,A0)-OBJ
1042        DO 10 IT=1,20
1043           NN=N1-(N1-N0)/(1.0D0-F0/F1)
1044           F=ENVJ(NN,A0)-OBJ
1045           IF (ABS(NN-N1).LT.1) GO TO 20
1046           N0=N1
1047           F0=F1
1048           N1=NN
104910         F1=F
105020      MSTA2=NN+10
1051        RETURN
1052        END
1053
1054        REAL*8 FUNCTION ENVJ(N,X)
1055        DOUBLE PRECISION X
1056        ENVJ=0.5D0*DLOG10(6.28D0*N)-N*DLOG10(1.36D0*X/N)
1057        RETURN
1058        END
1059
1060C       **********************************
1061
1062        SUBROUTINE ITTJYB(X,TTJ,TTY)
1063C
1064C       ==========================================================
1065C       Purpose: Integrate [1-J0(t)]/t with respect to t from 0
1066C                to x, and Y0(t)/t with respect to t from x to ∞
1067C       Input :  x   --- Variable in the limits  ( x ≥ 0 )
1068C       Output:  TTJ --- Integration of [1-J0(t)]/t from 0 to x
1069C                TTY --- Integration of Y0(t)/t from x to ∞
1070C       ==========================================================
1071C
1072        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1073        PI=3.141592653589793D0
1074        EL=.5772156649015329D0
1075        IF (X.EQ.0.0D0) THEN
1076           TTJ=0.0D0
1077           TTY=-1.0D+300
1078        ELSE IF (X.LE.4.0D0) THEN
1079           X1=X/4.0D0
1080           T=X1*X1
1081           TTJ=((((((.35817D-4*T-.639765D-3)*T+.7092535D-2)*T
1082     &         -.055544803D0)*T+.296292677D0)*T-.999999326D0)
1083     &         *T+1.999999936D0)*T
1084           TTY=(((((((-.3546D-5*T+.76217D-4)*T-.1059499D-2)*T
1085     &         +.010787555D0)*T-.07810271D0)*T+.377255736D0)
1086     &         *T-1.114084491D0)*T+1.909859297D0)*T
1087           E0=EL+DLOG(X/2.0D0)
1088           TTY=PI/6.0D0+E0/PI*(2.0D0*TTJ-E0)-TTY
1089        ELSE IF (X.LE.8.0D0) THEN
1090           XT=X+.25D0*PI
1091           T1=4.0D0/X
1092           T=T1*T1
1093           F0=(((((.0145369D0*T-.0666297D0)*T+.1341551D0)*T
1094     &        -.1647797D0)*T+.1608874D0)*T-.2021547D0)*T
1095     &        +.7977506D0
1096           G0=((((((.0160672D0*T-.0759339D0)*T+.1576116D0)*T
1097     &        -.1960154D0)*T+.1797457D0)*T-.1702778D0)*T
1098     &        +.3235819D0)*T1
1099           TTJ=(F0*DCOS(XT)+G0*DSIN(XT))/(DSQRT(X)*X)
1100           TTJ=TTJ+EL+DLOG(X/2.0D0)
1101           TTY=(F0*DSIN(XT)-G0*DCOS(XT))/(DSQRT(X)*X)
1102        ELSE
1103           T=8.0D0/X
1104           XT=X+.25D0*PI
1105           F0=(((((.18118D-2*T-.91909D-2)*T+.017033D0)*T
1106     &        -.9394D-3)*T-.051445D0)*T-.11D-5)*T+.7978846D0
1107           G0=(((((-.23731D-2*T+.59842D-2)*T+.24437D-2)*T
1108     &      -.0233178D0)*T+.595D-4)*T+.1620695D0)*T
1109           TTJ=(F0*DCOS(XT)+G0*DSIN(XT))/(DSQRT(X)*X)
1110     &         +EL+DLOG(X/2.0D0)
1111           TTY=(F0*DSIN(XT)-G0*DCOS(XT))/(DSQRT(X)*X)
1112        ENDIF
1113        RETURN
1114        END
1115
1116C       **********************************
1117
1118        SUBROUTINE ITTJYA(X,TTJ,TTY)
1119C
1120C       =========================================================
1121C       Purpose: Integrate [1-J0(t)]/t with respect to t from 0
1122C                to x, and Y0(t)/t with respect to t from x to ∞
1123C       Input :  x   --- Variable in the limits  ( x ≥ 0 )
1124C       Output:  TTJ --- Integration of [1-J0(t)]/t from 0 to x
1125C                TTY --- Integration of Y0(t)/t from x to ∞
1126C       =========================================================
1127C
1128        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1129        PI=3.141592653589793D0
1130        EL=.5772156649015329D0
1131        IF (X.EQ.0.0D0) THEN
1132           TTJ=0.0D0
1133           TTY=-1.0D+300
1134        ELSE IF (X.LE.20.0D0) THEN
1135           TTJ=1.0D0
1136           R=1.0D0
1137           DO 10 K=2,100
1138              R=-.25D0*R*(K-1.0D0)/(K*K*K)*X*X
1139              TTJ=TTJ+R
1140              IF (DABS(R).LT.DABS(TTJ)*1.0D-12) GO TO 15
114110         CONTINUE
114215         TTJ=TTJ*.125D0*X*X
1143           E0=.5D0*(PI*PI/6.0D0-EL*EL)-(.5D0*DLOG(X/2.0D0)+EL)
1144     &        *DLOG(X/2.0D0)
1145           B1=EL+DLOG(X/2.0D0)-1.5D0
1146           RS=1.0D0
1147           R=-1.0D0
1148           DO 20 K=2,100
1149              R=-.25D0*R*(K-1.0D0)/(K*K*K)*X*X
1150              RS=RS+1.0D0/K
1151              R2=R*(RS+1.0D0/(2.0D0*K)-(EL+DLOG(X/2.0D0)))
1152              B1=B1+R2
1153              IF (DABS(R2).LT.DABS(B1)*1.0D-12) GO TO 25
115420         CONTINUE
115525         TTY=2.0D0/PI*(E0+.125D0*X*X*B1)
1156        ELSE
1157           A0=DSQRT(2.0D0/(PI*X))
1158           BJ0=0.0D0
1159           BY0=0.0D0
1160           BJ1=0.0D0
1161           DO 50 L=0,1
1162              VT=4.0D0*L*L
1163              PX=1.0D0
1164              R=1.0D0
1165              DO 30 K=1,14
1166                 R=-.0078125D0*R*(VT-(4.0D0*K-3.0D0)**2)
1167     &             /(X*K)*(VT-(4.0D0*K-1.0D0)**2)
1168     &             /((2.0D0*K-1.0D0)*X)
1169                 PX=PX+R
1170                 IF (DABS(R).LT.DABS(PX)*1.0D-12) GO TO 35
117130            CONTINUE
117235            QX=1.0D0
1173              R=1.0D0
1174              DO 40 K=1,14
1175                 R=-.0078125D0*R*(VT-(4.0D0*K-1.0D0)**2)
1176     &             /(X*K)*(VT-(4.0D0*K+1.0D0)**2)
1177     &             /(2.0D0*K+1.0D0)/X
1178                 QX=QX+R
1179                 IF (DABS(R).LT.DABS(QX)*1.0D-12) GO TO 45
118040            CONTINUE
118145            QX=.125D0*(VT-1.0D0)/X*QX
1182              XK=X-(.25D0+.5D0*L)*PI
1183              BJ1=A0*(PX*DCOS(XK)-QX*DSIN(XK))
1184              BY1=A0*(PX*DSIN(XK)+QX*DCOS(XK))
1185              IF (L.EQ.0) THEN
1186                 BJ0=BJ1
1187                 BY0=BY1
1188              ENDIF
118950         CONTINUE
1190           T=2.0D0/X
1191           G0=1.0D0
1192           R0=1.0D0
1193           DO 55 K=1,10
1194              R0=-K*K*T*T*R0
119555            G0=G0+R0
1196           G1=1.0D0
1197           R1=1.0D0
1198           DO 60 K=1,10
1199              R1=-K*(K+1.0D0)*T*T*R1
120060            G1=G1+R1
1201           TTJ=2.0D0*G1*BJ0/(X*X)-G0*BJ1/X+EL+DLOG(X/2.0D0)
1202           TTY=2.0D0*G1*BY0/(X*X)-G0*BY1/X
1203        ENDIF
1204        RETURN
1205        END
1206
1207C       **********************************
1208
1209        SUBROUTINE CJYLV(V,Z,CBJV,CDJV,CBYV,CDYV)
1210C
1211C       ===================================================
1212C       Purpose: Compute Bessel functions Jv(z) and Yv(z)
1213C                and their derivatives with a complex
1214C                argument and a large order
1215C       Input:   v --- Order of Jv(z) and Yv(z)
1216C                z --- Complex argument
1217C       Output:  CBJV --- Jv(z)
1218C                CDJV --- Jv'(z)
1219C                CBYV --- Yv(z)
1220C                CDYV --- Yv'(z)
1221C       Routine called:
1222C                CJK to compute the expansion coefficients
1223C       ===================================================
1224C
1225        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
1226        IMPLICIT COMPLEX*16 (C,Z)
1227        DIMENSION CF(12),A(91)
1228        KM=12
1229        CALL CJK(KM,A)
1230        PI=3.141592653589793D0
1231        DO 30 L=1,0,-1
1232           V0=V-L
1233           CWS=CDSQRT(1.0D0-(Z/V0)*(Z/V0))
1234           CETA=CWS+CDLOG(Z/V0/(1.0D0+CWS))
1235           CT=1.0D0/CWS
1236           CT2=CT*CT
1237           DO 15 K=1,KM
1238              L0=K*(K+1)/2+1
1239              LF=L0+K
1240              CF(K)=A(LF)
1241              DO 10 I=LF-1,L0,-1
124210               CF(K)=CF(K)*CT2+A(I)
124315            CF(K)=CF(K)*CT**K
1244           VR=1.0D0/V0
1245           CSJ=(1.0D0,0.0D0)
1246           DO 20 K=1,KM
124720            CSJ=CSJ+CF(K)*VR**K
1248           CBJV=CDSQRT(CT/(2.0D0*PI*V0))*CDEXP(V0*CETA)*CSJ
1249           IF (L.EQ.1) CFJ=CBJV
1250           CSY=(1.0D0,0.0D0)
1251           DO 25 K=1,KM
125225            CSY=CSY+(-1)**K*CF(K)*VR**K
1253           CBYV=-CDSQRT(2.0D0*CT/(PI*V0))*CDEXP(-V0*CETA)*CSY
1254           IF (L.EQ.1) CFY=CBYV
125530      CONTINUE
1256        CDJV=-V/Z*CBJV+CFJ
1257        CDYV=-V/Z*CBYV+CFY
1258        RETURN
1259        END
1260
1261
1262
1263C       **********************************
1264
1265        SUBROUTINE RMN2L(M,N,C,X,DF,KD,R2F,R2D,ID)
1266C
1267C       ========================================================
1268C       Purpose: Compute prolate and oblate spheroidal radial
1269C                functions of the second kind for given m, n,
1270C                c and a large cx
1271C       Routine called:
1272C                SPHY for computing the spherical Bessel
1273C                functions of the second kind
1274C       ========================================================
1275C
1276        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1277        DIMENSION DF(200),SY(0:251),DY(0:251)
1278        EPS=1.0D-14
1279        IP=1
1280        NM1=INT((N-M)/2)
1281        IF (N-M.EQ.2*NM1) IP=0
1282        NM=25+NM1+INT(C)
1283        REG=1.0D0
1284        IF (M+NM.GT.80) REG=1.0D-200
1285        NM2=2*NM+M
1286        CX=C*X
1287        CALL SPHY(NM2,CX,NM2,SY,DY)
1288        R0=REG
1289        DO 10 J=1,2*M+IP
129010         R0=R0*J
1291        R=R0
1292        SUC=R*DF(1)
1293        SW=0.0D0
1294        DO 15 K=2,NM
1295           R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
1296           SUC=SUC+R*DF(K)
1297           IF (K.GT.NM1.AND.DABS(SUC-SW).LT.DABS(SUC)*EPS) GO TO 20
129815         SW=SUC
129920      A0=(1.0D0-KD/(X*X))**(0.5D0*M)/SUC
1300        R2F=0.0D0
1301        EPS1=0.0D0
1302        NP=0
1303        DO 50 K=1,NM
1304           L=2*K+M-N-2+IP
1305           LG=1
1306           IF (L.NE.4*INT(L/4)) LG=-1
1307           IF (K.EQ.1) THEN
1308              R=R0
1309           ELSE
1310              R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
1311           ENDIF
1312           NP=M+2*K-2+IP
1313           R2F=R2F+LG*R*(DF(K)*SY(NP))
1314           EPS1=DABS(R2F-SW)
1315           IF (K.GT.NM1.AND.EPS1.LT.DABS(R2F)*EPS) GO TO 55
131650         SW=R2F
131755      ID1=INT(LOG10(EPS1/DABS(R2F)+EPS))
1318        R2F=R2F*A0
1319        IF (NP.GE.NM2) THEN
1320           ID=10
1321           RETURN
1322        ENDIF
1323        B0=KD*M/X**3.0D0/(1.0-KD/(X*X))*R2F
1324        SUD=0.0D0
1325        EPS2=0.0D0
1326        DO 60 K=1,NM
1327           L=2*K+M-N-2+IP
1328           LG=1
1329           IF (L.NE.4*INT(L/4)) LG=-1
1330           IF (K.EQ.1) THEN
1331              R=R0
1332           ELSE
1333              R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
1334           ENDIF
1335           NP=M+2*K-2+IP
1336           SUD=SUD+LG*R*(DF(K)*DY(NP))
1337           EPS2=DABS(SUD-SW)
1338           IF (K.GT.NM1.AND.EPS2.LT.DABS(SUD)*EPS) GO TO 65
133960         SW=SUD
134065      R2D=B0+A0*C*SUD
1341        ID2=INT(LOG10(EPS2/DABS(SUD)+EPS))
1342        ID=MAX(ID1,ID2)
1343        RETURN
1344        END
1345
1346
1347
1348C       **********************************
1349
1350        SUBROUTINE PSI_SPEC(X,PS)
1351C
1352C       ======================================
1353C       Purpose: Compute Psi function
1354C       Input :  x  --- Argument of psi(x)
1355C       Output:  PS --- psi(x)
1356C       ======================================
1357C
1358        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1359        XA=DABS(X)
1360        PI=3.141592653589793D0
1361        EL=.5772156649015329D0
1362        S=0.0D0
1363        IF (X.EQ.INT(X).AND.X.LE.0.0) THEN
1364           PS=1.0D+300
1365           RETURN
1366        ELSE IF (XA.EQ.INT(XA)) THEN
1367           N=XA
1368           DO 10 K=1 ,N-1
136910            S=S+1.0D0/K
1370           PS=-EL+S
1371        ELSE IF (XA+.5.EQ.INT(XA+.5)) THEN
1372           N=XA-.5
1373           DO 20 K=1,N
137420            S=S+1.0/(2.0D0*K-1.0D0)
1375           PS=-EL+2.0D0*S-1.386294361119891D0
1376        ELSE
1377           IF (XA.LT.10.0) THEN
1378              N=10-INT(XA)
1379              DO 30 K=0,N-1
138030               S=S+1.0D0/(XA+K)
1381              XA=XA+N
1382           ENDIF
1383           X2=1.0D0/(XA*XA)
1384           A1=-.8333333333333D-01
1385           A2=.83333333333333333D-02
1386           A3=-.39682539682539683D-02
1387           A4=.41666666666666667D-02
1388           A5=-.75757575757575758D-02
1389           A6=.21092796092796093D-01
1390           A7=-.83333333333333333D-01
1391           A8=.4432598039215686D0
1392           PS=DLOG(XA)-.5D0/XA+X2*(((((((A8*X2+A7)*X2+
1393     &        A6)*X2+A5)*X2+A4)*X2+A3)*X2+A2)*X2+A1)
1394           PS=PS-S
1395        ENDIF
1396        IF (X.LT.0.0) PS=PS-PI*DCOS(PI*X)/DSIN(PI*X)-1.0D0/X
1397        RETURN
1398        END
1399
1400C       **********************************
1401
1402        SUBROUTINE CVA2(KD,M,Q,A)
1403C
1404C       ======================================================
1405C       Purpose: Calculate a specific characteristic value of
1406C                Mathieu functions
1407C       Input :  m  --- Order of Mathieu functions
1408C                q  --- Parameter of Mathieu functions
1409C                KD --- Case code
1410C                       KD=1 for cem(x,q)  ( m = 0,2,4,...)
1411C                       KD=2 for cem(x,q)  ( m = 1,3,5,...)
1412C                       KD=3 for sem(x,q)  ( m = 1,3,5,...)
1413C                       KD=4 for sem(x,q)  ( m = 2,4,6,...)
1414C       Output:  A  --- Characteristic value
1415C       Routines called:
1416C             (1) REFINE for finding accurate characteristic
1417C                 value using an iteration method
1418C             (2) CV0 for finding initial characteristic
1419C                 values using polynomial approximation
1420C             (3) CVQM for computing initial characteristic
1421C                 values for q ≤ 3*m
1422C             (3) CVQL for computing initial characteristic
1423C                 values for q ≥ m*m
1424C       ======================================================
1425C
1426        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1427        IF (M.LE.12.OR.Q.LE.3.0*M.OR.Q.GT.M*M) THEN
1428            CALL CV0(KD,M,Q,A)
1429            IF (Q.NE.0.0D0.AND.M.NE.2) CALL REFINE(KD,M,Q,A)
1430            IF (Q.GT.2.0D-3.AND.M.EQ.2) CALL REFINE(KD,M,Q,A)
1431        ELSE
1432           NDIV=10
1433           DELTA=(M-3.0)*M/NDIV
1434           IF ((Q-3.0*M).LE.(M*M-Q)) THEN
14355             NN=INT((Q-3.0*M)/DELTA)+1
1436              DELTA=(Q-3.0*M)/NN
1437              Q1=2.0*M
1438              CALL CVQM(M,Q1,A1)
1439              Q2=3.0*M
1440              CALL CVQM(M,Q2,A2)
1441              QQ=3.0*M
1442              DO 10 I=1,NN
1443                 QQ=QQ+DELTA
1444                 A=(A1*Q2-A2*Q1+(A2-A1)*QQ)/(Q2-Q1)
1445                 IFLAG=1
1446                 IF (I.EQ.NN) IFLAG=-1
1447                 CALL REFINE(KD,M,QQ,A)
1448                 Q1=Q2
1449                 Q2=QQ
1450                 A1=A2
1451                 A2=A
145210            CONTINUE
1453              IF (IFLAG.EQ.-10) THEN
1454                 NDIV=NDIV*2
1455                 DELTA=(M-3.0)*M/NDIV
1456                 GO TO 5
1457              ENDIF
1458           ELSE
145915            NN=INT((M*M-Q)/DELTA)+1
1460              DELTA=(M*M-Q)/NN
1461              Q1=M*(M-1.0)
1462              CALL CVQL(KD,M,Q1,A1)
1463              Q2=M*M
1464              CALL CVQL(KD,M,Q2,A2)
1465              QQ=M*M
1466              DO 20 I=1,NN
1467                 QQ=QQ-DELTA
1468                 A=(A1*Q2-A2*Q1+(A2-A1)*QQ)/(Q2-Q1)
1469                 IFLAG=1
1470                 IF (I.EQ.NN) IFLAG=-1
1471                 CALL REFINE(KD,M,QQ,A)
1472                 Q1=Q2
1473                 Q2=QQ
1474                 A1=A2
1475                 A2=A
147620            CONTINUE
1477              IF (IFLAG.EQ.-10) THEN
1478                 NDIV=NDIV*2
1479                 DELTA=(M-3.0)*M/NDIV
1480                 GO TO 15
1481              ENDIF
1482           ENDIF
1483        ENDIF
1484        RETURN
1485        END
1486
1487
1488
1489C       **********************************
1490
1491        SUBROUTINE LPMNS(M,N,X,PM,PD)
1492C
1493C       ========================================================
1494C       Purpose: Compute associated Legendre functions Pmn(x)
1495C                and Pmn'(x) for a given order
1496C       Input :  x --- Argument of Pmn(x)
1497C                m --- Order of Pmn(x),  m = 0,1,2,...,n
1498C                n --- Degree of Pmn(x), n = 0,1,2,...,N
1499C       Output:  PM(n) --- Pmn(x)
1500C                PD(n) --- Pmn'(x)
1501C       ========================================================
1502C
1503        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1504        DIMENSION PM(0:N),PD(0:N)
1505        DO 10 K=0,N
1506           PM(K)=0.0D0
150710         PD(K)=0.0D0
1508        IF (DABS(X).EQ.1.0D0) THEN
1509           DO 15 K=0,N
1510              IF (M.EQ.0) THEN
1511                 PM(K)=1.0D0
1512                 PD(K)=0.5D0*K*(K+1.0)
1513                 IF (X.LT.0.0) THEN
1514                    PM(K)=(-1)**K*PM(K)
1515                    PD(K)=(-1)**(K+1)*PD(K)
1516                 ENDIF
1517              ELSE IF (M.EQ.1) THEN
1518                 PD(K)=1.0D+300
1519              ELSE IF (M.EQ.2) THEN
1520                 PD(K)=-0.25D0*(K+2.0)*(K+1.0)*K*(K-1.0)
1521                 IF (X.LT.0.0) PD(K)=(-1)**(K+1)*PD(K)
1522              ENDIF
152315         CONTINUE
1524           RETURN
1525        ENDIF
1526        X0=DABS(1.0D0-X*X)
1527        PM0=1.0D0
1528        PMK=PM0
1529        DO 20 K=1,M
1530           PMK=(2.0D0*K-1.0D0)*DSQRT(X0)*PM0
153120         PM0=PMK
1532        PM1=(2.0D0*M+1.0D0)*X*PM0
1533        PM(M)=PMK
1534        PM(M+1)=PM1
1535        DO 25 K=M+2,N
1536           PM2=((2.0D0*K-1.0D0)*X*PM1-(K+M-1.0D0)*PMK)/(K-M)
1537           PM(K)=PM2
1538           PMK=PM1
153925         PM1=PM2
1540        PD(0)=((1.0D0-M)*PM(1)-X*PM(0))/(X*X-1.0)
1541        DO 30 K=1,N
154230         PD(K)=(K*X*PM(K)-(K+M)*PM(K-1))/(X*X-1.0D0)
1543        DO 35 K=1,N
1544           PM(K)=(-1)**M*PM(K)
154535         PD(K)=(-1)**M*PD(K)
1546        RETURN
1547        END
1548
1549C       **********************************
1550
1551        SUBROUTINE CERF(Z,CER,CDER)
1552C
1553C       ==========================================================
1554C       Purpose: Compute complex Error function erf(z) & erf'(z)
1555C       Input:   z   --- Complex argument of erf(z)
1556C                x   --- Real part of z
1557C                y   --- Imaginary part of z
1558C       Output:  CER --- erf(z)
1559C                CDER --- erf'(z)
1560C       ==========================================================
1561        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1562        COMPLEX *16 Z,CER,CDER
1563        EPS=1.0D-12
1564        PI=3.141592653589793D0
1565        X=DBLE(Z)
1566        Y=DIMAG(Z)
1567        X2=X*X
1568        IF (X.LE.3.5D0) THEN
1569           ER=1.0D0
1570           R=1.0D0
1571           W=0.0D0
1572           DO 10 K=1,100
1573              R=R*X2/(K+0.5D0)
1574              ER=ER+R
1575              IF (DABS(ER-W).LE.EPS*DABS(ER)) GO TO 15
157610            W=ER
157715         C0=2.0D0/DSQRT(PI)*X*DEXP(-X2)
1578           ER0=C0*ER
1579        ELSE
1580           ER=1.0D0
1581           R=1.0D0
1582           DO 20 K=1,12
1583              R=-R*(K-0.5D0)/X2
158420            ER=ER+R
1585           C0=DEXP(-X2)/(X*DSQRT(PI))
1586           ER0=1.0D0-C0*ER
1587        ENDIF
1588        IF (Y.EQ.0.0D0) THEN
1589           ERR=ER0
1590           ERI=0.0D0
1591        ELSE
1592           CS=DCOS(2.0D0*X*Y)
1593           SS=DSIN(2.0D0*X*Y)
1594           ER1=DEXP(-X2)*(1.0D0-CS)/(2.0D0*PI*X)
1595           EI1=DEXP(-X2)*SS/(2.0D0*PI*X)
1596           ER2=0.0D0
1597           W1=0.0D0
1598           DO 25 N=1,100
1599              ER2=ER2+DEXP(-.25D0*N*N)/(N*N+4.0D0*X2)*(2.0D0*X
1600     &            -2.0D0*X*DCOSH(N*Y)*CS+N*DSINH(N*Y)*SS)
1601              IF (DABS((ER2-W1)/ER2).LT.EPS) GO TO 30
160225            W1=ER2
160330         C0=2.0D0*DEXP(-X2)/PI
1604           ERR=ER0+ER1+C0*ER2
1605           EI2=0.0D0
1606           W2=0.0D0
1607           DO 35 N=1,100
1608              EI2=EI2+DEXP(-.25D0*N*N)/(N*N+4.0D0*X2)*(2.0D0*X
1609     &            *DCOSH(N*Y)*SS+N*DSINH(N*Y)*CS)
1610              IF (DABS((EI2-W2)/EI2).LT.EPS) GO TO 40
161135            W2=EI2
161240         ERI=EI1+C0*EI2
1613        ENDIF
1614        CER = DCMPLX(ERR, ERI)
1615        CDER=2.0D0/DSQRT(PI)*CDEXP(-Z*Z)
1616        RETURN
1617        END
1618
1619C       **********************************
1620
1621        SUBROUTINE RSWFP(M,N,C,X,CV,KF,R1F,R1D,R2F,R2D)
1622C
1623C       ==============================================================
1624C       Purpose: Compute prolate spheriodal radial functions of the
1625C                first and second kinds, and their derivatives
1626C       Input :  m  --- Mode parameter, m = 0,1,2,...
1627C                n  --- Mode parameter, n = m,m+1,m+2,...
1628C                c  --- Spheroidal parameter
1629C                x  --- Argument of radial function ( x > 1.0 )
1630C                cv --- Characteristic value
1631C                KF --- Function code
1632C                       KF=1 for the first kind
1633C                       KF=2 for the second kind
1634C                       KF=3 for both the first and second kinds
1635C       Output:  R1F --- Radial function of the first kind
1636C                R1D --- Derivative of the radial function of
1637C                        the first kind
1638C                R2F --- Radial function of the second kind
1639C                R2D --- Derivative of the radial function of
1640C                        the second kind
1641C       Routines called:
1642C            (1) SDMN for computing expansion coefficients dk
1643C            (2) RMN1 for computing prolate and oblate radial
1644C                functions of the first kind
1645C            (3) RMN2L for computing prolate and oblate radial
1646C                functions of the second kind for a large argument
1647C            (4) RMN2SP for computing the prolate radial function
1648C                of the second kind for a small argument
1649C       ==============================================================
1650C
1651        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1652        DIMENSION DF(200)
1653        KD=1
1654        CALL SDMN(M,N,C,CV,KD,DF)
1655        IF (KF.NE.2) THEN
1656           CALL RMN1(M,N,C,X,DF,KD,R1F,R1D)
1657        ENDIF
1658        IF (KF.GT.1) THEN
1659           CALL RMN2L(M,N,C,X,DF,KD,R2F,R2D,ID)
1660           IF (ID.GT.-8) THEN
1661              CALL RMN2SP(M,N,C,X,CV,DF,KD,R2F,R2D)
1662           ENDIF
1663        ENDIF
1664        RETURN
1665        END
1666
1667
1668
1669C       **********************************
1670
1671        SUBROUTINE JYNDD(N,X,BJN,DJN,FJN,BYN,DYN,FYN)
1672C
1673C       ===========================================================
1674C       Purpose: Compute Bessel functions Jn(x) and Yn(x), and
1675C                their first and second derivatives
1676C       Input:   x   ---  Argument of Jn(x) and Yn(x) ( x > 0 )
1677C                n   ---  Order of Jn(x) and Yn(x)
1678C       Output:  BJN ---  Jn(x)
1679C                DJN ---  Jn'(x)
1680C                FJN ---  Jn"(x)
1681C                BYN ---  Yn(x)
1682C                DYN ---  Yn'(x)
1683C                FYN ---  Yn"(x)
1684C       Routines called:
1685C                JYNBH to compute Jn and Yn
1686C       ===========================================================
1687C
1688        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1689        DIMENSION BJ(2),BY(2)
1690        CALL JYNBH(N+1,N,X,NM,BJ,BY)
1691C       Compute derivatives by differentiation formulas
1692        BJN=BJ(1)
1693        BYN=BY(1)
1694        DJN=-BJ(2)+N*BJ(1)/X
1695        DYN=-BY(2)+N*BY(1)/X
1696        FJN=(N*N/(X*X)-1.0D0)*BJN-DJN/X
1697        FYN=(N*N/(X*X)-1.0D0)*BYN-DYN/X
1698        RETURN
1699        END
1700
1701
1702C       **********************************
1703
1704        SUBROUTINE GAM0 (X,GA)
1705C
1706C       ================================================
1707C       Purpose: Compute gamma function Г(x)
1708C       Input :  x  --- Argument of Г(x)  ( |x| ≤ 1 )
1709C       Output:  GA --- Г(x)
1710C       ================================================
1711C
1712        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1713        DIMENSION G(25)
1714        DATA G/1.0D0,0.5772156649015329D0,
1715     &       -0.6558780715202538D0, -0.420026350340952D-1,
1716     &        0.1665386113822915D0, -.421977345555443D-1,
1717     &        -.96219715278770D-2, .72189432466630D-2,
1718     &        -.11651675918591D-2, -.2152416741149D-3,
1719     &         .1280502823882D-3, -.201348547807D-4,
1720     &        -.12504934821D-5, .11330272320D-5,
1721     &        -.2056338417D-6, .61160950D-8,
1722     &         .50020075D-8, -.11812746D-8,
1723     &         .1043427D-9, .77823D-11,
1724     &        -.36968D-11, .51D-12,
1725     &        -.206D-13, -.54D-14, .14D-14/
1726        GR=(25)
1727        DO 20 K=24,1,-1
172820         GR=GR*X+G(K)
1729        GA=1.0D0/(GR*X)
1730        RETURN
1731        END
1732
1733
1734C       **********************************
1735
1736        SUBROUTINE CISIB(X,CI,SI)
1737C
1738C       =============================================
1739C       Purpose: Compute cosine and sine integrals
1740C                Si(x) and Ci(x) ( x ≥ 0 )
1741C       Input :  x  --- Argument of Ci(x) and Si(x)
1742C       Output:  CI --- Ci(x)
1743C                SI --- Si(x)
1744C       =============================================
1745C
1746        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1747        X2=X*X
1748        IF (X.EQ.0.0) THEN
1749           CI=-1.0D+300
1750           SI=0.0D0
1751        ELSE IF (X.LE.1.0D0) THEN
1752           CI=((((-3.0D-8*X2+3.10D-6)*X2-2.3148D-4)
1753     &        *X2+1.041667D-2)*X2-0.25)*X2+0.577215665D0+LOG(X)
1754           SI=((((3.1D-7*X2-2.834D-5)*X2+1.66667D-003)
1755     &        *X2-5.555556D-002)*X2+1.0)*X
1756        ELSE
1757           FX=((((X2+38.027264D0)*X2+265.187033D0)*X2
1758     &        +335.67732D0)*X2+38.102495D0)/((((X2
1759     &        +40.021433D0)*X2+322.624911D0)*X2
1760     &        +570.23628D0)*X2+157.105423D0)
1761           GX=((((X2+42.242855D0)*X2+302.757865D0)*X2
1762     &        +352.018498D0)*X2+21.821899D0)/((((X2
1763     &        +48.196927D0)*X2+482.485984D0)*X2
1764     &        +1114.978885D0)*X2+449.690326D0)/X
1765           CI=FX*SIN(X)/X-GX*COS(X)/X
1766           SI=1.570796327D0-FX*COS(X)/X-GX*SIN(X)/X
1767        ENDIF
1768        RETURN
1769        END
1770
1771C       **********************************
1772
1773        SUBROUTINE EULERA(N,EN)
1774C
1775C       ======================================
1776C       Purpose: Compute Euler number En
1777C       Input :  n --- Serial number
1778C       Output:  EN(n) --- En
1779C       ======================================
1780C
1781        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1782        DIMENSION EN(0:N)
1783        EN(0)=1.0D0
1784        DO 30 M=1,N/2
1785           S=1.0D0
1786           DO 20 K=1,M-1
1787              R=1.0D0
1788              DO 10 J=1,2*K
178910               R=R*(2.0D0*M-2.0D0*K+J)/J
179020            S=S+R*EN(2*K)
179130         EN(2*M)=-S
1792        RETURN
1793        END
1794
1795C       **********************************
1796
1797        SUBROUTINE REFINE(KD,M,Q,A)
1798C
1799C       =====================================================
1800C       Purpose: calculate the accurate characteristic value
1801C                by the secant method
1802C       Input :  m --- Order of Mathieu functions
1803C                q --- Parameter of Mathieu functions
1804C                A --- Initial characteristic value
1805C       Output:  A --- Refineed characteristic value
1806C       Routine called:  CVF for computing the value of F for
1807C                        characteristic equation
1808C       ========================================================
1809C
1810        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1811        EPS=1.0D-14
1812        MJ=10+M
1813        CA=A
1814        DELTA=0.0D0
1815        X0=A
1816        CALL CVF(KD,M,Q,X0,MJ,F0)
1817        X1=1.002*A
1818        CALL CVF(KD,M,Q,X1,MJ,F1)
1819        DO 10 IT=1,100
1820           MJ=MJ+1
1821           X=X1-(X1-X0)/(1.0D0-F0/F1)
1822           CALL CVF(KD,M,Q,X,MJ,F)
1823           IF (ABS(1.0-X1/X).LT.EPS.OR.F.EQ.0.0) GO TO 15
1824           X0=X1
1825           F0=F1
1826           X1=X
182710         F1=F
182815      A=X
1829        RETURN
1830        END
1831
1832
1833
1834C       **********************************
1835
1836        SUBROUTINE CISIA(X,CI,SI)
1837C
1838C       =============================================
1839C       Purpose: Compute cosine and sine integrals
1840C                Si(x) and Ci(x)  ( x ≥ 0 )
1841C       Input :  x  --- Argument of Ci(x) and Si(x)
1842C       Output:  CI --- Ci(x)
1843C                SI --- Si(x)
1844C       =============================================
1845C
1846        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1847        DIMENSION BJ(101)
1848        P2=1.570796326794897D0
1849        EL=.5772156649015329D0
1850        EPS=1.0D-15
1851        X2=X*X
1852        IF (X.EQ.0.0D0) THEN
1853           CI=-1.0D+300
1854           SI=0.0D0
1855        ELSE IF (X.LE.16.0D0) THEN
1856           XR=-.25D0*X2
1857           CI=EL+DLOG(X)+XR
1858           DO 10 K=2,40
1859              XR=-.5D0*XR*(K-1)/(K*K*(2*K-1))*X2
1860              CI=CI+XR
1861              IF (DABS(XR).LT.DABS(CI)*EPS) GO TO 15
186210         CONTINUE
186315         XR=X
1864           SI=X
1865           DO 20 K=1,40
1866              XR=-.5D0*XR*(2*K-1)/K/(4*K*K+4*K+1)*X2
1867              SI=SI+XR
1868              IF (DABS(XR).LT.DABS(SI)*EPS) RETURN
186920         CONTINUE
1870        ELSE IF (X.LE.32.0D0) THEN
1871           M=INT(47.2+.82*X)
1872           XA1=0.0D0
1873           XA0=1.0D-100
1874           DO 25 K=M,1,-1
1875              XA=4.0D0*K*XA0/X-XA1
1876              BJ(K)=XA
1877              XA1=XA0
187825            XA0=XA
1879           XS=BJ(1)
1880           DO 30 K=3,M,2
188130            XS=XS+2.0D0*BJ(K)
1882           BJ(1)=BJ(1)/XS
1883           DO 35 K=2,M
188435            BJ(K)=BJ(K)/XS
1885           XR=1.0D0
1886           XG1=BJ(1)
1887           DO 40 K=2,M
1888              XR=.25D0*XR*(2.0*K-3.0)**2/((K-1.0)*(2.0*K-1.0)**2)*X
188940            XG1=XG1+BJ(K)*XR
1890           XR=1.0D0
1891           XG2=BJ(1)
1892           DO 45 K=2,M
1893              XR=.25D0*XR*(2.0*K-5.0)**2/((K-1.0)*(2.0*K-3.0)**2)*X
189445            XG2=XG2+BJ(K)*XR
1895           XCS=DCOS(X/2.0D0)
1896           XSS=DSIN(X/2.0D0)
1897           CI=EL+DLOG(X)-X*XSS*XG1+2*XCS*XG2-2*XCS*XCS
1898           SI=X*XCS*XG1+2*XSS*XG2-DSIN(X)
1899        ELSE
1900           XR=1.0D0
1901           XF=1.0D0
1902           DO 50 K=1,9
1903              XR=-2.0D0*XR*K*(2*K-1)/X2
190450            XF=XF+XR
1905           XR=1.0D0/X
1906           XG=XR
1907           DO 55 K=1,8
1908              XR=-2.0D0*XR*(2*K+1)*K/X2
190955            XG=XG+XR
1910           CI=XF*DSIN(X)/X-XG*DCOS(X)/X
1911           SI=P2-XF*DCOS(X)/X-XG*DSIN(X)/X
1912        ENDIF
1913        RETURN
1914        END
1915
1916
1917C       **********************************
1918
1919        SUBROUTINE ITSL0(X,TL0)
1920C
1921C       ===========================================================
1922C       Purpose: Evaluate the integral of modified Struve function
1923C                L0(t) with respect to t from 0 to x
1924C       Input :  x   --- Upper limit  ( x ≥ 0 )
1925C       Output:  TL0 --- Integration of L0(t) from 0 to x
1926C       ===========================================================
1927C
1928        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
1929        DIMENSION A(18)
1930        PI=3.141592653589793D0
1931        R=1.0D0
1932        IF (X.LE.20.0) THEN
1933           S=0.5D0
1934           DO 10 K=1,100
1935              RD=1.0D0
1936              IF (K.EQ.1) RD=0.5D0
1937              R=R*RD*K/(K+1.0D0)*(X/(2.0D0*K+1.0D0))**2
1938              S=S+R
1939              IF (DABS(R/S).LT.1.0D-12) GO TO 15
194010         CONTINUE
194115         TL0=2.0D0/PI*X*X*S
1942        ELSE
1943           S=1.0D0
1944           DO 20 K=1,10
1945              R=R*K/(K+1.0D0)*((2.0D0*K+1.0D0)/X)**2
1946              S=S+R
1947              IF (DABS(R/S).LT.1.0D-12) GO TO 25
194820            CONTINUE
194925         EL=.57721566490153D0
1950           S0=-S/(PI*X*X)+2.0D0/PI*(DLOG(2.0D0*X)+EL)
1951           A0=1.0D0
1952           A1=5.0D0/8.0D0
1953           A(1)=A1
1954           DO 30 K=1,10
1955              AF=((1.5D0*(K+.50D0)*(K+5.0D0/6.0D0)*A1-.5D0*
1956     &            (K+.5D0)**2*(K-.5D0)*A0))/(K+1.0D0)
1957              A(K+1)=AF
1958              A0=A1
195930            A1=AF
1960           TI=1.0D0
1961           R=1.0D0
1962           DO 35 K=1,11
1963              R=R/X
196435            TI=TI+A(K)*R
1965           TL0=TI/DSQRT(2*PI*X)*DEXP(X)+S0
1966        ENDIF
1967        RETURN
1968        END
1969
1970C       **********************************
1971
1972        SUBROUTINE CLQN(N,X,Y,CQN,CQD)
1973C
1974C       ==================================================
1975C       Purpose: Compute the Legendre functions Qn(z) and
1976C                their derivatives Qn'(z) for a complex
1977C                argument
1978C       Input :  x --- Real part of z
1979C                y --- Imaginary part of z
1980C                n --- Degree of Qn(z), n = 0,1,2,...
1981C       Output:  CQN(n) --- Qn(z)
1982C                CQD(n) --- Qn'(z)
1983C       ==================================================
1984C
1985        IMPLICIT DOUBLE PRECISION (X,Y)
1986        IMPLICIT COMPLEX*16 (C,Z)
1987        DIMENSION CQN(0:N),CQD(0:N)
1988        Z = DCMPLX(X, Y)
1989        IF (Z.EQ.1.0D0) THEN
1990           DO 10 K=0,N
1991              CQN(K)=(1.0D+300,0.0D0)
199210            CQD(K)=(1.0D+300,0.0D0)
1993           RETURN
1994        ENDIF
1995        LS=1
1996        IF (CDABS(Z).GT.1.0D0) LS=-1
1997        CQ0=0.5D0*CDLOG(LS*(1.0D0+Z)/(1.0D0-Z))
1998        CQ1=Z*CQ0-1.0D0
1999        CQN(0)=CQ0
2000        CQN(1)=CQ1
2001        IF (CDABS(Z).LT.1.0001D0) THEN
2002           CQF0=CQ0
2003           CQF1=CQ1
2004           DO 15 K=2,N
2005              CQF2=((2.0D0*K-1.0D0)*Z*CQF1-(K-1.0D0)*CQF0)/K
2006              CQN(K)=CQF2
2007              CQF0=CQF1
200815            CQF1=CQF2
2009        ELSE
2010           IF (CDABS(Z).GT.1.1D0) THEN
2011              KM=40+N
2012           ELSE
2013              KM=(40+N)*INT(-1.0-1.8*LOG(CDABS(Z-1.0)))
2014           ENDIF
2015           CQF2=0.0D0
2016           CQF1=1.0D0
2017           DO 20 K=KM,0,-1
2018              CQF0=((2*K+3.0D0)*Z*CQF1-(K+2.0D0)*CQF2)/(K+1.0D0)
2019              IF (K.LE.N) CQN(K)=CQF0
2020              CQF2=CQF1
202120            CQF1=CQF0
2022           DO 25 K=0,N
202325            CQN(K)=CQN(K)*CQ0/CQF0
2024        ENDIF
2025        CQD(0)=(CQN(1)-Z*CQN(0))/(Z*Z-1.0D0)
2026        DO 30 K=1,N
202730         CQD(K)=(K*Z*CQN(K)-K*CQN(K-1))/(Z*Z-1.0D0)
2028        RETURN
2029        END
2030
2031C       **********************************
2032
2033        SUBROUTINE AIRYZO(NT,KF,XA,XB,XC,XD)
2034C
2035C       ========================================================
2036C       Purpose: Compute the first NT zeros of Airy functions
2037C                Ai(x) and Ai'(x), a and a', and the associated
2038C                values of Ai(a') and Ai'(a); and the first NT
2039C                zeros of Airy functions Bi(x) and Bi'(x), b and
2040C                b', and the associated values of Bi(b') and
2041C                Bi'(b)
2042C       Input :  NT    --- Total number of zeros
2043C                KF    --- Function code
2044C                          KF=1 for Ai(x) and Ai'(x)
2045C                          KF=2 for Bi(x) and Bi'(x)
2046C       Output:  XA(m) --- a, the m-th zero of Ai(x) or
2047C                          b, the m-th zero of Bi(x)
2048C                XB(m) --- a', the m-th zero of Ai'(x) or
2049C                          b', the m-th zero of Bi'(x)
2050C                XC(m) --- Ai(a') or Bi(b')
2051C                XD(m) --- Ai'(a) or Bi'(b)
2052C                          ( m --- Serial number of zeros )
2053C       Routine called: AIRYB for computing Airy functions and
2054C                       their derivatives
2055C       =======================================================
2056C
2057        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2058        DIMENSION XA(NT),XB(NT),XC(NT),XD(NT)
2059        PI=3.141592653589793D0
2060        RT=0.0D0
2061        DO 15 I=1,NT
2062           RT0=0D0
2063           IF (KF.EQ.1) THEN
2064              U=3.0D0*PI*(4.0D0*I-1)/8.0D0
2065              U1=1/(U*U)
2066           ELSE IF (KF.EQ.2) THEN
2067              IF (I.EQ.1) THEN
2068                 RT0=-1.17371D0
2069              ELSE
2070                 U=3.0D0*PI*(4.0D0*I-3.0D0)/8.0D0
2071                 U1=1/(U*U)
2072              ENDIF
2073           ENDIF
2074           IF (RT0.EQ.0) THEN
2075C             DLMF 9.9.18
2076              RT0=-(U*U)**(1.0D0/3.0D0)*(
2077     &            + 1D0
2078     &            + U1*(5D0/48D0
2079     &            + U1*(-5D0/36D0
2080     &            + U1*(77125D0/82944D0
2081     &            + U1*(-108056875D0/6967296D0)))))
2082           ENDIF
208310         X=RT0
2084           CALL AIRYB(X,AI,BI,AD,BD)
2085           IF (KF.EQ.1) RT=RT0-AI/AD
2086           IF (KF.EQ.2) RT=RT0-BI/BD
2087           ERR=DABS((RT-RT0)/RT)
2088           IF (ERR.GT.1.D-12) THEN
2089              RT0=RT
2090              GOTO 10
2091           ELSE
2092              XA(I)=RT
2093              IF (ERR.GT.1D-14) CALL AIRYB(RT,AI,BI,AD,BD)
2094              IF (KF.EQ.1) XD(I)=AD
2095              IF (KF.EQ.2) XD(I)=BD
2096           ENDIF
209715      CONTINUE
2098        DO 25 I=1,NT
2099           RT0=0D0
2100           IF (KF.EQ.1) THEN
2101              IF (I.EQ.1) THEN
2102                 RT0=-1.01879D0
2103              ELSE
2104                 U=3.0D0*PI*(4.0D0*I-3.0D0)/8.0D0
2105                 U1=1/(U*U)
2106              ENDIF
2107           ELSE IF (KF.EQ.2) THEN
2108              IF (I.EQ.1) THEN
2109                 RT0=-2.29444D0
2110              ELSE
2111                 U=3.0D0*PI*(4.0D0*I-1.0D0)/8.0D0
2112                 U1=1/(U*U)
2113              ENDIF
2114           ENDIF
2115           IF (RT0.EQ.0) THEN
2116C             DLMF 9.9.19
2117              RT0=-(U*U)**(1.0D0/3.0D0)*(
2118     &            + 1D0
2119     &            + U1*(-7D0/48D0
2120     &            + U1*(+35D0/288D0
2121     &            + U1*(-181223D0/207360D0
2122     &            + U1*(18683371D0/1244160D0)))))
2123           END IF
212420         X=RT0
2125           CALL AIRYB(X,AI,BI,AD,BD)
2126           IF (KF.EQ.1) RT=RT0-AD/(AI*X)
2127           IF (KF.EQ.2) RT=RT0-BD/(BI*X)
2128           ERR=DABS((RT-RT0)/RT)
2129           IF (ERR.GT.1.0D-12) THEN
2130              RT0=RT
2131              GOTO 20
2132           ELSE
2133              XB(I)=RT
2134              IF (ERR.GT.1D-14) CALL AIRYB(RT,AI,BI,AD,BD)
2135              IF (KF.EQ.1) XC(I)=AI
2136              IF (KF.EQ.2) XC(I)=BI
2137           ENDIF
213825      CONTINUE
2139        RETURN
2140        END
2141
2142
2143
2144C       **********************************
2145
2146        SUBROUTINE ERROR(X,ERR)
2147C
2148C       =========================================
2149C       Purpose: Compute error function erf(x)
2150C       Input:   x   --- Argument of erf(x)
2151C       Output:  ERR --- erf(x)
2152C       =========================================
2153C
2154        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2155        EPS=1.0D-15
2156        PI=3.141592653589793D0
2157        X2=X*X
2158        IF (DABS(X).LT.3.5D0) THEN
2159           ER=1.0D0
2160           R=1.0D0
2161           DO 10 K=1,50
2162              R=R*X2/(K+0.5D0)
2163              ER=ER+R
2164              IF (DABS(R).LE.DABS(ER)*EPS) GO TO 15
216510         CONTINUE
216615         C0=2.0D0/DSQRT(PI)*X*DEXP(-X2)
2167           ERR=C0*ER
2168        ELSE
2169           ER=1.0D0
2170           R=1.0D0
2171           DO 20 K=1,12
2172              R=-R*(K-0.5D0)/X2
217320            ER=ER+R
2174           C0=DEXP(-X2)/(DABS(X)*DSQRT(PI))
2175           ERR=1.0D0-C0*ER
2176           IF (X.LT.0.0) ERR=-ERR
2177        ENDIF
2178        RETURN
2179        END
2180
2181C       **********************************
2182
2183        SUBROUTINE CERROR(Z,CER)
2184C
2185C       ====================================================
2186C       Purpose: Compute error function erf(z) for a complex
2187C                argument (z=x+iy)
2188C       Input :  z   --- Complex argument
2189C       Output:  CER --- erf(z)
2190C       ====================================================
2191C
2192        IMPLICIT COMPLEX *16 (C,Z)
2193        DOUBLE PRECISION A0,PI
2194        A0=CDABS(Z)
2195        C0=CDEXP(-Z*Z)
2196        PI=3.141592653589793D0
2197        Z1=Z
2198        IF (DBLE(Z).LT.0.0) THEN
2199           Z1=-Z
2200        ENDIF
2201C
2202C       Cutoff radius R = 4.36; determined by balancing rounding error
2203C       and asymptotic expansion error, see below.
2204C
2205C       The resulting maximum global accuracy expected is around 1e-8
2206C
2207        IF (A0.LE.4.36D0) THEN
2208C
2209C          Rounding error in the Taylor expansion is roughly
2210C
2211C          ~ R*R * EPSILON * R**(2 R**2) / (2 R**2 Gamma(R**2 + 1/2))
2212C
2213           CS=Z1
2214           CR=Z1
2215           DO 10 K=1,120
2216              CR=CR*Z1*Z1/(K+0.5D0)
2217              CS=CS+CR
2218              IF (CDABS(CR/CS).LT.1.0D-15) GO TO 15
221910         CONTINUE
222015         CER=2.0D0*C0*CS/DSQRT(PI)
2221        ELSE
2222           CL=1.0D0/Z1
2223           CR=CL
2224C
2225C          Asymptotic series; maximum K must be at most ~ R^2.
2226C
2227C          The maximum accuracy obtainable from this expansion is roughly
2228C
2229C          ~ Gamma(2R**2 + 2) / (
2230C                   (2 R**2)**(R**2 + 1/2) Gamma(R**2 + 3/2) 2**(R**2 + 1/2))
2231C
2232           DO 20 K=1,20
2233              CR=-CR*(K-0.5D0)/(Z1*Z1)
2234              CL=CL+CR
2235              IF (CDABS(CR/CL).LT.1.0D-15) GO TO 25
223620         CONTINUE
223725         CER=1.0D0-C0*CL/DSQRT(PI)
2238        ENDIF
2239        IF (DBLE(Z).LT.0.0) THEN
2240           CER=-CER
2241        ENDIF
2242        RETURN
2243        END
2244
2245
2246
2247C       **********************************
2248
2249        SUBROUTINE EULERB(N,EN)
2250C
2251C       ======================================
2252C       Purpose: Compute Euler number En
2253C       Input :  n --- Serial number
2254C       Output:  EN(n) --- En
2255C       ======================================
2256C
2257        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2258        DIMENSION EN(0:N)
2259        HPI=2.0D0/3.141592653589793D0
2260        EN(0)=1.0D0
2261        EN(2)=-1.0D0
2262        R1=-4.0D0*HPI**3
2263        DO 20 M=4,N,2
2264           R1=-R1*(M-1)*M*HPI*HPI
2265           R2=1.0D0
2266           ISGN=1.0D0
2267           DO 10 K=3,1000,2
2268              ISGN=-ISGN
2269              S=(1.0D0/K)**(M+1)
2270              R2=R2+ISGN*S
2271              IF (S.LT.1.0D-15) GOTO 20
227210         CONTINUE
227320         EN(M)=R1*R2
2274        RETURN
2275        END
2276
2277C       **********************************
2278
2279        SUBROUTINE CVA1(KD,M,Q,CV)
2280C
2281C       ============================================================
2282C       Purpose: Compute a sequence of characteristic values of
2283C                Mathieu functions
2284C       Input :  M  --- Maximum order of Mathieu functions
2285C                q  --- Parameter of Mathieu functions
2286C                KD --- Case code
2287C                       KD=1 for cem(x,q)  ( m = 0,2,4,… )
2288C                       KD=2 for cem(x,q)  ( m = 1,3,5,… )
2289C                       KD=3 for sem(x,q)  ( m = 1,3,5,… )
2290C                       KD=4 for sem(x,q)  ( m = 2,4,6,… )
2291C       Output:  CV(I) --- Characteristic values; I = 1,2,3,...
2292C                For KD=1, CV(1), CV(2), CV(3),..., correspond to
2293C                the characteristic values of cem for m = 0,2,4,...
2294C                For KD=2, CV(1), CV(2), CV(3),..., correspond to
2295C                the characteristic values of cem for m = 1,3,5,...
2296C                For KD=3, CV(1), CV(2), CV(3),..., correspond to
2297C                the characteristic values of sem for m = 1,3,5,...
2298C                For KD=4, CV(1), CV(2), CV(3),..., correspond to
2299C                the characteristic values of sem for m = 0,2,4,...
2300C       ============================================================
2301C
2302        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2303        DIMENSION G(200),H(200),D(500),E(500),F(500),CV(200)
2304        EPS=1.0D-14
2305        ICM=INT(M/2)+1
2306        IF (KD.EQ.4) ICM=M/2
2307        IF (Q.EQ.0.0D0) THEN
2308           IF (KD.EQ.1) THEN
2309              DO 10 IC=1,ICM
231010               CV(IC)=4.0D0*(IC-1.0D0)**2
2311           ELSE IF (KD.NE.4) THEN
2312              DO 15 IC=1,ICM
231315               CV(IC)=(2.0D0*IC-1.0D0)**2
2314           ELSE
2315              DO 20 IC=1,ICM
231620               CV(IC)=4.0D0*IC*IC
2317           ENDIF
2318        ELSE
2319           NM=INT(10+1.5*M+0.5*Q)
2320           E(1)=0.0D0
2321           F(1)=0.0D0
2322           IF (KD.EQ.1) THEN
2323              D(1)=0.0D0
2324              DO 25 I=2,NM
2325                 D(I)=4.0D0*(I-1.0D0)**2
2326                 E(I)=Q
232725               F(I)=Q*Q
2328              E(2)=DSQRT(2.0D0)*Q
2329              F(2)=2.0D0*Q*Q
2330           ELSE IF (KD.NE.4) THEN
2331              D(1)=1.0D0+(-1)**KD*Q
2332              DO 30 I=2,NM
2333                 D(I)=(2.0D0*I-1.0D0)**2
2334                 E(I)=Q
233530               F(I)=Q*Q
2336           ELSE
2337              D(1)=4.0D0
2338              DO 35 I=2,NM
2339                 D(I)=4.0D0*I*I
2340                 E(I)=Q
234135               F(I)=Q*Q
2342           ENDIF
2343           XA=D(NM)+DABS(E(NM))
2344           XB=D(NM)-DABS(E(NM))
2345           NM1=NM-1
2346           DO 40 I=1,NM1
2347              T=DABS(E(I))+DABS(E(I+1))
2348              T1=D(I)+T
2349              IF (XA.LT.T1) XA=T1
2350              T1=D(I)-T
2351              IF (T1.LT.XB) XB=T1
235240         CONTINUE
2353           DO 45 I=1,ICM
2354              G(I)=XA
235545            H(I)=XB
2356           DO 75 K=1,ICM
2357              DO 50 K1=K,ICM
2358                 IF (G(K1).LT.G(K)) THEN
2359                    G(K)=G(K1)
2360                    GO TO 55
2361                 ENDIF
236250            CONTINUE
236355            IF (K.NE.1.AND.H(K).LT.H(K-1)) H(K)=H(K-1)
236460            X1=(G(K)+H(K))/2.0D0
2365              CV(K)=X1
2366              IF (DABS((G(K)-H(K))/X1).LT.EPS) GO TO 70
2367              J=0
2368              S=1.0D0
2369              DO 65 I=1,NM
2370                 IF (S.EQ.0.0D0) S=S+1.0D-30
2371                 T=F(I)/S
2372                 S=D(I)-T-X1
2373                 IF (S.LT.0.0) J=J+1
237465            CONTINUE
2375              IF (J.LT.K) THEN
2376                 H(K)=X1
2377              ELSE
2378                 G(K)=X1
2379                 IF (J.GE.ICM) THEN
2380                    G(ICM)=X1
2381                 ELSE
2382                    IF (H(J+1).LT.X1) H(J+1)=X1
2383                    IF (X1.LT.G(J)) G(J)=X1
2384                 ENDIF
2385              ENDIF
2386              GO TO 60
238770            CV(K)=X1
238875         CONTINUE
2389        ENDIF
2390        RETURN
2391        END
2392
2393C       **********************************
2394
2395        SUBROUTINE ITTIKB(X,TTI,TTK)
2396C
2397C       =========================================================
2398C       Purpose: Integrate [I0(t)-1]/t with respect to t from 0
2399C                to x, and K0(t)/t with respect to t from x to ∞
2400C       Input :  x   --- Variable in the limits  ( x ≥ 0 )
2401C       Output:  TTI --- Integration of [I0(t)-1]/t from 0 to x
2402C                TTK --- Integration of K0(t)/t from x to ∞
2403C       =========================================================
2404C
2405        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2406        PI=3.141592653589793D0
2407        EL=.5772156649015329D0
2408        IF (X.EQ.0.0D0) THEN
2409           TTI=0.0D0
2410        ELSE IF (X.LE.5.0D0) THEN
2411           X1=X/5.0D0
2412           T=X1*X1
2413           TTI=(((((((.1263D-3*T+.96442D-3)*T+.968217D-2)*T
2414     &         +.06615507D0)*T+.33116853D0)*T+1.13027241D0)
2415     &         *T+2.44140746D0)*T+3.12499991D0)*T
2416        ELSE
2417           T=5.0D0/X
2418           TTI=(((((((((2.1945464D0*T-3.5195009D0)*T
2419     &         -11.9094395D0)*T+40.394734D0)*T-48.0524115D0)
2420     &         *T+28.1221478D0)*T-8.6556013D0)*T+1.4780044D0)
2421     &         *T-.0493843D0)*T+.1332055D0)*T+.3989314D0
2422           TTI=TTI*DEXP(X)/(DSQRT(X)*X)
2423        ENDIF
2424        IF (X.EQ.0.0D0) THEN
2425           TTK=1.0D+300
2426        ELSE IF (X.LE.2.0D0) THEN
2427           T1=X/2.0D0
2428           T=T1*T1
2429           TTK=(((((.77D-6*T+.1544D-4)*T+.48077D-3)*T
2430     &         +.925821D-2)*T+.10937537D0)*T+.74999993D0)*T
2431           E0=EL+DLOG(X/2.0D0)
2432           TTK=PI*PI/24.0D0+E0*(.5D0*E0+TTI)-TTK
2433        ELSE IF (X.LE.4.0D0) THEN
2434           T=2.0D0/X
2435           TTK=(((.06084D0*T-.280367D0)*T+.590944D0)*T
2436     &         -.850013D0)*T+1.234684D0
2437           TTK=TTK*DEXP(-X)/(DSQRT(X)*X)
2438        ELSE
2439           T=4.0D0/X
2440           TTK=(((((.02724D0*T-.1110396D0)*T+.2060126D0)*T
2441     &         -.2621446D0)*T+.3219184D0)*T-.5091339D0)*T
2442     &         +1.2533141D0
2443           TTK=TTK*DEXP(-X)/(DSQRT(X)*X)
2444        ENDIF
2445        RETURN
2446        END
2447
2448C       **********************************
2449
2450        SUBROUTINE LQNB(N,X,QN,QD)
2451C
2452C       ====================================================
2453C       Purpose: Compute Legendre functions Qn(x) & Qn'(x)
2454C       Input :  x  --- Argument of Qn(x)
2455C                n  --- Degree of Qn(x)  ( n = 0,1,2,…)
2456C       Output:  QN(n) --- Qn(x)
2457C                QD(n) --- Qn'(x)
2458C       ====================================================
2459C
2460        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2461        DIMENSION QN(0:N),QD(0:N)
2462        EPS=1.0D-14
2463        IF (DABS(X).EQ.1.0D0) THEN
2464           DO 10 K=0,N
2465              QN(K)=1.0D+300
246610            QD(K)=1.0D+300
2467           RETURN
2468        ENDIF
2469        IF (X.LE.1.021D0) THEN
2470           X2=DABS((1.0D0+X)/(1.0D0-X))
2471           Q0=0.5D0*DLOG(X2)
2472           Q1=X*Q0-1.0D0
2473           QN(0)=Q0
2474           QN(1)=Q1
2475           QD(0)=1.0D0/(1.0D0-X*X)
2476           QD(1)=QN(0)+X*QD(0)
2477           DO 15 K=2,N
2478              QF=((2.0D0*K-1.0D0)*X*Q1-(K-1.0D0)*Q0)/K
2479              QN(K)=QF
2480              QD(K)=(QN(K-1)-X*QF)*K/(1.0D0-X*X)
2481              Q0=Q1
248215            Q1=QF
2483        ELSE
2484           QC1=0.0D0
2485           QC2=1.0D0/X
2486           DO 20 J=1,N
2487              QC2=QC2*J/((2.0*J+1.0D0)*X)
2488              IF (J.EQ.N-1) QC1=QC2
248920         CONTINUE
2490           DO 35 L=0,1
2491              NL=N+L
2492              QF=1.0D0
2493              QR=1.0D0
2494              DO 25 K=1,500
2495                 QR=QR*(0.5D0*NL+K-1.0D0)*(0.5D0*(NL-1)+K)
2496     &              /((NL+K-0.5D0)*K*X*X)
2497                 QF=QF+QR
2498                 IF (DABS(QR/QF).LT.EPS) GO TO 30
249925            CONTINUE
250030            IF (L.EQ.0) THEN
2501                 QN(N-1)=QF*QC1
2502              ELSE
2503                 QN(N)=QF*QC2
2504              ENDIF
250535         CONTINUE
2506           QF2=QN(N)
2507           QF1=QN(N-1)
2508           DO 40 K=N,2,-1
2509              QF0=((2*K-1.0D0)*X*QF1-K*QF2)/(K-1.0D0)
2510              QN(K-2)=QF0
2511              QF2=QF1
251240            QF1=QF0
2513           QD(0)=1.0D0/(1.0D0-X*X)
2514           DO 45 K=1,N
251545            QD(K)=K*(QN(K-1)-X*QN(K))/(1.0D0-X*X)
2516        ENDIF
2517        RETURN
2518        END
2519
2520C       **********************************
2521
2522        SUBROUTINE CJK(KM,A)
2523C
2524C       ========================================================
2525C       Purpose: Compute the expansion coefficients for the
2526C                asymptotic expansion of Bessel functions
2527C                with large orders
2528C       Input :  Km   --- Maximum k
2529C       Output:  A(L) --- Cj(k) where j and k are related to L
2530C                         by L=j+1+[k*(k+1)]/2; j,k=0,1,...,Km
2531C       ========================================================
2532C
2533        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2534        DIMENSION A(*)
2535        A(1)=1.0D0
2536        F0=1.0D0
2537        G0=1.0D0
2538        DO 10 K=0,KM-1
2539           L1=(K+1)*(K+2)/2+1
2540           L2=(K+1)*(K+2)/2+K+2
2541           F=(0.5D0*K+0.125D0/(K+1))*F0
2542           G=-(1.5D0*K+0.625D0/(3.0*(K+1.0D0)))*G0
2543           A(L1)=F
2544           A(L2)=G
2545           F0=F
254610         G0=G
2547        DO 15 K=1,KM-1
2548           DO 15 J=1,K
2549              L3=K*(K+1)/2+J+1
2550              L4=(K+1)*(K+2)/2+J+1
2551              A(L4)=(J+0.5D0*K+0.125D0/(2.0*J+K+1.0))*A(L3)
2552     &             -(J+0.5D0*K-1.0+0.625D0/(2.0*J+K+1.0))*A(L3-1)
255315         CONTINUE
2554        RETURN
2555        END
2556
2557
2558C       **********************************
2559
2560        SUBROUTINE ITTIKA(X,TTI,TTK)
2561C
2562C       =========================================================
2563C       Purpose: Integrate [I0(t)-1]/t with respect to t from 0
2564C                to x, and K0(t)/t with respect to t from x to ∞
2565C       Input :  x   --- Variable in the limits  ( x ≥ 0 )
2566C       Output:  TTI --- Integration of [I0(t)-1]/t from 0 to x
2567C                TTK --- Integration of K0(t)/t from x to ∞
2568C       =========================================================
2569C
2570        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2571        DIMENSION C(8)
2572        PI=3.141592653589793D0
2573        EL=.5772156649015329D0
2574        DATA C/1.625D0,4.1328125D0,
2575     &       1.45380859375D+1,6.553353881835D+1,
2576     &       3.6066157150269D+2,2.3448727161884D+3,
2577     &       1.7588273098916D+4,1.4950639538279D+5/
2578        IF (X.EQ.0.0D0) THEN
2579           TTI=0.0D0
2580           TTK=1.0D+300
2581           RETURN
2582        ENDIF
2583        IF (X.LT.40.0D0) THEN
2584           TTI=1.0D0
2585           R=1.0D0
2586           DO 10 K=2,50
2587              R=.25D0*R*(K-1.0D0)/(K*K*K)*X*X
2588              TTI=TTI+R
2589              IF (DABS(R/TTI).LT.1.0D-12) GO TO 15
259010         CONTINUE
259115         TTI=TTI*.125D0*X*X
2592        ELSE
2593           TTI=1.0D0
2594           R=1.0D0
2595           DO 20 K=1,8
2596              R=R/X
259720            TTI=TTI+C(K)*R
2598           RC=X*DSQRT(2.0D0*PI*X)
2599           TTI=TTI*DEXP(X)/RC
2600        ENDIF
2601        IF (X.LE.12.0D0) THEN
2602           E0=(.5D0*DLOG(X/2.0D0)+EL)*DLOG(X/2.0D0)
2603     &        +PI*PI/24.0D0+.5D0*EL*EL
2604           B1=1.5D0-(EL+DLOG(X/2.0D0))
2605           RS=1.0D0
2606           R=1.0D0
2607           DO 25 K=2,50
2608              R=.25D0*R*(K-1.0D0)/(K*K*K)*X*X
2609              RS=RS+1.0D0/K
2610              R2=R*(RS+1.0D0/(2.0D0*K)-(EL+DLOG(X/2.0D0)))
2611              B1=B1+R2
2612              IF (DABS(R2/B1).LT.1.0D-12) GO TO 30
261325         CONTINUE
261430         TTK=E0-.125D0*X*X*B1
2615        ELSE
2616           TTK=1.0D0
2617           R=1.0D0
2618           DO 35 K=1,8
2619              R=-R/X
262035            TTK=TTK+C(K)*R
2621           RC=X*DSQRT(2.0D0/PI*X)
2622           TTK=TTK*DEXP(-X)/RC
2623        ENDIF
2624        RETURN
2625        END
2626
2627C       **********************************
2628
2629        SUBROUTINE LAMV(V,X,VM,VL,DL)
2630C
2631C       =========================================================
2632C       Purpose: Compute lambda function with arbitrary order v,
2633C                and their derivative
2634C       Input :  x --- Argument of lambda function
2635C                v --- Order of lambda function
2636C       Output:  VL(n) --- Lambda function of order n+v0
2637C                DL(n) --- Derivative of lambda function
2638C                VM --- Highest order computed
2639C       Routines called:
2640C            (1) MSTA1 and MSTA2 for computing the starting
2641C                point for backward recurrence
2642C            (2) GAM0 for computing gamma function (|x| ≤ 1)
2643C       =========================================================
2644C
2645        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2646        DIMENSION VL(0:*),DL(0:*)
2647        PI=3.141592653589793D0
2648        RP2=0.63661977236758D0
2649        X=DABS(X)
2650        X2=X*X
2651        N=INT(V)
2652        V0=V-N
2653        VM=V
2654        IF (X.LE.12.0D0) THEN
2655           DO 25 K=0,N
2656              VK=V0+K
2657              BK=1.0D0
2658              R=1.0D0
2659              DO 10 I=1,50
2660                 R=-0.25D0*R*X2/(I*(I+VK))
2661                 BK=BK+R
2662                 IF (DABS(R).LT.DABS(BK)*1.0D-15) GO TO 15
266310            CONTINUE
266415            VL(K)=BK
2665              UK=1.0D0
2666              R=1.0D0
2667              DO 20 I=1,50
2668                 R=-0.25D0*R*X2/(I*(I+VK+1.0D0))
2669                 UK=UK+R
2670                 IF (DABS(R).LT.DABS(UK)*1.0D-15) GO TO 25
267120            CONTINUE
267225            DL(K)=-0.5D0*X/(VK+1.0D0)*UK
2673           RETURN
2674        ENDIF
2675        K0=11
2676        IF (X.GE.35.0D0) K0=10
2677        IF (X.GE.50.0D0) K0=8
2678        BJV0=0.0D0
2679        BJV1=0.0D0
2680        DO 40 J=0,1
2681           VV=4.0D0*(J+V0)*(J+V0)
2682           PX=1.0D0
2683           RP=1.0D0
2684           DO 30 K=1,K0
2685              RP=-0.78125D-2*RP*(VV-(4.0*K-3.0)**2.0)*(VV-
2686     &            (4.0*K-1.0)**2.0)/(K*(2.0*K-1.0)*X2)
268730            PX=PX+RP
2688           QX=1.0D0
2689           RQ=1.0D0
2690           DO 35 K=1,K0
2691              RQ=-0.78125D-2*RQ*(VV-(4.0*K-1.0)**2.0)*(VV-
2692     &            (4.0*K+1.0)**2.0)/(K*(2.0*K+1.0)*X2)
269335            QX=QX+RQ
2694           QX=0.125D0*(VV-1.0D0)*QX/X
2695           XK=X-(0.5D0*(J+V0)+0.25D0)*PI
2696           A0=DSQRT(RP2/X)
2697           CK=DCOS(XK)
2698           SK=DSIN(XK)
2699           IF (J.EQ.0) BJV0=A0*(PX*CK-QX*SK)
2700           IF (J.EQ.1) BJV1=A0*(PX*CK-QX*SK)
270140      CONTINUE
2702        IF (V0.EQ.0.0D0) THEN
2703           GA=1.0D0
2704        ELSE
2705           CALL GAM0(V0,GA)
2706           GA=V0*GA
2707        ENDIF
2708        FAC=(2.0D0/X)**V0*GA
2709        VL(0)=BJV0
2710        DL(0)=-BJV1+V0/X*BJV0
2711        VL(1)=BJV1
2712        DL(1)=BJV0-(1.0D0+V0)/X*BJV1
2713        R0=2.0D0*(1.0D0+V0)/X
2714        IF (N.LE.1) THEN
2715           VL(0)=FAC*VL(0)
2716           DL(0)=FAC*DL(0)-V0/X*VL(0)
2717           VL(1)=FAC*R0*VL(1)
2718           DL(1)=FAC*R0*DL(1)-(1.0D0+V0)/X*VL(1)
2719           RETURN
2720        ENDIF
2721        IF (N.GE.2.AND.N.LE.INT(0.9*X)) THEN
2722           F0=BJV0
2723           F1=BJV1
2724           DO 45 K=2,N
2725              F=2.0D0*(K+V0-1.0D0)/X*F1-F0
2726              F0=F1
2727              F1=F
272845            VL(K)=F
2729        ELSE IF (N.GE.2) THEN
2730           M=MSTA1(X,200)
2731           IF (M.LT.N) THEN
2732              N=M
2733           ELSE
2734              M=MSTA2(X,N,15)
2735           ENDIF
2736           F=0.0D0
2737           F2=0.0D0
2738           F1=1.0D-100
2739           DO 50 K=M,0,-1
2740              F=2.0D0*(V0+K+1.0D0)/X*F1-F2
2741              IF (K.LE.N) VL(K)=F
2742              F2=F1
274350            F1=F
2744           CS=0.0D0
2745           IF (DABS(BJV0).GT.DABS(BJV1)) CS=BJV0/F
2746           ELSE CS=BJV1/F2
2747           DO 55 K=0,N
274855            VL(K)=CS*VL(K)
2749        ENDIF
2750        VL(0)=FAC*VL(0)
2751        DO 65 J=1,N
2752           RC=FAC*R0
2753           VL(J)=RC*VL(J)
2754           DL(J-1)=-0.5D0*X/(J+V0)*VL(J)
275565         R0=2.0D0*(J+V0+1)/X*R0
2756        DL(N)=2.0D0*(V0+N)*(VL(N-1)-VL(N))/X
2757        VM=N+V0
2758        RETURN
2759        END
2760
2761
2762
2763C       **********************************
2764
2765        SUBROUTINE CHGUIT(A,B,X,HU,ID)
2766C
2767C       ======================================================
2768C       Purpose: Compute hypergeometric function U(a,b,x) by
2769C                using Gaussian-Legendre integration (n=60)
2770C       Input  : a  --- Parameter ( a > 0 )
2771C                b  --- Parameter
2772C                x  --- Argument ( x > 0 )
2773C       Output:  HU --- U(a,b,z)
2774C                ID --- Estimated number of significant digits
2775C       Routine called: GAMMA2 for computing Г(x)
2776C       ======================================================
2777C
2778        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2779        DIMENSION T(30),W(30)
2780        DATA T/ .259597723012478D-01, .778093339495366D-01,
2781     &          .129449135396945D+00, .180739964873425D+00,
2782     &          .231543551376029D+00, .281722937423262D+00,
2783     &          .331142848268448D+00, .379670056576798D+00,
2784     &          .427173741583078D+00, .473525841761707D+00,
2785     &          .518601400058570D+00, .562278900753945D+00,
2786     &          .604440597048510D+00, .644972828489477D+00,
2787     &          .683766327381356D+00, .720716513355730D+00,
2788     &          .755723775306586D+00, .788693739932264D+00,
2789     &          .819537526162146D+00, .848171984785930D+00,
2790     &          .874519922646898D+00, .898510310810046D+00,
2791     &          .920078476177628D+00, .939166276116423D+00,
2792     &          .955722255839996D+00, .969701788765053D+00,
2793     &          .981067201752598D+00, .989787895222222D+00,
2794     &          .995840525118838D+00, .999210123227436D+00/
2795        DATA W/ .519078776312206D-01, .517679431749102D-01,
2796     &          .514884515009810D-01, .510701560698557D-01,
2797     &          .505141845325094D-01, .498220356905502D-01,
2798     &          .489955754557568D-01, .480370318199712D-01,
2799     &          .469489888489122D-01, .457343797161145D-01,
2800     &          .443964787957872D-01, .429388928359356D-01,
2801     &          .413655512355848D-01, .396806954523808D-01,
2802     &          .378888675692434D-01, .359948980510845D-01,
2803     &          .340038927249464D-01, .319212190192963D-01,
2804     &          .297524915007890D-01, .275035567499248D-01,
2805     &          .251804776215213D-01, .227895169439978D-01,
2806     &          .203371207294572D-01, .178299010142074D-01,
2807     &          .152746185967848D-01, .126781664768159D-01,
2808     &          .100475571822880D-01, .738993116334531D-02,
2809     &          .471272992695363D-02, .202681196887362D-02/
2810        ID=9
2811C       DLMF 13.4.4, integration up to C=12/X
2812        A1=A-1.0D0
2813        B1=B-A-1.0D0
2814        C=12.0D0/X
2815        HU0=0.0D0
2816        DO 20 M=10,100,5
2817           HU1=0.0D0
2818           G=0.5D0*C/M
2819           D=G
2820           DO 15 J=1,M
2821              S=0.0D0
2822              DO 10 K=1,30
2823                 T1=D+G*T(K)
2824                 T2=D-G*T(K)
2825                 F1=DEXP(-X*T1)*T1**A1*(1.0D0+T1)**B1
2826                 F2=DEXP(-X*T2)*T2**A1*(1.0D0+T2)**B1
2827                 S=S+W(K)*(F1+F2)
282810            CONTINUE
2829              HU1=HU1+S*G
2830              D=D+2.0D0*G
283115         CONTINUE
2832           IF (DABS(1.0D0-HU0/HU1).LT.1.0D-9) GO TO 25
2833           HU0=HU1
283420      CONTINUE
283525      CALL GAMMA2(A,GA)
2836        HU1=HU1/GA
2837C       DLMF 13.4.4 with substitution t=C/(1-u)
2838C       integration u from 0 to 1, i.e. t from C=12/X to infinity
2839        DO 40 M=2,10,2
2840           HU2=0.0D0
2841           G=0.5D0/M
2842           D=G
2843           DO 35 J=1,M
2844              S=0.0D0
2845              DO 30 K=1,30
2846                 T1=D+G*T(K)
2847                 T2=D-G*T(K)
2848                 T3=C/(1.0D0-T1)
2849                 T4=C/(1.0D0-T2)
2850                 F1=T3*T3/C*DEXP(-X*T3)*T3**A1*(1.0D0+T3)**B1
2851                 F2=T4*T4/C*DEXP(-X*T4)*T4**A1*(1.0D0+T4)**B1
2852                 S=S+W(K)*(F1+F2)
285330            CONTINUE
2854              HU2=HU2+S*G
2855              D=D+2.0D0*G
285635         CONTINUE
2857           IF (DABS(1.0D0-HU0/HU2).LT.1.0D-9) GO TO 45
2858           HU0=HU2
285940      CONTINUE
286045      CALL GAMMA2(A,GA)
2861        HU2=HU2/GA
2862        HU=HU1+HU2
2863        RETURN
2864        END
2865
2866
2867
2868C       **********************************
2869
2870        SUBROUTINE KMN(M,N,C,CV,KD,DF,DN,CK1,CK2)
2871C
2872C       ===================================================
2873C       Purpose: Compute the expansion coefficients of the
2874C                prolate and oblate spheroidal functions
2875C                and joining factors
2876C       ===================================================
2877C
2878        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2879        DIMENSION U(200),V(200),W(200),DF(200),DN(200),
2880     &            TP(200),RK(200)
2881        NM=25+INT(0.5*(N-M)+C)
2882        NN=NM+M
2883        CS=C*C*KD
2884        IP=1
2885        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
2886        K=0
2887        DO 10 I=1,NN+3
2888           IF (IP.EQ.0) K=-2*(I-1)
2889           IF (IP.EQ.1) K=-(2*I-3)
2890           GK0=2.0D0*M+K
2891           GK1=(M+K)*(M+K+1.0D0)
2892           GK2=2.0D0*(M+K)-1.0D0
2893           GK3=2.0D0*(M+K)+3.0D0
2894           U(I)=GK0*(GK0-1.0D0)*CS/(GK2*(GK2+2.0D0))
2895           V(I)=GK1-CV+(2.0D0*(GK1-M*M)-1.0D0)*CS/(GK2*GK3)
289610         W(I)=(K+1.0D0)*(K+2.0D0)*CS/((GK2+2.0D0)*GK3)
2897        DO 20 K=1,M
2898           T=V(M+1)
2899           DO 15 L=0,M-K-1
290015            T=V(M-L)-W(M-L+1)*U(M-L)/T
290120         RK(K)=-U(K)/T
2902        R=1.0D0
2903        DO 25 K=1,M
2904           R=R*RK(K)
290525         DN(K)=DF(1)*R
2906        TP(NN)=V(NN+1)
2907        DO 30 K=NN-1,M+1,-1
2908           TP(K)=V(K+1)-W(K+2)*U(K+1)/TP(K+1)
2909           IF (K.GT.M+1) RK(K)=-U(K)/TP(K)
291030      CONTINUE
2911        IF (M.EQ.0) DNP=DF(1)
2912        IF (M.NE.0) DNP=DN(M)
2913        DN(M+1)=(-1)**IP*DNP*CS/((2.0*M-1.0)*(2.0*M+1.0-4.0*IP)
2914     &          *TP(M+1))
2915        DO 35 K=M+2,NN
291635         DN(K)=RK(K)*DN(K-1)
2917        R1=1.0D0
2918        DO 40 J=1,(N+M+IP)/2
291940         R1=R1*(J+0.5D0*(N+M+IP))
2920        NM1=(N-M)/2
2921        R=1.0D0
2922        DO 45 J=1,2*M+IP
292345         R=R*J
2924        SU0=R*DF(1)
2925        SW=0.0D0
2926        DO 50 K=2,NM
2927           R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
2928           SU0=SU0+R*DF(K)
2929           IF (K.GT.NM1.AND.DABS((SU0-SW)/SU0).LT.1.0D-14) GO TO 55
293050         SW=SU0
293155      IF (KD.EQ.1) GOTO 70
2932        R2=1.0D0
2933        DO 60 J=1,M
293460         R2=2.0D0*C*R2*J
2935        R3=1.0D0
2936        DO 65 J=1,(N-M-IP)/2
293765         R3=R3*J
2938        SA0=(2.0*(M+IP)+1.0)*R1/(2.0**N*C**IP*R2*R3*DF(1))
2939        CK1=SA0*SU0
2940        IF (KD.EQ.-1) RETURN
294170      R4=1.0D0
2942        DO 75 J=1,(N-M-IP)/2
294375         R4=4.0D0*R4*J
2944        R5=1.0D0
2945        DO 80 J=1,M
294680         R5=R5*(J+M)/C
2947        G0=DN(M)
2948        IF (M.EQ.0) G0=DF(1)
2949        SB0=(IP+1.0)*C**(IP+1)/(2.0*IP*(M-2.0)+1.0)/(2.0*M-1.0)
2950        CK2=(-1)**IP*SB0*R4*R5*G0/R1*SU0
2951        RETURN
2952        END
2953
2954
2955
2956C       **********************************
2957
2958        SUBROUTINE LAGZO(N,X,W)
2959C
2960C       =========================================================
2961C       Purpose : Compute the zeros of Laguerre polynomial Ln(x)
2962C                 in the interval [0,∞], and the corresponding
2963C                 weighting coefficients for Gauss-Laguerre
2964C                 integration
2965C       Input :   n    --- Order of the Laguerre polynomial
2966C                 X(n) --- Zeros of the Laguerre polynomial
2967C                 W(n) --- Corresponding weighting coefficients
2968C       =========================================================
2969C
2970        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
2971        DIMENSION X(N),W(N)
2972        HN=1.0D0/N
2973        PF=0.0D0
2974        PD=0.0D0
2975        DO 35 NR=1,N
2976           Z=HN
2977           IF (NR.GT.1) Z=X(NR-1)+HN*NR**1.27
2978           IT=0
297910         IT=IT+1
2980           Z0=Z
2981           P=1.0D0
2982           DO 15 I=1,NR-1
298315            P=P*(Z-X(I))
2984           F0=1.0D0
2985           F1=1.0D0-Z
2986           DO 20 K=2,N
2987              PF=((2.0D0*K-1.0D0-Z)*F1-(K-1.0D0)*F0)/K
2988              PD=K/Z*(PF-F1)
2989              F0=F1
299020            F1=PF
2991           FD=PF/P
2992           Q=0.0D0
2993           DO 30 I=1,NR-1
2994              WP=1.0D0
2995              DO 25 J=1,NR-1
2996                 IF (J.EQ.I) GO TO 25
2997                 WP=WP*(Z-X(J))
299825            CONTINUE
2999              Q=Q+WP
300030         CONTINUE
3001           GD=(PD-Q*FD)/P
3002           Z=Z-FD/GD
3003           IF (IT.LE.40.AND.DABS((Z-Z0)/Z).GT.1.0D-15) GO TO 10
3004           X(NR)=Z
3005           W(NR)=1.0D0/(Z*PD*PD)
300635      CONTINUE
3007        RETURN
3008        END
3009
3010C       **********************************
3011
3012        SUBROUTINE VVLA(VA,X,PV)
3013C
3014C       ===================================================
3015C       Purpose: Compute parabolic cylinder function Vv(x)
3016C                for large argument
3017C       Input:   x  --- Argument
3018C                va --- Order
3019C       Output:  PV --- Vv(x)
3020C       Routines called:
3021C             (1) DVLA for computing Dv(x) for large |x|
3022C             (2) GAMMA2 for computing Г(x)
3023C       ===================================================
3024C
3025        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3026        PI=3.141592653589793D0
3027        EPS=1.0D-12
3028        QE=DEXP(0.25*X*X)
3029        A0=DABS(X)**(-VA-1.0D0)*DSQRT(2.0D0/PI)*QE
3030        R=1.0D0
3031        PV=1.0D0
3032        DO 10 K=1,18
3033           R=0.5D0*R*(2.0*K+VA-1.0)*(2.0*K+VA)/(K*X*X)
3034           PV=PV+R
3035           IF (DABS(R/PV).LT.EPS) GO TO 15
303610      CONTINUE
303715      PV=A0*PV
3038        IF (X.LT.0.0D0) THEN
3039           X1=-X
3040           CALL DVLA(VA,X1,PDL)
3041           CALL GAMMA2(-VA,GL)
3042           DSL=DSIN(PI*VA)*DSIN(PI*VA)
3043           PV=DSL*GL/PI*PDL-DCOS(PI*VA)*PV
3044        ENDIF
3045        RETURN
3046        END
3047
3048
3049
3050C       **********************************
3051
3052        SUBROUTINE CJYVA(V,Z,VM,CBJ,CDJ,CBY,CDY)
3053C
3054C       ===========================================================
3055C       Purpose: Compute Bessel functions Jv(z), Yv(z) and their
3056C                derivatives for a complex argument
3057C       Input :  z --- Complex argument
3058C                v --- Order of Jv(z) and Yv(z)
3059C                      ( v = n+v0, n = 0,1,2,..., 0 ≤ v0 < 1 )
3060C       Output:  CBJ(n) --- Jn+v0(z)
3061C                CDJ(n) --- Jn+v0'(z)
3062C                CBY(n) --- Yn+v0(z)
3063C                CDY(n) --- Yn+v0'(z)
3064C                VM --- Highest order computed
3065C       Routines called:
3066C            (1) GAMMA2 for computing the gamma function
3067C            (2) MSTA1 and MSTA2 for computing the starting
3068C                point for backward recurrence
3069C       ===========================================================
3070C
3071        IMPLICIT DOUBLE PRECISION (A,B,G,O-Y)
3072        IMPLICIT COMPLEX*16 (C,Z)
3073        DIMENSION CBJ(0:*),CDJ(0:*),CBY(0:*),CDY(0:*)
3074        PI=3.141592653589793D0
3075        RP2=.63661977236758D0
3076        CI=(0.0D0,1.0D0)
3077        A0=CDABS(Z)
3078        Z1=Z
3079        Z2=Z*Z
3080        N=INT(V)
3081        V0=V-N
3082        PV0=PI*V0
3083        PV1=PI*(1.0D0+V0)
3084        IF (A0.LT.1.0D-100) THEN
3085           DO 10 K=0,N
3086              CBJ(K)=(0.0D0,0.0D0)
3087              CDJ(K)=(0.0D0,0.0D0)
3088              CBY(K)=-(1.0D+300,0.0D0)
308910            CDY(K)=(1.0D+300,0.0D0)
3090           IF (V0.EQ.0.0) THEN
3091              CBJ(0)=(1.0D0,0.0D0)
3092              CDJ(1)=(0.5D0,0.0D0)
3093           ELSE
3094              CDJ(0)=(1.0D+300,0.0D0)
3095           ENDIF
3096           VM=V
3097           RETURN
3098        ENDIF
3099        LB0=0.0D0
3100        IF (DBLE(Z).LT.0.0) Z1=-Z
3101        IF (A0.LE.12.0) THEN
3102           DO 25 L=0,1
3103              VL=V0+L
3104              CJVL=(1.0D0,0.0D0)
3105              CR=(1.0D0,0.0D0)
3106              DO 15 K=1,40
3107                 CR=-0.25D0*CR*Z2/(K*(K+VL))
3108                 CJVL=CJVL+CR
3109                 IF (CDABS(CR).LT.CDABS(CJVL)*1.0D-15) GO TO 20
311015            CONTINUE
311120            VG=1.0D0+VL
3112              CALL GAMMA2(VG,GA)
3113              CA=(0.5D0*Z1)**VL/GA
3114              IF (L.EQ.0) CJV0=CJVL*CA
3115              IF (L.EQ.1) CJV1=CJVL*CA
311625         CONTINUE
3117        ELSE
3118           K0=11
3119           IF (A0.GE.35.0) K0=10
3120           IF (A0.GE.50.0) K0=8
3121           DO 40 J=0,1
3122              VV=4.0D0*(J+V0)*(J+V0)
3123              CPZ=(1.0D0,0.0D0)
3124              CRP=(1.0D0,0.0D0)
3125              DO 30 K=1,K0
3126                 CRP=-0.78125D-2*CRP*(VV-(4.0*K-3.0)**2.0)*(VV-
3127     &               (4.0*K-1.0)**2.0)/(K*(2.0*K-1.0)*Z2)
312830               CPZ=CPZ+CRP
3129              CQZ=(1.0D0,0.0D0)
3130              CRQ=(1.0D0,0.0D0)
3131              DO 35 K=1,K0
3132                 CRQ=-0.78125D-2*CRQ*(VV-(4.0*K-1.0)**2.0)*(VV-
3133     &               (4.0*K+1.0)**2.0)/(K*(2.0*K+1.0)*Z2)
313435               CQZ=CQZ+CRQ
3135              CQZ=0.125D0*(VV-1.0)*CQZ/Z1
3136              ZK=Z1-(0.5D0*(J+V0)+0.25D0)*PI
3137              CA0=CDSQRT(RP2/Z1)
3138              CCK=CDCOS(ZK)
3139              CSK=CDSIN(ZK)
3140              IF (J.EQ.0) THEN
3141                 CJV0=CA0*(CPZ*CCK-CQZ*CSK)
3142                 CYV0=CA0*(CPZ*CSK+CQZ*CCK)
3143              ELSE IF (J.EQ.1) THEN
3144                 CJV1=CA0*(CPZ*CCK-CQZ*CSK)
3145                 CYV1=CA0*(CPZ*CSK+CQZ*CCK)
3146              ENDIF
314740         CONTINUE
3148        ENDIF
3149        IF (A0.LE.12.0) THEN
3150           IF (V0.NE.0.0) THEN
3151              DO 55 L=0,1
3152                 VL=V0+L
3153                 CJVL=(1.0D0,0.0D0)
3154                 CR=(1.0D0,0.0D0)
3155                 DO 45 K=1,40
3156                    CR=-0.25D0*CR*Z2/(K*(K-VL))
3157                    CJVL=CJVL+CR
3158                    IF (CDABS(CR).LT.CDABS(CJVL)*1.0D-15) GO TO 50
315945               CONTINUE
316050               VG=1.0D0-VL
3161                 CALL GAMMA2(VG,GB)
3162                 CB=(2.0D0/Z1)**VL/GB
3163                 IF (L.EQ.0) CJU0=CJVL*CB
3164                 IF (L.EQ.1) CJU1=CJVL*CB
316555            CONTINUE
3166              CYV0=(CJV0*DCOS(PV0)-CJU0)/DSIN(PV0)
3167              CYV1=(CJV1*DCOS(PV1)-CJU1)/DSIN(PV1)
3168           ELSE
3169              CEC=CDLOG(Z1/2.0D0)+.5772156649015329D0
3170              CS0=(0.0D0,0.0D0)
3171              W0=0.0D0
3172              CR0=(1.0D0,0.0D0)
3173              DO 60 K=1,30
3174                 W0=W0+1.0D0/K
3175                 CR0=-0.25D0*CR0/(K*K)*Z2
317660               CS0=CS0+CR0*W0
3177              CYV0=RP2*(CEC*CJV0-CS0)
3178              CS1=(1.0D0,0.0D0)
3179              W1=0.0D0
3180              CR1=(1.0D0,0.0D0)
3181              DO 65 K=1,30
3182                 W1=W1+1.0D0/K
3183                 CR1=-0.25D0*CR1/(K*(K+1))*Z2
318465               CS1=CS1+CR1*(2.0D0*W1+1.0D0/(K+1.0D0))
3185              CYV1=RP2*(CEC*CJV1-1.0D0/Z1-0.25D0*Z1*CS1)
3186           ENDIF
3187        ENDIF
3188        IF (DBLE(Z).LT.0.0D0) THEN
3189           CFAC0=CDEXP(PV0*CI)
3190           CFAC1=CDEXP(PV1*CI)
3191           IF (DIMAG(Z).LT.0.0D0) THEN
3192              CYV0=CFAC0*CYV0-2.0D0*CI*DCOS(PV0)*CJV0
3193              CYV1=CFAC1*CYV1-2.0D0*CI*DCOS(PV1)*CJV1
3194              CJV0=CJV0/CFAC0
3195              CJV1=CJV1/CFAC1
3196           ELSE IF (DIMAG(Z).GT.0.0D0) THEN
3197              CYV0=CYV0/CFAC0+2.0D0*CI*DCOS(PV0)*CJV0
3198              CYV1=CYV1/CFAC1+2.0D0*CI*DCOS(PV1)*CJV1
3199              CJV0=CFAC0*CJV0
3200              CJV1=CFAC1*CJV1
3201           ENDIF
3202        ENDIF
3203        CBJ(0)=CJV0
3204        CBJ(1)=CJV1
3205        IF (N.GE.2.AND.N.LE.INT(0.25*A0)) THEN
3206           CF0=CJV0
3207           CF1=CJV1
3208           DO 70 K=2,N
3209              CF=2.0D0*(K+V0-1.0D0)/Z*CF1-CF0
3210              CBJ(K)=CF
3211              CF0=CF1
321270            CF1=CF
3213        ELSE IF (N.GE.2) THEN
3214           M=MSTA1(A0,200)
3215           IF (M.LT.N) THEN
3216              N=M
3217           ELSE
3218              M=MSTA2(A0,N,15)
3219           ENDIF
3220           CF2=(0.0D0,0.0D0)
3221           CF1=(1.0D-100,0.0D0)
3222           DO 75 K=M,0,-1
3223              CF=2.0D0*(V0+K+1.0D0)/Z*CF1-CF2
3224              IF (K.LE.N) CBJ(K)=CF
3225              CF2=CF1
322675            CF1=CF
3227           IF (CDABS(CJV0).GT.CDABS(CJV1)) CS=CJV0/CF
3228           IF (CDABS(CJV0).LE.CDABS(CJV1)) CS=CJV1/CF2
3229           DO 80 K=0,N
323080            CBJ(K)=CS*CBJ(K)
3231        ENDIF
3232        CDJ(0)=V0/Z*CBJ(0)-CBJ(1)
3233        DO 85 K=1,N
323485         CDJ(K)=-(K+V0)/Z*CBJ(K)+CBJ(K-1)
3235        CBY(0)=CYV0
3236        CBY(1)=CYV1
3237        YA0=CDABS(CYV0)
3238        LB=0
3239        CG0=CYV0
3240        CG1=CYV1
3241        DO 90 K=2,N
3242           CYK=2.0D0*(V0+K-1.0D0)/Z*CG1-CG0
3243           IF (CDABS(CYK).GT.1.0D+290) GO TO 90
3244           YAK=CDABS(CYK)
3245           YA1=CDABS(CG0)
3246           IF (YAK.LT.YA0.AND.YAK.LT.YA1) LB=K
3247           CBY(K)=CYK
3248           CG0=CG1
3249           CG1=CYK
325090      CONTINUE
3251        IF (LB.LE.4.OR.DIMAG(Z).EQ.0.0D0) GO TO 125
325295      IF (LB.EQ.LB0) GO TO 125
3253        CH2=(1.0D0,0.0D0)
3254        CH1=(0.0D0,0.0D0)
3255        LB0=LB
3256        DO 100 K=LB,1,-1
3257           CH0=2.0D0*(K+V0)/Z*CH1-CH2
3258           CH2=CH1
3259100        CH1=CH0
3260        CP12=CH0
3261        CP22=CH2
3262        CH2=(0.0D0,0.0D0)
3263        CH1=(1.0D0,0.0D0)
3264        DO 105 K=LB,1,-1
3265           CH0=2.0D0*(K+V0)/Z*CH1-CH2
3266           CH2=CH1
3267105        CH1=CH0
3268        CP11=CH0
3269        CP21=CH2
3270        IF (LB.EQ.N) CBJ(LB+1)=2.0D0*(LB+V0)/Z*CBJ(LB)-CBJ(LB-1)
3271        IF (CDABS(CBJ(0)).GT.CDABS(CBJ(1))) THEN
3272           CBY(LB+1)=(CBJ(LB+1)*CYV0-2.0D0*CP11/(PI*Z))/CBJ(0)
3273           CBY(LB)=(CBJ(LB)*CYV0+2.0D0*CP12/(PI*Z))/CBJ(0)
3274        ELSE
3275           CBY(LB+1)=(CBJ(LB+1)*CYV1-2.0D0*CP21/(PI*Z))/CBJ(1)
3276           CBY(LB)=(CBJ(LB)*CYV1+2.0D0*CP22/(PI*Z))/CBJ(1)
3277        ENDIF
3278        CYL2=CBY(LB+1)
3279        CYL1=CBY(LB)
3280        DO 110 K=LB-1,0,-1
3281           CYLK=2.0D0*(K+V0+1.0D0)/Z*CYL1-CYL2
3282           CBY(K)=CYLK
3283           CYL2=CYL1
3284110        CYL1=CYLK
3285        CYL1=CBY(LB)
3286        CYL2=CBY(LB+1)
3287        DO 115 K=LB+1,N-1
3288           CYLK=2.0D0*(K+V0)/Z*CYL2-CYL1
3289           CBY(K+1)=CYLK
3290           CYL1=CYL2
3291115        CYL2=CYLK
3292        DO 120 K=2,N
3293           WA=CDABS(CBY(K))
3294           IF (WA.LT.CDABS(CBY(K-1))) LB=K
3295120     CONTINUE
3296        GO TO 95
3297125     CDY(0)=V0/Z*CBY(0)-CBY(1)
3298        DO 130 K=1,N
3299130        CDY(K)=CBY(K-1)-(K+V0)/Z*CBY(K)
3300        VM=N+V0
3301        RETURN
3302        END
3303
3304
3305
3306C       **********************************
3307
3308        SUBROUTINE CJYVB(V,Z,VM,CBJ,CDJ,CBY,CDY)
3309C
3310C       ===========================================================
3311C       Purpose: Compute Bessel functions Jv(z), Yv(z) and their
3312C                derivatives for a complex argument
3313C       Input :  z --- Complex argument
3314C                v --- Order of Jv(z) and Yv(z)
3315C                      ( v = n+v0, n = 0,1,2,..., 0 ≤ v0 < 1 )
3316C       Output:  CBJ(n) --- Jn+v0(z)
3317C                CDJ(n) --- Jn+v0'(z)
3318C                CBY(n) --- Yn+v0(z)
3319C                CDY(n) --- Yn+v0'(z)
3320C                VM --- Highest order computed
3321C       Routines called:
3322C            (1) GAMMA2 for computing the gamma function
3323C            (2) MSTA1 and MSTA2 for computing the starting
3324C                point for backward recurrence
3325C       ===========================================================
3326C
3327        IMPLICIT DOUBLE PRECISION (A,B,G,O-Y)
3328        IMPLICIT COMPLEX*16 (C,Z)
3329        DIMENSION CBJ(0:*),CDJ(0:*),CBY(0:*),CDY(0:*)
3330        PI=3.141592653589793D0
3331        RP2=.63661977236758D0
3332        CI=(0.0D0,1.0D0)
3333        A0=CDABS(Z)
3334        Z1=Z
3335        Z2=Z*Z
3336        N=INT(V)
3337        V0=V-N
3338        PV0=PI*V0
3339        IF (A0.LT.1.0D-100) THEN
3340           DO 10 K=0,N
3341              CBJ(K)=(0.0D0,0.0D0)
3342              CDJ(K)=(0.0D0,0.0D0)
3343              CBY(K)=-(1.0D+300,0.0D0)
334410            CDY(K)=(1.0D+300,0.0D0)
3345           IF (V0.EQ.0.0) THEN
3346              CBJ(0)=(1.0D0,0.0D0)
3347              CDJ(1)=(0.5D0,0.0D0)
3348           ELSE
3349              CDJ(0)=(1.0D+300,0.0D0)
3350           ENDIF
3351           VM=V
3352           RETURN
3353        ENDIF
3354        IF (DBLE(Z).LT.0.0D0) Z1=-Z
3355        IF (A0.LE.12.0) THEN
3356           CJV0=(1.0D0,0.0D0)
3357           CR=(1.0D0,0.0D0)
3358           DO 15 K=1,40
3359              CR=-0.25D0*CR*Z2/(K*(K+V0))
3360              CJV0=CJV0+CR
3361              IF (CDABS(CR).LT.CDABS(CJV0)*1.0D-15) GO TO 20
336215         CONTINUE
336320         VG=1.0D0+V0
3364           CALL GAMMA2(VG,GA)
3365           CA=(0.5D0*Z1)**V0/GA
3366           CJV0=CJV0*CA
3367        ELSE
3368           K0=11
3369           IF (A0.GE.35.0) K0=10
3370           IF (A0.GE.50.0) K0=8
3371           VV=4.0D0*V0*V0
3372           CPZ=(1.0D0,0.0D0)
3373           CRP=(1.0D0,0.0D0)
3374           DO 25 K=1,K0
3375              CRP=-0.78125D-2*CRP*(VV-(4.0*K-3.0)**2.0)*(VV-
3376     &            (4.0*K-1.0)**2.0)/(K*(2.0*K-1.0)*Z2)
337725            CPZ=CPZ+CRP
3378           CQZ=(1.0D0,0.0D0)
3379           CRQ=(1.0D0,0.0D0)
3380           DO 30 K=1,K0
3381              CRQ=-0.78125D-2*CRQ*(VV-(4.0*K-1.0)**2.0)*(VV-
3382     &            (4.0*K+1.0)**2.0)/(K*(2.0*K+1.0)*Z2)
338330            CQZ=CQZ+CRQ
3384           CQZ=0.125D0*(VV-1.0)*CQZ/Z1
3385           ZK=Z1-(0.5D0*V0+0.25D0)*PI
3386           CA0=CDSQRT(RP2/Z1)
3387           CCK=CDCOS(ZK)
3388           CSK=CDSIN(ZK)
3389           CJV0=CA0*(CPZ*CCK-CQZ*CSK)
3390           CYV0=CA0*(CPZ*CSK+CQZ*CCK)
3391        ENDIF
3392        IF (A0.LE.12.0) THEN
3393           IF (V0.NE.0.0) THEN
3394              CJVN=(1.0D0,0.0D0)
3395              CR=(1.0D0,0.0D0)
3396              DO 35 K=1,40
3397                 CR=-0.25D0*CR*Z2/(K*(K-V0))
3398                 CJVN=CJVN+CR
3399                 IF (CDABS(CR).LT.CDABS(CJVN)*1.0D-15) GO TO 40
340035            CONTINUE
340140            VG=1.0D0-V0
3402              CALL GAMMA2(VG,GB)
3403              CB=(2.0D0/Z1)**V0/GB
3404              CJU0=CJVN*CB
3405              CYV0=(CJV0*DCOS(PV0)-CJU0)/DSIN(PV0)
3406           ELSE
3407              CEC=CDLOG(Z1/2.0D0)+.5772156649015329D0
3408              CS0=(0.0D0,0.0D0)
3409              W0=0.0D0
3410              CR0=(1.0D0,0.0D0)
3411              DO 45 K=1,30
3412                 W0=W0+1.0D0/K
3413                 CR0=-0.25D0*CR0/(K*K)*Z2
341445               CS0=CS0+CR0*W0
3415              CYV0=RP2*(CEC*CJV0-CS0)
3416           ENDIF
3417        ENDIF
3418        IF (N.EQ.0) N=1
3419        M=MSTA1(A0,200)
3420        IF (M.LT.N) THEN
3421           N=M
3422        ELSE
3423           M=MSTA2(A0,N,15)
3424        ENDIF
3425        CF2=(0.0D0,0.0D0)
3426        CF1=(1.0D-100,0.0D0)
3427        DO 50 K=M,0,-1
3428           CF=2.0D0*(V0+K+1.0D0)/Z1*CF1-CF2
3429           IF (K.LE.N) CBJ(K)=CF
3430           CF2=CF1
343150         CF1=CF
3432        CS=CJV0/CF
3433        DO 55 K=0,N
343455         CBJ(K)=CS*CBJ(K)
3435        IF (DBLE(Z).LT.0.0D0) THEN
3436           CFAC0=CDEXP(PV0*CI)
3437           IF (DIMAG(Z).LT.0.0D0) THEN
3438              CYV0=CFAC0*CYV0-2.0D0*CI*DCOS(PV0)*CJV0
3439           ELSE IF (DIMAG(Z).GT.0.0D0) THEN
3440              CYV0=CYV0/CFAC0+2.0D0*CI*DCOS(PV0)*CJV0
3441           ENDIF
3442           DO 60 K=0,N
3443              IF (DIMAG(Z).LT.0.0D0) THEN
3444                 CBJ(K)=CDEXP(-PI*(K+V0)*CI)*CBJ(K)
3445              ELSE IF (DIMAG(Z).GT.0.0D0) THEN
3446                 CBJ(K)=CDEXP(PI*(K+V0)*CI)*CBJ(K)
3447              ENDIF
344860         CONTINUE
3449           Z1=Z1
3450        ENDIF
3451        CBY(0)=CYV0
3452        DO 65 K=1,N
3453           CYY=(CBJ(K)*CBY(K-1)-2.0D0/(PI*Z))/CBJ(K-1)
3454           CBY(K)=CYY
345565      CONTINUE
3456        CDJ(0)=V0/Z*CBJ(0)-CBJ(1)
3457        DO 70 K=1,N
345870         CDJ(K)=-(K+V0)/Z*CBJ(K)+CBJ(K-1)
3459        CDY(0)=V0/Z*CBY(0)-CBY(1)
3460        DO 75 K=1,N
346175         CDY(K)=CBY(K-1)-(K+V0)/Z*CBY(K)
3462        VM=N+V0
3463        RETURN
3464        END
3465
3466
3467
3468C       **********************************
3469
3470        SUBROUTINE JY01A(X,BJ0,DJ0,BJ1,DJ1,BY0,DY0,BY1,DY1)
3471C
3472C       =======================================================
3473C       Purpose: Compute Bessel functions J0(x), J1(x), Y0(x),
3474C                Y1(x), and their derivatives
3475C       Input :  x   --- Argument of Jn(x) & Yn(x) ( x ≥ 0 )
3476C       Output:  BJ0 --- J0(x)
3477C                DJ0 --- J0'(x)
3478C                BJ1 --- J1(x)
3479C                DJ1 --- J1'(x)
3480C                BY0 --- Y0(x)
3481C                DY0 --- Y0'(x)
3482C                BY1 --- Y1(x)
3483C                DY1 --- Y1'(x)
3484C       =======================================================
3485C
3486        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3487        DIMENSION A(12),B(12),A1(12),B1(12)
3488        PI=3.141592653589793D0
3489        RP2=0.63661977236758D0
3490        X2=X*X
3491        IF (X.EQ.0.0D0) THEN
3492           BJ0=1.0D0
3493           BJ1=0.0D0
3494           DJ0=0.0D0
3495           DJ1=0.5D0
3496           BY0=-1.0D+300
3497           BY1=-1.0D+300
3498           DY0=1.0D+300
3499           DY1=1.0D+300
3500           RETURN
3501        ENDIF
3502        IF (X.LE.12.0D0) THEN
3503           BJ0=1.0D0
3504           R=1.0D0
3505           DO 5 K=1,30
3506              R=-0.25D0*R*X2/(K*K)
3507              BJ0=BJ0+R
3508              IF (DABS(R).LT.DABS(BJ0)*1.0D-15) GO TO 10
35095          CONTINUE
351010         BJ1=1.0D0
3511           R=1.0D0
3512           DO 15 K=1,30
3513              R=-0.25D0*R*X2/(K*(K+1.0D0))
3514              BJ1=BJ1+R
3515              IF (DABS(R).LT.DABS(BJ1)*1.0D-15) GO TO 20
351615         CONTINUE
351720         BJ1=0.5D0*X*BJ1
3518           EC=DLOG(X/2.0D0)+0.5772156649015329D0
3519           CS0=0.0D0
3520           W0=0.0D0
3521           R0=1.0D0
3522           DO 25 K=1,30
3523              W0=W0+1.0D0/K
3524              R0=-0.25D0*R0/(K*K)*X2
3525              R=R0*W0
3526              CS0=CS0+R
3527              IF (DABS(R).LT.DABS(CS0)*1.0D-15) GO TO 30
352825         CONTINUE
352930         BY0=RP2*(EC*BJ0-CS0)
3530           CS1=1.0D0
3531           W1=0.0D0
3532           R1=1.0D0
3533           DO 35 K=1,30
3534              W1=W1+1.0D0/K
3535              R1=-0.25D0*R1/(K*(K+1))*X2
3536              R=R1*(2.0D0*W1+1.0D0/(K+1.0D0))
3537              CS1=CS1+R
3538              IF (DABS(R).LT.DABS(CS1)*1.0D-15) GO TO 40
353935         CONTINUE
354040         BY1=RP2*(EC*BJ1-1.0D0/X-0.25D0*X*CS1)
3541        ELSE
3542           DATA A/-.7031250000000000D-01,.1121520996093750D+00,
3543     &            -.5725014209747314D+00,.6074042001273483D+01,
3544     &            -.1100171402692467D+03,.3038090510922384D+04,
3545     &            -.1188384262567832D+06,.6252951493434797D+07,
3546     &            -.4259392165047669D+09,.3646840080706556D+11,
3547     &            -.3833534661393944D+13,.4854014686852901D+15/
3548           DATA B/ .7324218750000000D-01,-.2271080017089844D+00,
3549     &             .1727727502584457D+01,-.2438052969955606D+02,
3550     &             .5513358961220206D+03,-.1825775547429318D+05,
3551     &             .8328593040162893D+06,-.5006958953198893D+08,
3552     &             .3836255180230433D+10,-.3649010818849833D+12,
3553     &             .4218971570284096D+14,-.5827244631566907D+16/
3554           DATA A1/.1171875000000000D+00,-.1441955566406250D+00,
3555     &             .6765925884246826D+00,-.6883914268109947D+01,
3556     &             .1215978918765359D+03,-.3302272294480852D+04,
3557     &             .1276412726461746D+06,-.6656367718817688D+07,
3558     &             .4502786003050393D+09,-.3833857520742790D+11,
3559     &             .4011838599133198D+13,-.5060568503314727D+15/
3560           DATA B1/-.1025390625000000D+00,.2775764465332031D+00,
3561     &             -.1993531733751297D+01,.2724882731126854D+02,
3562     &             -.6038440767050702D+03,.1971837591223663D+05,
3563     &             -.8902978767070678D+06,.5310411010968522D+08,
3564     &             -.4043620325107754D+10,.3827011346598605D+12,
3565     &             -.4406481417852278D+14,.6065091351222699D+16/
3566           K0=12
3567           IF (X.GE.35.0) K0=10
3568           IF (X.GE.50.0) K0=8
3569           T1=X-0.25D0*PI
3570           P0=1.0D0
3571           Q0=-0.125D0/X
3572           DO 45 K=1,K0
3573              P0=P0+A(K)*X**(-2*K)
357445            Q0=Q0+B(K)*X**(-2*K-1)
3575           CU=DSQRT(RP2/X)
3576           BJ0=CU*(P0*DCOS(T1)-Q0*DSIN(T1))
3577           BY0=CU*(P0*DSIN(T1)+Q0*DCOS(T1))
3578           T2=X-0.75D0*PI
3579           P1=1.0D0
3580           Q1=0.375D0/X
3581           DO 50 K=1,K0
3582              P1=P1+A1(K)*X**(-2*K)
358350            Q1=Q1+B1(K)*X**(-2*K-1)
3584           CU=DSQRT(RP2/X)
3585           BJ1=CU*(P1*DCOS(T2)-Q1*DSIN(T2))
3586           BY1=CU*(P1*DSIN(T2)+Q1*DCOS(T2))
3587        ENDIF
3588        DJ0=-BJ1
3589        DJ1=BJ0-BJ1/X
3590        DY0=-BY1
3591        DY1=BY0-BY1/X
3592        RETURN
3593        END
3594
3595C       **********************************
3596
3597        SUBROUTINE INCOG(A,X,GIN,GIM,GIP,ISFER)
3598C
3599C       ===================================================
3600C       Purpose: Compute the incomplete gamma function
3601C                r(a,x), Г(a,x) and P(a,x)
3602C       Input :  a   --- Parameter ( a ≤ 170 )
3603C                x   --- Argument
3604C       Output:  GIN --- r(a,x)
3605C                GIM --- Г(a,x)
3606C                GIP --- P(a,x)
3607C                ISFER --- Error flag
3608C       Routine called: GAMMA2 for computing Г(x)
3609C       ===================================================
3610C
3611        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3612        ISFER=0
3613        XAM=-X+A*DLOG(X)
3614        IF (XAM.GT.700.0.OR.A.GT.170.0) THEN
3615           ISFER=6
3616           RETURN
3617        ENDIF
3618        IF (X.EQ.0.0) THEN
3619           GIN=0.0
3620           CALL GAMMA2(A,GA)
3621           GIM=GA
3622           GIP=0.0
3623        ELSE IF (X.LE.1.0+A) THEN
3624           S=1.0D0/A
3625           R=S
3626           DO 10 K=1,60
3627              R=R*X/(A+K)
3628              S=S+R
3629              IF (DABS(R/S).LT.1.0D-15) GO TO 15
363010         CONTINUE
363115         GIN=DEXP(XAM)*S
3632           CALL GAMMA2(A,GA)
3633           GIP=GIN/GA
3634           GIM=GA-GIN
3635        ELSE IF (X.GT.1.0+A) THEN
3636           T0=0.0D0
3637           DO 20 K=60,1,-1
3638              T0=(K-A)/(1.0D0+K/(X+T0))
363920         CONTINUE
3640           GIM=DEXP(XAM)/(X+T0)
3641           CALL GAMMA2(A,GA)
3642           GIN=GA-GIM
3643           GIP=1.0D0-GIM/GA
3644        ENDIF
3645        END
3646
3647
3648
3649C       **********************************
3650
3651        SUBROUTINE ITIKB(X,TI,TK)
3652C
3653C       =======================================================
3654C       Purpose: Integrate Bessel functions I0(t) and K0(t)
3655C                with respect to t from 0 to x
3656C       Input :  x  --- Upper limit of the integral ( x ≥ 0 )
3657C       Output:  TI --- Integration of I0(t) from 0 to x
3658C                TK --- Integration of K0(t) from 0 to x
3659C       =======================================================
3660C
3661        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3662        PI=3.141592653589793D0
3663        IF (X.EQ.0.0D0) THEN
3664           TI=0.0D0
3665        ELSE IF (X.LT.5.0D0) THEN
3666           T1=X/5.0D0
3667           T=T1*T1
3668           TI=((((((((.59434D-3*T+.4500642D-2)*T
3669     &        +.044686921D0)*T+.300704878D0)*T+1.471860153D0)
3670     &        *T+4.844024624D0)*T+9.765629849D0)*T
3671     &        +10.416666367D0)*T+5.0D0)*T1
3672        ELSE IF (X.GE.5.0.AND.X.LE.8.0D0) THEN
3673           T=5.0D0/X
3674           TI=(((-.015166D0*T-.0202292D0)*T+.1294122D0)*T
3675     &        -.0302912D0)*T+.4161224D0
3676           TI=TI*DEXP(X)/DSQRT(X)
3677        ELSE
3678           T=8.0D0/X
3679           TI=(((((-.0073995D0*T+.017744D0)*T-.0114858D0)*T
3680     &        +.55956D-2)*T+.59191D-2)*T+.0311734D0)*T
3681     &        +.3989423D0
3682           TI=TI*DEXP(X)/DSQRT(X)
3683        ENDIF
3684        IF (X.EQ.0.0D0) THEN
3685           TK=0.0D0
3686        ELSE IF (X.LE.2.0D0) THEN
3687           T1=X/2.0D0
3688           T=T1*T1
3689           TK=((((((.116D-5*T+.2069D-4)*T+.62664D-3)*T
3690     &        +.01110118D0)*T+.11227902D0)*T+.50407836D0)*T
3691     &        +.84556868D0)*T1
3692              TK=TK-DLOG(X/2.0D0)*TI
3693        ELSE IF (X.GT.2.0.AND.X.LE.4.0D0) THEN
3694           T=2.0D0/X
3695           TK=(((.0160395D0*T-.0781715D0)*T+.185984D0)*T
3696     &        -.3584641D0)*T+1.2494934D0
3697           TK=PI/2.0D0-TK*DEXP(-X)/DSQRT(X)
3698        ELSE IF (X.GT.4.0.AND.X.LE.7.0D0) THEN
3699           T=4.0D0/X
3700           TK=(((((.37128D-2*T-.0158449D0)*T+.0320504D0)*T
3701     &        -.0481455D0)*T+.0787284D0)*T-.1958273D0)*T
3702     &        +1.2533141D0
3703           TK=PI/2.0D0-TK*DEXP(-X)/DSQRT(X)
3704        ELSE
3705           T=7.0D0/X
3706           TK=(((((.33934D-3*T-.163271D-2)*T+.417454D-2)*T
3707     &        -.933944D-2)*T+.02576646D0)*T-.11190289D0)*T
3708     &        +1.25331414D0
3709           TK=PI/2.0D0-TK*DEXP(-X)/DSQRT(X)
3710        ENDIF
3711        RETURN
3712        END
3713
3714C       **********************************
3715
3716        SUBROUTINE ITIKA(X,TI,TK)
3717C
3718C       =======================================================
3719C       Purpose: Integrate modified Bessel functions I0(t) and
3720C                K0(t) with respect to t from 0 to x
3721C       Input :  x  --- Upper limit of the integral  ( x ≥ 0 )
3722C       Output:  TI --- Integration of I0(t) from 0 to x
3723C                TK --- Integration of K0(t) from 0 to x
3724C       =======================================================
3725C
3726        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3727        DIMENSION A(10)
3728        PI=3.141592653589793D0
3729        EL=.5772156649015329D0
3730        DATA A/.625D0,1.0078125D0,
3731     &       2.5927734375D0,9.1868591308594D0,
3732     &       4.1567974090576D+1,2.2919635891914D+2,
3733     &       1.491504060477D+3,1.1192354495579D+4,
3734     &       9.515939374212D+4,9.0412425769041D+5/
3735        IF (X.EQ.0.0D0) THEN
3736           TI=0.0D0
3737           TK=0.0D0
3738           RETURN
3739        ELSE IF (X.LT.20.0D0) THEN
3740           X2=X*X
3741           TI=1.0D0
3742           R=1.0D0
3743           DO 10 K=1,50
3744              R=.25D0*R*(2*K-1.0D0)/(2*K+1.0D0)/(K*K)*X2
3745              TI=TI+R
3746              IF (DABS(R/TI).LT.1.0D-12) GO TO 15
374710         CONTINUE
374815         TI=TI*X
3749        ELSE
3750           X2=0.0D0
3751           TI=1.0D0
3752           R=1.0D0
3753           DO 20 K=1,10
3754              R=R/X
375520            TI=TI+A(K)*R
3756           RC1=1.0D0/DSQRT(2.0D0*PI*X)
3757           TI=RC1*DEXP(X)*TI
3758        ENDIF
3759        IF (X.LT.12.0D0) THEN
3760           E0=EL+DLOG(X/2.0D0)
3761           B1=1.0D0-E0
3762           B2=0.0D0
3763           RS=0.0D0
3764           R=1.0D0
3765           TW=0.0D0
3766           DO 25 K=1,50
3767              R=.25D0*R*(2*K-1.0D0)/(2*K+1.0D0)/(K*K)*X2
3768              B1=B1+R*(1.0D0/(2*K+1)-E0)
3769              RS=RS+1.0D0/K
3770              B2=B2+R*RS
3771              TK=B1+B2
3772              IF (DABS((TK-TW)/TK).LT.1.0D-12) GO TO 30
377325            TW=TK
377430         TK=TK*X
3775        ELSE
3776           TK=1.0D0
3777           R=1.0D0
3778           DO 35 K=1,10
3779              R=-R/X
378035            TK=TK+A(K)*R
3781           RC2=DSQRT(PI/(2.0D0*X))
3782           TK=PI/2.0D0-RC2*TK*DEXP(-X)
3783        ENDIF
3784        RETURN
3785        END
3786
3787C       **********************************
3788
3789        SUBROUTINE JYV(V,X,VM,BJ,DJ,BY,DY)
3790C
3791C       =======================================================
3792C       Purpose: Compute Bessel functions Jv(x) and Yv(x)
3793C                and their derivatives
3794C       Input :  x --- Argument of Jv(x) and Yv(x)
3795C                v --- Order of Jv(x) and Yv(x)
3796C                      ( v = n+v0, 0 ≤ v0 < 1, n = 0,1,2,... )
3797C       Output:  BJ(n) --- Jn+v0(x)
3798C                DJ(n) --- Jn+v0'(x)
3799C                BY(n) --- Yn+v0(x)
3800C                DY(n) --- Yn+v0'(x)
3801C                VM --- Highest order computed
3802C       Routines called:
3803C            (1) GAMMA2 for computing gamma function
3804C            (2) MSTA1 and MSTA2 for computing the starting
3805C                point for backward recurrence
3806C       =======================================================
3807C
3808        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3809        DIMENSION BJ(0:*),DJ(0:*),BY(0:*),DY(0:*)
3810        EL=.5772156649015329D0
3811        PI=3.141592653589793D0
3812        RP2=.63661977236758D0
3813        X2=X*X
3814        N=INT(V)
3815        V0=V-N
3816        IF (X.LT.1.0D-100) THEN
3817           DO 10 K=0,N
3818              BJ(K)=0.0D0
3819              DJ(K)=0.0D0
3820              BY(K)=-1.0D+300
382110            DY(K)=1.0D+300
3822           IF (V0.EQ.0.0) THEN
3823              BJ(0)=1.0D0
3824              DJ(1)=0.5D0
3825           ELSE
3826              DJ(0)=1.0D+300
3827           ENDIF
3828           VM=V
3829           RETURN
3830        ENDIF
3831        BJV0=0.0D0
3832        BJV1=0.0D0
3833        BYV0=0.0D0
3834        BYV1=0.0D0
3835        IF (X.LE.12.0) THEN
3836           DO 25 L=0,1
3837              VL=V0+L
3838              BJVL=1.0D0
3839              R=1.0D0
3840              DO 15 K=1,40
3841                 R=-0.25D0*R*X2/(K*(K+VL))
3842                 BJVL=BJVL+R
3843                 IF (DABS(R).LT.DABS(BJVL)*1.0D-15) GO TO 20
384415            CONTINUE
384520            VG=1.0D0+VL
3846              CALL GAMMA2(VG,GA)
3847              A=(0.5D0*X)**VL/GA
3848              IF (L.EQ.0) BJV0=BJVL*A
3849              IF (L.EQ.1) BJV1=BJVL*A
385025         CONTINUE
3851        ELSE
3852           K0=11
3853           IF (X.GE.35.0) K0=10
3854           IF (X.GE.50.0) K0=8
3855           DO 40 J=0,1
3856              VV=4.0D0*(J+V0)*(J+V0)
3857              PX=1.0D0
3858              RP=1.0D0
3859              DO 30 K=1,K0
3860                 RP=-0.78125D-2*RP*(VV-(4.0*K-3.0)**2.0)*(VV-
3861     &              (4.0*K-1.0)**2.0)/(K*(2.0*K-1.0)*X2)
386230               PX=PX+RP
3863              QX=1.0D0
3864              RQ=1.0D0
3865              DO 35 K=1,K0
3866                 RQ=-0.78125D-2*RQ*(VV-(4.0*K-1.0)**2.0)*(VV-
3867     &              (4.0*K+1.0)**2.0)/(K*(2.0*K+1.0)*X2)
386835               QX=QX+RQ
3869              QX=0.125D0*(VV-1.0)*QX/X
3870              XK=X-(0.5D0*(J+V0)+0.25D0)*PI
3871              A0=DSQRT(RP2/X)
3872              CK=DCOS(XK)
3873              SK=DSIN(XK)
3874              IF (J.EQ.0) THEN
3875                 BJV0=A0*(PX*CK-QX*SK)
3876                 BYV0=A0*(PX*SK+QX*CK)
3877              ELSE IF (J.EQ.1) THEN
3878                 BJV1=A0*(PX*CK-QX*SK)
3879                 BYV1=A0*(PX*SK+QX*CK)
3880              ENDIF
388140         CONTINUE
3882        ENDIF
3883        BJ(0)=BJV0
3884        BJ(1)=BJV1
3885        DJ(0)=V0/X*BJ(0)-BJ(1)
3886        DJ(1)=-(1.0D0+V0)/X*BJ(1)+BJ(0)
3887        IF (N.GE.2.AND.N.LE.INT(0.9*X)) THEN
3888           F0=BJV0
3889           F1=BJV1
3890           DO 45 K=2,N
3891              F=2.0D0*(K+V0-1.0D0)/X*F1-F0
3892              BJ(K)=F
3893              F0=F1
389445            F1=F
3895        ELSE IF (N.GE.2) THEN
3896           M=MSTA1(X,200)
3897           IF (M.LT.N) THEN
3898              N=M
3899           ELSE
3900              M=MSTA2(X,N,15)
3901           ENDIF
3902           F=0.0D0
3903           F2=0.0D0
3904           F1=1.0D-100
3905           DO 50 K=M,0,-1
3906              F=2.0D0*(V0+K+1.0D0)/X*F1-F2
3907              IF (K.LE.N) BJ(K)=F
3908              F2=F1
390950            F1=F
3910           IF (DABS(BJV0).GT.DABS(BJV1)) THEN
3911               CS=BJV0/F
3912           ELSE
3913               CS=BJV1/F2
3914           ENDIF
3915           DO 55 K=0,N
391655            BJ(K)=CS*BJ(K)
3917        ENDIF
3918        DO 60 K=2,N
391960         DJ(K)=-(K+V0)/X*BJ(K)+BJ(K-1)
3920        IF (X.LE.12.0D0) THEN
3921           IF (V0.NE.0.0) THEN
3922              BJU0=0.0D0
3923              BJU1=0.0D0
3924              DO 75 L=0,1
3925                 VL=V0+L
3926                 BJVL=1.0D0
3927                 R=1.0D0
3928                 DO 65 K=1,40
3929                    R=-0.25D0*R*X2/(K*(K-VL))
3930                    BJVL=BJVL+R
3931                    IF (DABS(R).LT.DABS(BJVL)*1.0D-15) GO TO 70
393265               CONTINUE
393370               VG=1.0D0-VL
3934                 CALL GAMMA2(VG,GB)
3935                 B=(2.0D0/X)**VL/GB
3936                 IF (L.EQ.0) BJU0=BJVL*B
3937                 IF (L.EQ.1) BJU1=BJVL*B
393875            CONTINUE
3939              PV0=PI*V0
3940              PV1=PI*(1.0D0+V0)
3941              BYV0=(BJV0*DCOS(PV0)-BJU0)/DSIN(PV0)
3942              BYV1=(BJV1*DCOS(PV1)-BJU1)/DSIN(PV1)
3943           ELSE
3944              EC=DLOG(X/2.0D0)+EL
3945              CS0=0.0D0
3946              W0=0.0D0
3947              R0=1.0D0
3948              DO 80 K=1,30
3949                 W0=W0+1.0D0/K
3950                 R0=-0.25D0*R0/(K*K)*X2
395180               CS0=CS0+R0*W0
3952              BYV0=RP2*(EC*BJV0-CS0)
3953              CS1=1.0D0
3954              W1=0.0D0
3955              R1=1.0D0
3956              DO 85 K=1,30
3957                 W1=W1+1.0D0/K
3958                 R1=-0.25D0*R1/(K*(K+1))*X2
395985               CS1=CS1+R1*(2.0D0*W1+1.0D0/(K+1.0D0))
3960              BYV1=RP2*(EC*BJV1-1.0D0/X-0.25D0*X*CS1)
3961           ENDIF
3962        ENDIF
3963        BY(0)=BYV0
3964        BY(1)=BYV1
3965        DO 90 K=2,N
3966           BYVK=2.0D0*(V0+K-1.0D0)/X*BYV1-BYV0
3967           BY(K)=BYVK
3968           BYV0=BYV1
396990         BYV1=BYVK
3970        DY(0)=V0/X*BY(0)-BY(1)
3971        DO 95 K=1,N
397295         DY(K)=-(K+V0)/X*BY(K)+BY(K-1)
3973        VM=N+V0
3974        RETURN
3975        END
3976
3977
3978
3979C       **********************************
3980
3981        SUBROUTINE JYNB(N,X,NM,BJ,DJ,BY,DY)
3982C
3983C       =====================================================
3984C       Purpose: Compute Bessel functions Jn(x), Yn(x) and
3985C                their derivatives
3986C       Input :  x --- Argument of Jn(x) and Yn(x) ( x ≥ 0 )
3987C                n --- Order of Jn(x) and Yn(x)
3988C       Output:  BJ(n) --- Jn(x)
3989C                DJ(n) --- Jn'(x)
3990C                BY(n) --- Yn(x)
3991C                DY(n) --- Yn'(x)
3992C                NM --- Highest order computed
3993C       Routines called:
3994C                JYNBH to calculate the Jn and Yn
3995C       =====================================================
3996C
3997        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
3998        DIMENSION BJ(0:N),DJ(0:N),BY(0:N),DY(0:N)
3999        CALL JYNBH(N,0,X,NM,BJ,BY)
4000C       Compute derivatives by differentiation formulas
4001        IF (X.LT.1.0D-100) THEN
4002           DO 10 K=0,N
4003              DJ(K) = 0.0D0
4004 10           DY(K) = 1.0D+300
4005           DJ(1)=0.5D0
4006        ELSE
4007           DJ(0)=-BJ(1)
4008           DO 40 K=1,NM
4009 40           DJ(K)=BJ(K-1)-K/X*BJ(K)
4010           DY(0)=-BY(1)
4011           DO 50 K=1,NM
4012 50           DY(K)=BY(K-1)-K*BY(K)/X
4013        END IF
4014        RETURN
4015        END
4016
4017
4018C       **********************************
4019
4020        SUBROUTINE JYNBH(N,NMIN,X,NM,BJ,BY)
4021C
4022C       =====================================================
4023C       Purpose: Compute Bessel functions Jn(x), Yn(x)
4024C       Input :  x --- Argument of Jn(x) and Yn(x) ( x ≥ 0 )
4025C                n --- Highest order of Jn(x) and Yn(x) computed  ( n ≥ 0 )
4026C                nmin -- Lowest order computed  ( nmin ≥ 0 )
4027C       Output:  BJ(n-NMIN) --- Jn(x)   ; if indexing starts at 0
4028C                BY(n-NMIN) --- Yn(x)   ; if indexing starts at 0
4029C                NM --- Highest order computed
4030C       Routines called:
4031C                MSTA1 and MSTA2 to calculate the starting
4032C                point for backward recurrence
4033C       =====================================================
4034C
4035        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4036        DIMENSION BJ(0:N-NMIN),BY(0:N-NMIN),A(4),B(4),A1(4),B1(4)
4037        PI=3.141592653589793D0
4038        R2P=.63661977236758D0
4039        NM=N
4040        IF (X.LT.1.0D-100) THEN
4041           DO 10 K=NMIN,N
4042              BJ(K-NMIN)=0.0D0
404310            BY(K-NMIN)=-1.0D+300
4044           IF (NMIN.EQ.0) BJ(0)=1.0D0
4045           RETURN
4046        ENDIF
4047        IF (X.LE.300.0.OR.N.GT.INT(0.9*X)) THEN
4048C          Backward recurrence for Jn
4049           IF (N.EQ.0) NM=1
4050           M=MSTA1(X,200)
4051           IF (M.LT.NM) THEN
4052              NM=M
4053           ELSE
4054              M=MSTA2(X,NM,15)
4055           ENDIF
4056           BS=0.0D0
4057           SU=0.0D0
4058           SV=0.0D0
4059           F2=0.0D0
4060           F1=1.0D-100
4061           F=0.0D0
4062           DO 15 K=M,0,-1
4063              F=2.0D0*(K+1.0D0)/X*F1-F2
4064              IF (K.LE.NM .AND. K.GE.NMIN) BJ(K-NMIN)=F
4065              IF (K.EQ.2*INT(K/2).AND.K.NE.0) THEN
4066                 BS=BS+2.0D0*F
4067                 SU=SU+(-1)**(K/2)*F/K
4068              ELSE IF (K.GT.1) THEN
4069                 SV=SV+(-1)**(K/2)*K/(K*K-1.0D0)*F
4070              ENDIF
4071              F2=F1
407215            F1=F
4073           S0=BS+F
4074           DO 20 K=NMIN,NM
407520            BJ(K-NMIN)=BJ(K-NMIN)/S0
4076C          Estimates for Yn at start of recurrence
4077           BJ0 = F1 / S0
4078           BJ1 = F2 / S0
4079           EC=DLOG(X/2.0D0)+0.5772156649015329D0
4080           BY0=R2P*(EC*BJ0-4.0D0*SU/S0)
4081           BY1=R2P*((EC-1.0D0)*BJ1-BJ0/X-4.0D0*SV/S0)
4082           IF (0.GE.NMIN) BY(0-NMIN)=BY0
4083           IF (1.GE.NMIN) BY(1-NMIN)=BY1
4084           KY=2
4085        ELSE
4086C          Hankel expansion
4087           DATA A/-.7031250000000000D-01,.1121520996093750D+00,
4088     &            -.5725014209747314D+00,.6074042001273483D+01/
4089           DATA B/ .7324218750000000D-01,-.2271080017089844D+00,
4090     &             .1727727502584457D+01,-.2438052969955606D+02/
4091           DATA A1/.1171875000000000D+00,-.1441955566406250D+00,
4092     &             .6765925884246826D+00,-.6883914268109947D+01/
4093           DATA B1/-.1025390625000000D+00,.2775764465332031D+00,
4094     &             -.1993531733751297D+01,.2724882731126854D+02/
4095           T1=X-0.25D0*PI
4096           P0=1.0D0
4097           Q0=-0.125D0/X
4098           DO 25 K=1,4
4099              P0=P0+A(K)*X**(-2*K)
410025            Q0=Q0+B(K)*X**(-2*K-1)
4101           CU=DSQRT(R2P/X)
4102           BJ0=CU*(P0*DCOS(T1)-Q0*DSIN(T1))
4103           BY0=CU*(P0*DSIN(T1)+Q0*DCOS(T1))
4104           IF (0.GE.NMIN) BJ(0-NMIN)=BJ0
4105           IF (0.GE.NMIN) BY(0-NMIN)=BY0
4106           T2=X-0.75D0*PI
4107           P1=1.0D0
4108           Q1=0.375D0/X
4109           DO 30 K=1,4
4110              P1=P1+A1(K)*X**(-2*K)
411130            Q1=Q1+B1(K)*X**(-2*K-1)
4112           BJ1=CU*(P1*DCOS(T2)-Q1*DSIN(T2))
4113           BY1=CU*(P1*DSIN(T2)+Q1*DCOS(T2))
4114           IF (1.GE.NMIN) BJ(1-NMIN)=BJ1
4115           IF (1.GE.NMIN) BY(1-NMIN)=BY1
4116           DO 35 K=2,NM
4117              BJK=2.0D0*(K-1.0D0)/X*BJ1-BJ0
4118              IF (K.GE.NMIN) BJ(K-NMIN)=BJK
4119              BJ0=BJ1
412035            BJ1=BJK
4121           KY=2
4122        ENDIF
4123C       Forward recurrence for Yn
4124        DO 45 K=KY,NM
4125           BYK=2.0D0*(K-1.0D0)*BY1/X-BY0
4126           IF (K.GE.NMIN) BY(K-NMIN)=BYK
4127           BY0=BY1
412845         BY1=BYK
4129        RETURN
4130        END
4131
4132C       **********************************
4133
4134        SUBROUTINE LEGZO(N,X,W)
4135C
4136C       =========================================================
4137C       Purpose : Compute the zeros of Legendre polynomial Pn(x)
4138C                 in the interval [-1,1], and the corresponding
4139C                 weighting coefficients for Gauss-Legendre
4140C                 integration
4141C       Input :   n    --- Order of the Legendre polynomial
4142C       Output:   X(n) --- Zeros of the Legendre polynomial
4143C                 W(n) --- Corresponding weighting coefficients
4144C       =========================================================
4145C
4146        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4147        DIMENSION X(N),W(N)
4148        N0=(N+1)/2
4149        PF=0.0D0
4150        PD=0.0D0
4151        DO 45 NR=1,N0
4152           Z=DCOS(3.1415926D0*(NR-0.25D0)/N)
415310         Z0=Z
4154           P=1.0D0
4155           DO 15 I=1,NR-1
415615            P=P*(Z-X(I))
4157           F0=1.0D0
4158           IF (NR.EQ.N0.AND.N.NE.2*INT(N/2)) Z=0.0D0
4159           F1=Z
4160           DO 20 K=2,N
4161              PF=(2.0D0-1.0D0/K)*Z*F1-(1.0D0-1.0D0/K)*F0
4162              PD=K*(F1-Z*PF)/(1.0D0-Z*Z)
4163              F0=F1
416420            F1=PF
4165           IF (Z.EQ.0.0) GO TO 40
4166           FD=PF/P
4167           Q=0.0D0
4168           DO 35 I=1,NR
4169              WP=1.0D0
4170              DO 30 J=1,NR
4171                 IF (J.NE.I) WP=WP*(Z-X(J))
417230            CONTINUE
417335            Q=Q+WP
4174           GD=(PD-Q*FD)/P
4175           Z=Z-FD/GD
4176           IF (DABS(Z-Z0).GT.DABS(Z)*1.0D-15) GO TO 10
417740         X(NR)=Z
4178           X(N+1-NR)=-Z
4179           W(NR)=2.0D0/((1.0D0-Z*Z)*PD*PD)
418045         W(N+1-NR)=W(NR)
4181        RETURN
4182        END
4183
4184C       **********************************
4185
4186        SUBROUTINE ASWFA(M,N,C,X,KD,CV,S1F,S1D)
4187C
4188C       ===========================================================
4189C       Purpose: Compute the prolate and oblate spheroidal angular
4190C                functions of the first kind and their derivatives
4191C       Input :  m  --- Mode parameter,  m = 0,1,2,...
4192C                n  --- Mode parameter,  n = m,m+1,...
4193C                c  --- Spheroidal parameter
4194C                x  --- Argument of angular function, |x| < 1.0
4195C                KD --- Function code
4196C                       KD=1 for prolate;  KD=-1 for oblate
4197C                cv --- Characteristic value
4198C       Output:  S1F --- Angular function of the first kind
4199C                S1D --- Derivative of the angular function of
4200C                        the first kind
4201C       Routine called:
4202C                SCKB for computing expansion coefficients ck
4203C       ===========================================================
4204C
4205        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4206        DIMENSION CK(200),DF(200)
4207        EPS=1.0D-14
4208        X0=X
4209        X=DABS(X)
4210        IP=1
4211        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
4212        NM=40+INT((N-M)/2+C)
4213        NM2=NM/2-2
4214        CALL SDMN(M,N,C,CV,KD,DF)
4215        CALL SCKB(M,N,C,DF,CK)
4216        X1=1.0D0-X*X
4217        IF (M.EQ.0.AND.X1.EQ.0.0D0) THEN
4218           A0=1.0D0
4219        ELSE
4220           A0=X1**(0.5D0*M)
4221        ENDIF
4222        SU1=CK(1)
4223        DO 10 K=1,NM2
4224           R=CK(K+1)*X1**K
4225           SU1=SU1+R
4226           IF (K.GE.10.AND.DABS(R/SU1).LT.EPS) GO TO 15
422710         CONTINUE
422815      S1F=A0*X**IP*SU1
4229        IF (X.EQ.1.0D0) THEN
4230           IF (M.EQ.0) S1D=IP*CK(1)-2.0D0*CK(2)
4231           IF (M.EQ.1) S1D=-1.0D+100
4232           IF (M.EQ.2) S1D=-2.0D0*CK(1)
4233           IF (M.GE.3) S1D=0.0D0
4234        ELSE
4235           D0=IP-M/X1*X**(IP+1.0D0)
4236           D1=-2.0D0*A0*X**(IP+1.0D0)
4237           SU2=CK(2)
4238           DO 20 K=2,NM2
4239              R=K*CK(K+1)*X1**(K-1.0D0)
4240              SU2=SU2+R
4241              IF (K.GE.10.AND.DABS(R/SU2).LT.EPS) GO TO 25
424220            CONTINUE
424325         S1D=D0*A0*SU1+D1*SU2
4244        ENDIF
4245        IF (X0.LT.0.0D0.AND.IP.EQ.0) S1D=-S1D
4246        IF (X0.LT.0.0D0.AND.IP.EQ.1) S1F=-S1F
4247        X=X0
4248        RETURN
4249        END
4250
4251
4252
4253C       **********************************
4254
4255        SUBROUTINE JYNA(N,X,NM,BJ,DJ,BY,DY)
4256C
4257C       ==========================================================
4258C       Purpose: Compute Bessel functions Jn(x) & Yn(x) and
4259C                their derivatives
4260C       Input :  x --- Argument of Jn(x) & Yn(x)  ( x ≥ 0 )
4261C                n --- Order of Jn(x) & Yn(x)
4262C       Output:  BJ(n) --- Jn(x)
4263C                DJ(n) --- Jn'(x)
4264C                BY(n) --- Yn(x)
4265C                DY(n) --- Yn'(x)
4266C                NM --- Highest order computed
4267C       Routines called:
4268C            (1) JY01B to calculate J0(x), J1(x), Y0(x) & Y1(x)
4269C            (2) MSTA1 and MSTA2 to calculate the starting
4270C                point for backward recurrence
4271C       =========================================================
4272C
4273        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4274        DIMENSION BJ(0:N),BY(0:N),DJ(0:N),DY(0:N)
4275        NM=N
4276        IF (X.LT.1.0D-100) THEN
4277           DO 10 K=0,N
4278              BJ(K)=0.0D0
4279              DJ(K)=0.0D0
4280              BY(K)=-1.0D+300
428110            DY(K)=1.0D+300
4282           BJ(0)=1.0D0
4283           DJ(1)=0.5D0
4284           RETURN
4285        ENDIF
4286        CALL JY01B(X,BJ0,DJ0,BJ1,DJ1,BY0,DY0,BY1,DY1)
4287        BJ(0)=BJ0
4288        BJ(1)=BJ1
4289        BY(0)=BY0
4290        BY(1)=BY1
4291        DJ(0)=DJ0
4292        DJ(1)=DJ1
4293        DY(0)=DY0
4294        DY(1)=DY1
4295        IF (N.LE.1) RETURN
4296        IF (N.LT.INT(0.9*X)) THEN
4297           DO 20 K=2,N
4298              BJK=2.0D0*(K-1.0D0)/X*BJ1-BJ0
4299              BJ(K)=BJK
4300              BJ0=BJ1
430120            BJ1=BJK
4302        ELSE
4303           M=MSTA1(X,200)
4304           IF (M.LT.N) THEN
4305              NM=M
4306           ELSE
4307              M=MSTA2(X,N,15)
4308           ENDIF
4309           F2=0.0D0
4310           F1=1.0D-100
4311           F=0.0D0
4312           DO 30 K=M,0,-1
4313              F=2.0D0*(K+1.0D0)/X*F1-F2
4314              IF (K.LE.NM) BJ(K)=F
4315              F2=F1
431630            F1=F
4317           IF (DABS(BJ0).GT.DABS(BJ1)) THEN
4318              CS=BJ0/F
4319           ELSE
4320              CS=BJ1/F2
4321           ENDIF
4322           DO 40 K=0,NM
432340            BJ(K)=CS*BJ(K)
4324        ENDIF
4325        DO 50 K=2,NM
432650         DJ(K)=BJ(K-1)-K/X*BJ(K)
4327        F0=BY(0)
4328        F1=BY(1)
4329        DO 60 K=2,NM
4330           F=2.0D0*(K-1.0D0)/X*F1-F0
4331           BY(K)=F
4332           F0=F1
433360         F1=F
4334        DO 70 K=2,NM
433570         DY(K)=BY(K-1)-K*BY(K)/X
4336        RETURN
4337        END
4338
4339
4340
4341C       **********************************
4342
4343        SUBROUTINE PBDV(V,X,DV,DP,PDF,PDD)
4344C
4345C       ====================================================
4346C       Purpose: Compute parabolic cylinder functions Dv(x)
4347C                and their derivatives
4348C       Input:   x --- Argument of Dv(x)
4349C                v --- Order of Dv(x)
4350C       Output:  DV(na) --- Dn+v0(x)
4351C                DP(na) --- Dn+v0'(x)
4352C                ( na = |n|, v0 = v-n, |v0| < 1,
4353C                  n = 0,±1,±2,… )
4354C                PDF --- Dv(x)
4355C                PDD --- Dv'(x)
4356C       Routines called:
4357C             (1) DVSA for computing Dv(x) for small |x|
4358C             (2) DVLA for computing Dv(x) for large |x|
4359C       ====================================================
4360C
4361        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4362        DIMENSION DV(0:*),DP(0:*)
4363        XA=DABS(X)
4364        VH=V
4365        V=V+DSIGN(1.0D0,V)
4366        NV=INT(V)
4367        V0=V-NV
4368        NA=ABS(NV)
4369        EP=DEXP(-.25D0*X*X)
4370        JA=0
4371        IF (NA.GE.1) JA=1
4372        IF (V.GE.0.0) THEN
4373           IF (V0.EQ.0.0) THEN
4374              PD0=EP
4375              PD1=X*EP
4376           ELSE
4377              DO 10 L=0,JA
4378                 V1=V0+L
4379                 IF (XA.LE.5.8) CALL DVSA(V1,X,PD1)
4380                 IF (XA.GT.5.8) CALL DVLA(V1,X,PD1)
4381                 IF (L.EQ.0) PD0=PD1
438210            CONTINUE
4383           ENDIF
4384           DV(0)=PD0
4385           DV(1)=PD1
4386           DO 15 K=2,NA
4387              PDF=X*PD1-(K+V0-1.0D0)*PD0
4388              DV(K)=PDF
4389              PD0=PD1
439015            PD1=PDF
4391        ELSE
4392           IF (X.LE.0.0) THEN
4393              IF (XA.LE.5.8D0)  THEN
4394                 CALL DVSA(V0,X,PD0)
4395                 V1=V0-1.0D0
4396                 CALL DVSA(V1,X,PD1)
4397              ELSE
4398                 CALL DVLA(V0,X,PD0)
4399                 V1=V0-1.0D0
4400                 CALL DVLA(V1,X,PD1)
4401              ENDIF
4402              DV(0)=PD0
4403              DV(1)=PD1
4404              DO 20 K=2,NA
4405                 PD=(-X*PD1+PD0)/(K-1.0D0-V0)
4406                 DV(K)=PD
4407                 PD0=PD1
440820               PD1=PD
4409           ELSE IF (X.LE.2.0) THEN
4410              V2=NV+V0
4411              IF (NV.EQ.0) V2=V2-1.0D0
4412              NK=INT(-V2)
4413              CALL DVSA(V2,X,F1)
4414              V1=V2+1.0D0
4415              CALL DVSA(V1,X,F0)
4416              DV(NK)=F1
4417              DV(NK-1)=F0
4418              DO 25 K=NK-2,0,-1
4419                 F=X*F0+(K-V0+1.0D0)*F1
4420                 DV(K)=F
4421                 F1=F0
442225               F0=F
4423           ELSE
4424              IF (XA.LE.5.8) CALL DVSA(V0,X,PD0)
4425              IF (XA.GT.5.8) CALL DVLA(V0,X,PD0)
4426              DV(0)=PD0
4427              M=100+NA
4428              F1=0.0D0
4429              F0=1.0D-30
4430              F=0.0D0
4431              DO 30 K=M,0,-1
4432                 F=X*F0+(K-V0+1.0D0)*F1
4433                 IF (K.LE.NA) DV(K)=F
4434                 F1=F0
443530               F0=F
4436              S0=PD0/F
4437              DO 35 K=0,NA
443835               DV(K)=S0*DV(K)
4439           ENDIF
4440        ENDIF
4441        DO 40 K=0,NA-1
4442           V1=ABS(V0)+K
4443           IF (V.GE.0.0D0) THEN
4444              DP(K)=0.5D0*X*DV(K)-DV(K+1)
4445           ELSE
4446              DP(K)=-0.5D0*X*DV(K)-V1*DV(K+1)
4447           ENDIF
444840      CONTINUE
4449        PDF=DV(NA-1)
4450        PDD=DP(NA-1)
4451        V=VH
4452        RETURN
4453        END
4454
4455
4456
4457C       **********************************
4458
4459        SUBROUTINE ITSH0(X,TH0)
4460C
4461C       ===================================================
4462C       Purpose: Evaluate the integral of Struve function
4463C                H0(t) with respect to t from 0 and x
4464C       Input :  x   --- Upper limit  ( x ≥ 0 )
4465C       Output:  TH0 --- Integration of H0(t) from 0 and x
4466C       ===================================================
4467C
4468        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4469        DIMENSION A(25)
4470        PI=3.141592653589793D0
4471        R=1.0D0
4472        IF (X.LE.30.0) THEN
4473           S=0.5D0
4474           DO 10 K=1,100
4475              RD=1.0D0
4476              IF (K.EQ.1) RD=0.5D0
4477              R=-R*RD*K/(K+1.0D0)*(X/(2.0D0*K+1.0D0))**2
4478              S=S+R
4479              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 15
448010         CONTINUE
448115         TH0=2.0D0/PI*X*X*S
4482        ELSE
4483           S=1.0D0
4484           DO 20 K=1,12
4485              R=-R*K/(K+1.0D0)*((2.0D0*K+1.0D0)/X)**2
4486              S=S+R
4487              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 25
448820         CONTINUE
448925         EL=.57721566490153D0
4490           S0=S/(PI*X*X)+2.0D0/PI*(DLOG(2.0D0*X)+EL)
4491           A0=1.0D0
4492           A1=5.0D0/8.0D0
4493           A(1)=A1
4494           DO 30 K=1,20
4495              AF=((1.5D0*(K+.5D0)*(K+5.0D0/6.0D0)*A1-.5D0
4496     &           *(K+.5D0)*(K+.5D0)*(K-.5D0)*A0))/(K+1.0D0)
4497              A(K+1)=AF
4498              A0=A1
449930            A1=AF
4500           BF=1.0D0
4501           R=1.0D0
4502           DO 35 K=1,10
4503              R=-R/(X*X)
450435            BF=BF+A(2*K)*R
4505           BG=A(1)/X
4506           R=1.0D0/X
4507           DO 40 K=1,10
4508              R=-R/(X*X)
450940            BG=BG+A(2*K+1)*R
4510           XP=X+.25D0*PI
4511           TY=DSQRT(2.0D0/(PI*X))*(BG*DCOS(XP)-BF*DSIN(XP))
4512           TH0=TY+S0
4513        ENDIF
4514        RETURN
4515        END
4516
4517C       **********************************
4518
4519        SUBROUTINE CERZO(NT,ZO)
4520C
4521C       ===============================================================
4522C       Purpose : Evaluate the complex zeros of error function erf(z)
4523C                 using the modified Newton's iteration method
4524C       Input :   NT --- Total number of zeros
4525C       Output:   ZO(L) --- L-th zero of erf(z), L=1,2,...,NT
4526C       Routine called: CERF for computing erf(z) and erf'(z)
4527C       ===============================================================
4528C
4529        IMPLICIT DOUBLE PRECISION (E,P,W)
4530        IMPLICIT COMPLEX *16 (C,Z)
4531        DIMENSION ZO(NT)
4532        PI=3.141592653589793D0
4533        W=0.0D0
4534        DO 35 NR=1,NT
4535           PU=DSQRT(PI*(4.0D0*NR-0.5D0))
4536           PV=PI*DSQRT(2.0D0*NR-0.25D0)
4537           PX=0.5*PU-0.5*DLOG(PV)/PU
4538           PY=0.5*PU+0.5*DLOG(PV)/PU
4539           Z = DCMPLX(PX, PY)
4540           IT=0
454115         IT=IT+1
4542           CALL CERF(Z,ZF,ZD)
4543           ZP=(1.0D0,0.0D0)
4544           DO 20 I=1,NR-1
454520            ZP=ZP*(Z-ZO(I))
4546           ZFD=ZF/ZP
4547           ZQ=(0.0D0,0.0D0)
4548           DO 30 I=1,NR-1
4549              ZW=(1.0D0,0.0D0)
4550              DO 25 J=1,NR-1
4551                 IF (J.EQ.I) GO TO 25
4552                 ZW=ZW*(Z-ZO(J))
455325            CONTINUE
455430            ZQ=ZQ+ZW
4555           ZGD=(ZD-ZQ*ZFD)/ZP
4556           Z=Z-ZFD/ZGD
4557           W0=W
4558           W=CDABS(Z)
4559           IF (IT.LE.50.AND.DABS((W-W0)/W).GT.1.0D-11) GO TO 15
456035         ZO(NR)=Z
4561        RETURN
4562        END
4563
4564
4565
4566C       **********************************
4567
4568        SUBROUTINE GAMMA2(X,GA)
4569C
4570C       ==================================================
4571C       Purpose: Compute gamma function Г(x)
4572C       Input :  x  --- Argument of Г(x)
4573C                       ( x is not equal to 0,-1,-2,…)
4574C       Output:  GA --- Г(x)
4575C       ==================================================
4576C
4577        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4578        DIMENSION G(26)
4579        PI=3.141592653589793D0
4580        IF (X.EQ.INT(X)) THEN
4581           IF (X.GT.0.0D0) THEN
4582              GA=1.0D0
4583              M1=X-1
4584              DO 10 K=2,M1
458510               GA=GA*K
4586           ELSE
4587              GA=1.0D+300
4588           ENDIF
4589        ELSE
4590           R=1.0D0
4591           IF (DABS(X).GT.1.0D0) THEN
4592              Z=DABS(X)
4593              M=INT(Z)
4594              DO 15 K=1,M
459515               R=R*(Z-K)
4596              Z=Z-M
4597           ELSE
4598              Z=X
4599           ENDIF
4600           DATA G/1.0D0,0.5772156649015329D0,
4601     &          -0.6558780715202538D0, -0.420026350340952D-1,
4602     &          0.1665386113822915D0,-.421977345555443D-1,
4603     &          -.96219715278770D-2, .72189432466630D-2,
4604     &          -.11651675918591D-2, -.2152416741149D-3,
4605     &          .1280502823882D-3, -.201348547807D-4,
4606     &          -.12504934821D-5, .11330272320D-5,
4607     &          -.2056338417D-6, .61160950D-8,
4608     &          .50020075D-8, -.11812746D-8,
4609     &          .1043427D-9, .77823D-11,
4610     &          -.36968D-11, .51D-12,
4611     &          -.206D-13, -.54D-14, .14D-14, .1D-15/
4612           GR=G(26)
4613           DO 20 K=25,1,-1
461420            GR=GR*Z+G(K)
4615           GA=1.0D0/(GR*Z)
4616           IF (DABS(X).GT.1.0D0) THEN
4617              GA=GA*R
4618              IF (X.LT.0.0D0) GA=-PI/(X*GA*DSIN(PI*X))
4619           ENDIF
4620        ENDIF
4621        RETURN
4622        END
4623
4624C       **********************************
4625
4626        SUBROUTINE CHGU(A,B,X,HU,MD,ISFER)
4627C
4628C       =======================================================
4629C       Purpose: Compute the confluent hypergeometric function
4630C                U(a,b,x)
4631C       Input  : a  --- Parameter
4632C                b  --- Parameter
4633C                x  --- Argument  ( x > 0 )
4634C       Output:  HU --- U(a,b,x)
4635C                MD --- Method code
4636C                ISFER --- Error flag
4637C       Routines called:
4638C            (1) CHGUS for small x ( MD=1 )
4639C            (2) CHGUL for large x ( MD=2 )
4640C            (3) CHGUBI for integer b ( MD=3 )
4641C            (4) CHGUIT for numerical integration ( MD=4 )
4642C       =======================================================
4643C
4644        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4645        LOGICAL IL1,IL2,IL3,BL1,BL2,BL3,BN
4646        AA=A-B+1.0D0
4647        ISFER=0
4648        IL1=A.EQ.INT(A).AND.A.LE.0.0
4649        IL2=AA.EQ.INT(AA).AND.AA.LE.0.0
4650        IL3=ABS(A*(A-B+1.0))/X.LE.2.0
4651        BL1=X.LE.5.0.OR.(X.LE.10.0.AND.A.LE.2.0)
4652        BL2=(X.GT.5.0.AND.X.LE.12.5).AND.(A.GE.1.0.AND.B.GE.A+4.0)
4653        BL3=X.GT.12.5.AND.A.GE.5.0.AND.B.GE.A+5.0
4654        BN=B.EQ.INT(B).AND.B.NE.0.0
4655        ID1=-100
4656        HU1=0.0D0
4657        IF (B.NE.INT(B)) THEN
4658           CALL CHGUS(A,B,X,HU,ID1)
4659           MD=1
4660           IF (ID1.GE.9) RETURN
4661           HU1=HU
4662        ENDIF
4663        IF (IL1.OR.IL2.OR.IL3) THEN
4664           CALL CHGUL(A,B,X,HU,ID)
4665           MD=2
4666           IF (ID.GE.9) RETURN
4667           IF (ID1.GT.ID) THEN
4668              MD=1
4669              ID=ID1
4670              HU=HU1
4671           ENDIF
4672        ENDIF
4673        IF (A.GE.1.0) THEN
4674           IF (BN.AND.(BL1.OR.BL2.OR.BL3)) THEN
4675              CALL CHGUBI(A,B,X,HU,ID)
4676              MD=3
4677           ELSE
4678              CALL CHGUIT(A,B,X,HU,ID)
4679              MD=4
4680           ENDIF
4681        ELSE
4682           IF (B.LE.A) THEN
4683              A00=A
4684              B00=B
4685              A=A-B+1.0D0
4686              B=2.0D0-B
4687              CALL CHGUIT(A,B,X,HU,ID)
4688              HU=X**(1.0D0-B00)*HU
4689              A=A00
4690              B=B00
4691              MD=4
4692           ELSE IF (BN.AND.(.NOT.IL1)) THEN
4693              CALL CHGUBI(A,B,X,HU,ID)
4694              MD=3
4695           ENDIF
4696        ENDIF
4697        IF (ID.LT.6) ISFER=6
4698        RETURN
4699        END
4700
4701
4702
4703C       **********************************
4704
4705        SUBROUTINE LAMN(N,X,NM,BL,DL)
4706C
4707C       =========================================================
4708C       Purpose: Compute lambda functions and their derivatives
4709C       Input:   x --- Argument of lambda function
4710C                n --- Order of lambda function
4711C       Output:  BL(n) --- Lambda function of order n
4712C                DL(n) --- Derivative of lambda function
4713C                NM --- Highest order computed
4714C       Routines called:
4715C                MSTA1 and MSTA2 for computing the start
4716C                point for backward recurrence
4717C       =========================================================
4718C
4719        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4720        DIMENSION BL(0:N),DL(0:N)
4721        NM=N
4722        IF (DABS(X).LT.1.0D-100) THEN
4723           DO 10 K=0,N
4724              BL(K)=0.0D0
472510            DL(K)=0.0D0
4726           BL(0)=1.0D0
4727           DL(1)=0.5D0
4728           RETURN
4729        ENDIF
4730        IF (X.LE.12.0D0) THEN
4731           X2=X*X
4732           DO 25 K=0,N
4733              BK=1.0D0
4734              R=1.0D0
4735              DO 15 I=1,50
4736                 R=-0.25D0*R*X2/(I*(I+K))
4737                 BK=BK+R
4738                 IF (DABS(R).LT.DABS(BK)*1.0D-15) GO TO 20
473915            CONTINUE
474020            BL(K)=BK
474125            IF (K.GE.1) DL(K-1)=-0.5D0*X/K*BK
4742           UK=1.0D0
4743           R=1.0D0
4744           DO 30 I=1,50
4745              R=-0.25D0*R*X2/(I*(I+N+1.0D0))
4746              UK=UK+R
4747              IF (DABS(R).LT.DABS(UK)*1.0D-15) GO TO 35
474830            CONTINUE
474935         DL(N)=-0.5D0*X/(N+1.0D0)*UK
4750           RETURN
4751        ENDIF
4752        IF (N.EQ.0) NM=1
4753        M=MSTA1(X,200)
4754        IF (M.LT.NM) THEN
4755           NM=M
4756        ELSE
4757           M=MSTA2(X,NM,15)
4758        ENDIF
4759        BS=0.0D0
4760        F=0.0D0
4761        F0=0.0D0
4762        F1=1.0D-100
4763        DO 40 K=M,0,-1
4764           F=2.0D0*(K+1.0D0)*F1/X-F0
4765           IF (K.LE.NM) BL(K)=F
4766           IF (K.EQ.2*INT(K/2)) BS=BS+2.0D0*F
4767           F0=F1
476840         F1=F
4769        BG=BS-F
4770        DO 45 K=0,NM
477145         BL(K)=BL(K)/BG
4772        R0=1.0D0
4773        DO 50 K=1,NM
4774           R0=2.0D0*R0*K/X
477550         BL(K)=R0*BL(K)
4776        DL(0)=-0.5D0*X*BL(1)
4777        DO 55 K=1,NM
477855         DL(K)=2.0D0*K/X*(BL(K-1)-BL(K))
4779        RETURN
4780        END
4781
4782
4783
4784C       **********************************
4785
4786        SUBROUTINE COMELP(HK,CK,CE)
4787C
4788C       ==================================================
4789C       Purpose: Compute complete elliptic integrals K(k)
4790C                and E(k)
4791C       Input  : K  --- Modulus k ( 0 ≤ k ≤ 1 )
4792C       Output : CK --- K(k)
4793C                CE --- E(k)
4794C       ==================================================
4795C
4796        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4797        PK=1.0D0-HK*HK
4798        IF (HK.EQ.1.0) THEN
4799           CK=1.0D+300
4800           CE=1.0D0
4801        ELSE
4802           AK=(((.01451196212D0*PK+.03742563713D0)*PK
4803     &        +.03590092383D0)*PK+.09666344259D0)*PK+
4804     &        1.38629436112D0
4805           BK=(((.00441787012D0*PK+.03328355346D0)*PK+
4806     &        .06880248576D0)*PK+.12498593597D0)*PK+.5D0
4807           CK=AK-BK*DLOG(PK)
4808           AE=(((.01736506451D0*PK+.04757383546D0)*PK+
4809     &        .0626060122D0)*PK+.44325141463D0)*PK+1.0D0
4810           BE=(((.00526449639D0*PK+.04069697526D0)*PK+
4811     &        .09200180037D0)*PK+.2499836831D0)*PK
4812           CE=AE-BE*DLOG(PK)
4813        ENDIF
4814        RETURN
4815        END
4816
4817C       **********************************
4818
4819        SUBROUTINE INCOB(A,B,X,BIX)
4820C
4821C       ========================================================
4822C       Purpose: Compute the incomplete beta function Ix(a,b)
4823C       Input :  a --- Parameter
4824C                b --- Parameter
4825C                x --- Argument ( 0 ≤ x ≤ 1 )
4826C       Output:  BIX --- Ix(a,b)
4827C       Routine called: BETA for computing beta function B(p,q)
4828C       ========================================================
4829C
4830        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4831        DIMENSION DK(51),FK(51)
4832        S0=(A+1.0D0)/(A+B+2.0D0)
4833        CALL BETA(A,B,BT)
4834        IF (X.LE.S0) THEN
4835           DO 10 K=1,20
483610            DK(2*K)=K*(B-K)*X/(A+2.0D0*K-1.0D0)/(A+2.0D0*K)
4837           DO 15 K=0,20
483815            DK(2*K+1)=-(A+K)*(A+B+K)*X/(A+2.D0*K)/(A+2.0*K+1.0)
4839           T1=0.0D0
4840           DO 20 K=20,1,-1
484120            T1=DK(K)/(1.0D0+T1)
4842           TA=1.0D0/(1.0D0+T1)
4843           BIX=X**A*(1.0D0-X)**B/(A*BT)*TA
4844        ELSE
4845           DO 25 K=1,20
484625            FK(2*K)=K*(A-K)*(1.0D0-X)/(B+2.*K-1.0)/(B+2.0*K)
4847           DO 30 K=0,20
484830            FK(2*K+1)=-(B+K)*(A+B+K)*(1.D0-X)/
4849     &                   (B+2.D0*K)/(B+2.D0*K+1.D0)
4850           T2=0.0D0
4851           DO 35 K=20,1,-1
485235            T2=FK(K)/(1.0D0+T2)
4853           TB=1.0D0/(1.0D0+T2)
4854           BIX=1.0D0-X**A*(1.0D0-X)**B/(B*BT)*TB
4855        ENDIF
4856        RETURN
4857        END
4858
4859
4860
4861C       **********************************
4862
4863        SUBROUTINE CVF(KD,M,Q,A,MJ,F)
4864C
4865C       ======================================================
4866C       Purpose: Compute the value of F for characteristic
4867C                equation of Mathieu functions
4868C       Input :  m --- Order of Mathieu functions
4869C                q --- Parameter of Mathieu functions
4870C                A --- Characteristic value
4871C       Output:  F --- Value of F for characteristic equation
4872C       ======================================================
4873C
4874        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4875        B=A
4876        IC=INT(M/2)
4877        L=0
4878        L0=0
4879        J0=2
4880        JF=IC
4881        IF (KD.EQ.1) L0=2
4882        IF (KD.EQ.1) J0=3
4883        IF (KD.EQ.2.OR.KD.EQ.3) L=1
4884        IF (KD.EQ.4) JF=IC-1
4885        T1=0.0D0
4886        DO 10 J=MJ,IC+1,-1
488710         T1=-Q*Q/((2.0D0*J+L)**2-B+T1)
4888        IF (M.LE.2) THEN
4889           T2=0.0D0
4890           IF (KD.EQ.1.AND.M.EQ.0) T1=T1+T1
4891           IF (KD.EQ.1.AND.M.EQ.2) T1=-2.0D0*Q*Q/(4.0D0-B+T1)-4.0D0
4892           IF (KD.EQ.2.AND.M.EQ.1) T1=T1+Q
4893           IF (KD.EQ.3.AND.M.EQ.1) T1=T1-Q
4894        ELSE
4895           T0=0.0D0
4896           IF (KD.EQ.1) T0=4.0D0-B+2.0D0*Q*Q/B
4897           IF (KD.EQ.2) T0=1.0D0-B+Q
4898           IF (KD.EQ.3) T0=1.0D0-B-Q
4899           IF (KD.EQ.4) T0=4.0D0-B
4900           T2=-Q*Q/T0
4901           DO 15 J=J0,JF
490215            T2=-Q*Q/((2.0D0*J-L-L0)**2-B+T2)
4903        ENDIF
4904        F=(2.0D0*IC+L)**2+T1+T2-B
4905        RETURN
4906        END
4907
4908
4909
4910C       **********************************
4911
4912        SUBROUTINE CLPN(N,X,Y,CPN,CPD)
4913C
4914C       ==================================================
4915C       Purpose: Compute Legendre polynomials Pn(z) and
4916C                their derivatives Pn'(z) for a complex
4917C                argument
4918C       Input :  x --- Real part of z
4919C                y --- Imaginary part of z
4920C                n --- Degree of Pn(z), n = 0,1,2,...
4921C       Output:  CPN(n) --- Pn(z)
4922C                CPD(n) --- Pn'(z)
4923C       ==================================================
4924C
4925        IMPLICIT DOUBLE PRECISION (X,Y)
4926        IMPLICIT COMPLEX *16 (C,Z)
4927        DIMENSION CPN(0:N),CPD(0:N)
4928        Z = DCMPLX(X, Y)
4929        CPN(0)=(1.0D0,0.0D0)
4930        CPN(1)=Z
4931        CPD(0)=(0.0D0,0.0D0)
4932        CPD(1)=(1.0D0,0.0D0)
4933        CP0=(1.0D0,0.0D0)
4934        CP1=Z
4935        DO 10 K=2,N
4936           CPF=(2.0D0*K-1.0D0)/K*Z*CP1-(K-1.0D0)/K*CP0
4937           CPN(K)=CPF
4938           IF (DABS(X).EQ.1.0D0.AND.Y.EQ.0.0D0) THEN
4939              CPD(K)=0.5D0*X**(K+1)*K*(K+1.0D0)
4940           ELSE
4941              CPD(K)=K*(CP1-Z*CPF)/(1.0D0-Z*Z)
4942           ENDIF
4943           CP0=CP1
494410         CP1=CPF
4945        RETURN
4946        END
4947
4948C       **********************************
4949
4950        SUBROUTINE LQMNS(M,N,X,QM,QD)
4951C
4952C       ========================================================
4953C       Purpose: Compute associated Legendre functions Qmn(x)
4954C                and Qmn'(x) for a given order
4955C       Input :  x --- Argument of Qmn(x)
4956C                m --- Order of Qmn(x),  m = 0,1,2,...
4957C                n --- Degree of Qmn(x), n = 0,1,2,...
4958C       Output:  QM(n) --- Qmn(x)
4959C                QD(n) --- Qmn'(x)
4960C       ========================================================
4961C
4962        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
4963        DIMENSION QM(0:N),QD(0:N)
4964        DO 10 K=0,N
4965           QM(K)=0.0D0
496610         QD(K)=0.0D0
4967        IF (DABS(X).EQ.1.0D0) THEN
4968           DO 15 K=0,N
4969              QM(K)=1.0D+300
497015            QD(K)=1.0D+300
4971           RETURN
4972        ENDIF
4973        LS=1
4974        IF (DABS(X).GT.1.0D0) LS=-1
4975        XQ=DSQRT(LS*(1.0D0-X*X))
4976        Q0=0.5D0*DLOG(DABS((X+1.0)/(X-1.0)))
4977        Q00=Q0
4978        Q10=-1.0D0/XQ
4979        Q01=X*Q0-1.0D0
4980        Q11=-LS*XQ*(Q0+X/(1.0D0-X*X))
4981        QF0=Q00
4982        QF1=Q10
4983        QM0=0.0D0
4984        QM1=0.0D0
4985        DO 20 K=2,M
4986           QM0=-2.0D0*(K-1.0)/XQ*X*QF1-LS*(K-1.0)*(2.0-K)*QF0
4987           QF0=QF1
498820         QF1=QM0
4989        IF (M.EQ.0) QM0=Q00
4990        IF (M.EQ.1) QM0=Q10
4991        QM(0)=QM0
4992        IF (DABS(X).LT.1.0001D0) THEN
4993           IF (M.EQ.0.AND.N.GT.0) THEN
4994              QF0=Q00
4995              QF1=Q01
4996              DO 25 K=2,N
4997                 QF2=((2.0*K-1.0D0)*X*QF1-(K-1.0)*QF0)/K
4998                 QM(K)=QF2
4999                 QF0=QF1
500025               QF1=QF2
5001           ENDIF
5002           QG0=Q01
5003           QG1=Q11
5004           DO 30 K=2,M
5005              QM1=-2.0D0*(K-1.0)/XQ*X*QG1-LS*K*(3.0-K)*QG0
5006              QG0=QG1
500730            QG1=QM1
5008           IF (M.EQ.0) QM1=Q01
5009           IF (M.EQ.1) QM1=Q11
5010           QM(1)=QM1
5011           IF (M.EQ.1.AND.N.GT.1) THEN
5012              QH0=Q10
5013              QH1=Q11
5014              DO 35 K=2,N
5015                 QH2=((2.0*K-1.0D0)*X*QH1-K*QH0)/(K-1.0)
5016                 QM(K)=QH2
5017                 QH0=QH1
501835               QH1=QH2
5019           ELSE IF (M.GE.2) THEN
5020              QG0=Q00
5021              QG1=Q01
5022              QH0=Q10
5023              QH1=Q11
5024              QMK=0.0D0
5025              DO 45 L=2,N
5026                 Q0L=((2.0D0*L-1.0D0)*X*QG1-(L-1.0D0)*QG0)/L
5027                 Q1L=((2.0*L-1.0D0)*X*QH1-L*QH0)/(L-1.0D0)
5028                 QF0=Q0L
5029                 QF1=Q1L
5030                 DO 40 K=2,M
5031                    QMK=-2.0D0*(K-1.0)/XQ*X*QF1-LS*(K+L-1.0)*
5032     &                  (L+2.0-K)*QF0
5033                    QF0=QF1
503440                  QF1=QMK
5035                 QM(L)=QMK
5036                 QG0=QG1
5037                 QG1=Q0L
5038                 QH0=QH1
503945               QH1=Q1L
5040           ENDIF
5041        ELSE
5042           IF (DABS(X).GT.1.1) THEN
5043              KM=40+M+N
5044           ELSE
5045              KM=(40+M+N)*INT(-1.0-1.8*LOG(X-1.0))
5046           ENDIF
5047           QF2=0.0D0
5048           QF1=1.0D0
5049           DO 50 K=KM,0,-1
5050              QF0=((2.0*K+3.0D0)*X*QF1-(K+2.0-M)*QF2)/(K+M+1.0)
5051              IF (K.LE.N) QM(K)=QF0
5052              QF2=QF1
505350            QF1=QF0
5054           DO 55 K=0,N
505555            QM(K)=QM(K)*QM0/QF0
5056        ENDIF
5057        IF (DABS(X).LT.1.0D0) THEN
5058           DO 60 K=0,N
505960            QM(K)=(-1)**M*QM(K)
5060        ENDIF
5061        QD(0)=((1.0D0-M)*QM(1)-X*QM(0))/(X*X-1.0)
5062        DO 65 K=1,N
506365         QD(K)=(K*X*QM(K)-(K+M)*QM(K-1))/(X*X-1.0)
5064        RETURN
5065        END
5066
5067C       **********************************
5068
5069        SUBROUTINE CIKLV(V,Z,CBIV,CDIV,CBKV,CDKV)
5070C
5071C       =====================================================
5072C       Purpose: Compute modified Bessel functions Iv(z) and
5073C                Kv(z) and their derivatives with a complex
5074C                argument and a large order
5075C       Input:   v --- Order of Iv(z) and Kv(z)
5076C                z --- Complex argument
5077C       Output:  CBIV --- Iv(z)
5078C                CDIV --- Iv'(z)
5079C                CBKV --- Kv(z)
5080C                CDKV --- Kv'(z)
5081C       Routine called:
5082C                CJK to compute the expansion coefficients
5083C       ====================================================
5084C
5085        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
5086        IMPLICIT COMPLEX*16 (C,Z)
5087        DIMENSION CF(12),A(91)
5088        PI=3.141592653589793D0
5089        KM=12
5090        CALL CJK(KM,A)
5091        DO 30 L=1,0,-1
5092           V0=V-L
5093           CWS=CDSQRT(1.0D0+(Z/V0)*(Z/V0))
5094           CETA=CWS+CDLOG(Z/V0/(1.0D0+CWS))
5095           CT=1.0D0/CWS
5096           CT2=CT*CT
5097           DO 15 K=1,KM
5098              L0=K*(K+1)/2+1
5099              LF=L0+K
5100              CF(K)=A(LF)
5101              DO 10 I=LF-1,L0,-1
510210               CF(K)=CF(K)*CT2+A(I)
510315            CF(K)=CF(K)*CT**K
5104           VR=1.0D0/V0
5105           CSI=(1.0D0,0.0D0)
5106           DO 20 K=1,KM
510720            CSI=CSI+CF(K)*VR**K
5108           CBIV=CDSQRT(CT/(2.0D0*PI*V0))*CDEXP(V0*CETA)*CSI
5109           IF (L.EQ.1) CFI=CBIV
5110           CSK=(1.0D0,0.0D0)
5111           DO 25 K=1,KM
511225            CSK=CSK+(-1)**K*CF(K)*VR**K
5113           CBKV=CDSQRT(PI*CT/(2.0D0*V0))*CDEXP(-V0*CETA)*CSK
5114           IF (L.EQ.1) CFK=CBKV
511530      CONTINUE
5116        CDIV=CFI-V/Z*CBIV
5117        CDKV=-CFK-V/Z*CBKV
5118        RETURN
5119        END
5120
5121
5122
5123C       **********************************
5124
5125        SUBROUTINE ELIT(HK,PHI,FE,EE)
5126C
5127C       ==================================================
5128C       Purpose: Compute complete and incomplete elliptic
5129C                integrals F(k,phi) and E(k,phi)
5130C       Input  : HK  --- Modulus k ( 0 ≤ k ≤ 1 )
5131C                Phi --- Argument ( in degrees )
5132C       Output : FE  --- F(k,phi)
5133C                EE  --- E(k,phi)
5134C       ==================================================
5135C
5136        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
5137        G=0.0D0
5138        PI=3.14159265358979D0
5139        A0=1.0D0
5140        B0=DSQRT(1.0D0-HK*HK)
5141        D0=(PI/180.0D0)*PHI
5142        R=HK*HK
5143        IF (HK.EQ.1.0D0.AND.PHI.EQ.90.0D0) THEN
5144           FE=1.0D+300
5145           EE=1.0D0
5146        ELSE IF (HK.EQ.1.0D0) THEN
5147           FE=DLOG((1.0D0+DSIN(D0))/DCOS(D0))
5148           EE=DSIN(D0)
5149        ELSE
5150           FAC=1.0D0
5151           D=0.0D0
5152           DO 10 N=1,40
5153              A=(A0+B0)/2.0D0
5154              B=DSQRT(A0*B0)
5155              C=(A0-B0)/2.0D0
5156              FAC=2.0D0*FAC
5157              R=R+FAC*C*C
5158              IF (PHI.NE.90.0D0) THEN
5159                 D=D0+DATAN((B0/A0)*DTAN(D0))
5160                 G=G+C*DSIN(D)
5161                 D0=D+PI*INT(D/PI+.5D0)
5162              ENDIF
5163              A0=A
5164              B0=B
5165              IF (C.LT.1.0D-7) GO TO 15
516610         CONTINUE
516715         CK=PI/(2.0D0*A)
5168           CE=PI*(2.0D0-R)/(4.0D0*A)
5169           IF (PHI.EQ.90.0D0) THEN
5170              FE=CK
5171              EE=CE
5172           ELSE
5173              FE=D/(FAC*A)
5174              EE=FE*CE/CK+G
5175           ENDIF
5176        ENDIF
5177        RETURN
5178        END
5179
5180C       **********************************
5181
5182        SUBROUTINE ELIT3(PHI,HK,C,EL3)
5183C
5184C       =========================================================
5185C       Purpose: Compute the elliptic integral of the third kind
5186C                using Gauss-Legendre quadrature
5187C       Input :  Phi --- Argument ( in degrees )
5188C                 k  --- Modulus   ( 0 ≤ k ≤ 1.0 )
5189C                 c  --- Parameter ( 0 ≤ c ≤ 1.0 )
5190C       Output:  EL3 --- Value of the elliptic integral of the
5191C                        third kind
5192C       =========================================================
5193C
5194        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
5195        DIMENSION T(10),W(10)
5196        LOGICAL LB1,LB2
5197        DATA T/.9931285991850949D0,.9639719272779138D0,
5198     &         .9122344282513259D0,.8391169718222188D0,
5199     &         .7463319064601508D0,.6360536807265150D0,
5200     &         .5108670019508271D0,.3737060887154195D0,
5201     &         .2277858511416451D0,.7652652113349734D-1/
5202        DATA W/.1761400713915212D-1,.4060142980038694D-1,
5203     &         .6267204833410907D-1,.8327674157670475D-1,
5204     &         .1019301198172404D0,.1181945319615184D0,
5205     &         .1316886384491766D0,.1420961093183820D0,
5206     &         .1491729864726037D0,.1527533871307258D0/
5207        LB1=HK.EQ.1.0D0.AND.DABS(PHI-90.0).LE.1.0D-8
5208        LB2=C.EQ.1.0D0.AND.DABS(PHI-90.0).LE.1.0D-8
5209        IF (LB1.OR.LB2) THEN
5210            EL3=1.0D+300
5211            RETURN
5212        ENDIF
5213        C1=0.87266462599716D-2*PHI
5214        C2=C1
5215        EL3=0.0D0
5216        DO 10 I=1,10
5217           C0=C2*T(I)
5218           T1=C1+C0
5219           T2=C1-C0
5220           F1=1.0D0/((1.0D0-C*DSIN(T1)*DSIN(T1))*
5221     &              DSQRT(1.0D0-HK*HK*DSIN(T1)*DSIN(T1)))
5222           F2=1.0D0/((1.0D0-C*DSIN(T2)*DSIN(T2))*
5223     &              DSQRT(1.0D0-HK*HK*DSIN(T2)*DSIN(T2)))
522410         EL3=EL3+W(I)*(F1+F2)
5225        EL3=C1*EL3
5226        RETURN
5227        END
5228
5229C       **********************************
5230
5231        SUBROUTINE EIX(X,EI)
5232C
5233C       ============================================
5234C       Purpose: Compute exponential integral Ei(x)
5235C       Input :  x  --- Argument of Ei(x)
5236C       Output:  EI --- Ei(x)
5237C       ============================================
5238C
5239        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
5240        IF (X.EQ.0.0) THEN
5241           EI=-1.0D+300
5242        ELSE IF (X .LT. 0) THEN
5243           CALL E1XB(-X, EI)
5244           EI = -EI
5245        ELSE IF (DABS(X).LE.40.0) THEN
5246C          Power series around x=0
5247           EI=1.0D0
5248           R=1.0D0
5249           DO 15 K=1,100
5250              R=R*K*X/(K+1.0D0)**2
5251              EI=EI+R
5252              IF (DABS(R/EI).LE.1.0D-15) GO TO 20
525315         CONTINUE
525420         GA=0.5772156649015328D0
5255           EI=GA+DLOG(X)+X*EI
5256        ELSE
5257C          Asymptotic expansion (the series is not convergent)
5258           EI=1.0D0
5259           R=1.0D0
5260           DO 25 K=1,20
5261              R=R*K/X
526225            EI=EI+R
5263           EI=DEXP(X)/X*EI
5264        ENDIF
5265        RETURN
5266        END
5267
5268C       **********************************
5269
5270        SUBROUTINE EIXZ(Z,CEI)
5271C
5272C       ============================================
5273C       Purpose: Compute exponential integral Ei(x)
5274C       Input :  x  --- Complex argument of Ei(x)
5275C       Output:  EI --- Ei(x)
5276C       ============================================
5277C
5278        IMPLICIT NONE
5279        DOUBLE COMPLEX Z, CEI
5280        DOUBLE PRECISION PI
5281        PI=3.141592653589793D0
5282        CALL E1Z(-Z, CEI)
5283        CEI = -CEI
5284        IF (DIMAG(Z).GT.0) THEN
5285           CEI = CEI + (0d0,1d0)*PI
5286        ELSE IF (DIMAG(Z).LT.0) THEN
5287           CEI = CEI - (0d0,1d0)*PI
5288        ELSE IF (DIMAG(Z).EQ.0) THEN
5289           IF (DBLE(Z).GT.0) THEN
5290              CEI = CEI + (0d0,1d0)*DSIGN(PI,DIMAG(Z))
5291           ENDIF
5292        ENDIF
5293        RETURN
5294        END
5295
5296C       **********************************
5297
5298        SUBROUTINE E1XB(X,E1)
5299C
5300C       ============================================
5301C       Purpose: Compute exponential integral E1(x)
5302C       Input :  x  --- Argument of E1(x)
5303C       Output:  E1 --- E1(x)  ( x > 0 )
5304C       ============================================
5305C
5306        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
5307        IF (X.EQ.0.0) THEN
5308           E1=1.0D+300
5309        ELSE IF (X.LE.1.0) THEN
5310           E1=1.0D0
5311           R=1.0D0
5312           DO 10 K=1,25
5313              R=-R*K*X/(K+1.0D0)**2
5314              E1=E1+R
5315              IF (DABS(R).LE.DABS(E1)*1.0D-15) GO TO 15
531610         CONTINUE
531715         GA=0.5772156649015328D0
5318           E1=-GA-DLOG(X)+X*E1
5319        ELSE
5320           M=20+INT(80.0/X)
5321           T0=0.0D0
5322           DO 20 K=M,1,-1
5323              T0=K/(1.0D0+K/(X+T0))
532420         CONTINUE
5325           T=1.0D0/(X+T0)
5326           E1=DEXP(-X)*T
5327        ENDIF
5328        RETURN
5329        END
5330
5331C       **********************************
5332
5333        SUBROUTINE CHGM(A,B,X,HG)
5334C
5335C       ===================================================
5336C       Purpose: Compute confluent hypergeometric function
5337C                M(a,b,x)
5338C       Input  : a  --- Parameter
5339C                b  --- Parameter ( b <> 0,-1,-2,... )
5340C                x  --- Argument
5341C       Output:  HG --- M(a,b,x)
5342C       Routine called: CGAMA for computing complex ln[Г(x)]
5343C       ===================================================
5344C
5345        IMPLICIT DOUBLE PRECISION (A-B,D-H,O-Z)
5346        IMPLICIT COMPLEX*16 (C)
5347        PI=3.141592653589793D0
5348        A0=A
5349        A1=A
5350        X0=X
5351        HG=0.0D0
5352C       DLMF 13.2.39
5353        IF (X.LT.0.0D0) THEN
5354           A=B-A
5355           A0=A
5356           X=DABS(X)
5357        ENDIF
5358        NL=0
5359        LA=0
5360        IF (A.GE.2.0D0) THEN
5361C       preparing terms for DLMF 13.3.1
5362           NL=1
5363           LA=INT(A)
5364           A=A-LA-1.0D0
5365        ENDIF
5366        Y0=0.0D0
5367        Y1=0.0D0
5368        DO 30 N=0,NL
5369           IF (A0.GE.2.0D0) A=A+1.0D0
5370           IF (X.LE.30.0D0+DABS(B).OR.A.LT.0.0D0) THEN
5371              HG=1.0D0
5372              RG=1.0D0
5373              DO 15 J=1,500
5374                 RG=RG*(A+J-1.0D0)/(J*(B+J-1.0D0))*X
5375                 HG=HG+RG
5376                 IF (HG.NE.0D0.AND.DABS(RG/HG).LT.1.0D-15) THEN
5377C       DLMF 13.2.39 (cf. above)
5378                    IF (X0.LT.0.0D0) HG=HG*DEXP(X0)
5379                    GO TO 25
5380                 ENDIF
538115            CONTINUE
5382           ELSE
5383C       DLMF 13.7.2 & 13.2.4, SUM2 corresponds to first sum
5384              Y=0.0D0
5385              CALL CGAMA(A,Y,0,TAR,TAI)
5386              CTA = DCMPLX(TAR, TAI)
5387              Y=0.0D0
5388              CALL CGAMA(B,Y,0,TBR,TBI)
5389              CTB = DCMPLX(TBR, TBI)
5390              XG=B-A
5391              Y=0.0D0
5392              CALL CGAMA(XG,Y,0,TBAR,TBAI)
5393              CTBA = DCMPLX(TBAR, TBAI)
5394              SUM1=1.0D0
5395              SUM2=1.0D0
5396              R1=1.0D0
5397              R2=1.0D0
5398              DO 20 I=1,8
5399                 R1=-R1*(A+I-1.0D0)*(A-B+I)/(X*I)
5400                 R2=-R2*(B-A+I-1.0D0)*(A-I)/(X*I)
5401                 SUM1=SUM1+R1
540220               SUM2=SUM2+R2
5403              IF (X0.GE.0.0D0) THEN
5404                 HG1=DBLE(CDEXP(CTB-CTBA))*X**(-A)*DCOS(PI*A)*SUM1
5405                 HG2=DBLE(CDEXP(CTB-CTA+X))*X**(A-B)*SUM2
5406              ELSE
5407C       DLMF 13.2.39 (cf. above)
5408                 HG1=DBLE(CDEXP(CTB-CTBA+X0))*X**(-A)*DCOS(PI*A)*SUM1
5409                 HG2=DBLE(CDEXP(CTB-CTA))*X**(A-B)*SUM2
5410              ENDIF
5411              HG=HG1+HG2
5412           ENDIF
541325         IF (N.EQ.0) Y0=HG
5414           IF (N.EQ.1) Y1=HG
541530      CONTINUE
5416        IF (A0.GE.2.0D0) THEN
5417C       DLMF 13.3.1
5418           DO 35 I=1,LA-1
5419              HG=((2.0D0*A-B+X)*Y1+(B-A)*Y0)/A
5420              Y0=Y1
5421              Y1=HG
542235            A=A+1.0D0
5423        ENDIF
5424        A=A1
5425        X=X0
5426        RETURN
5427        END
5428
5429C       **********************************
5430
5431        SUBROUTINE HYGFX(A,B,C,X,HF,ISFER)
5432C
5433C       ====================================================
5434C       Purpose: Compute hypergeometric function F(a,b,c,x)
5435C       Input :  a --- Parameter
5436C                b --- Parameter
5437C                c --- Parameter, c <> 0,-1,-2,...
5438C                x --- Argument   ( x < 1 )
5439C       Output:  HF --- F(a,b,c,x)
5440C                ISFER --- Error flag
5441C       Routines called:
5442C            (1) GAMMA2 for computing gamma function
5443C            (2) PSI_SPEC for computing psi function
5444C       ====================================================
5445C
5446        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
5447        LOGICAL L0,L1,L2,L3,L4,L5
5448        PI=3.141592653589793D0
5449        EL=.5772156649015329D0
5450        ISFER=0
5451        L0=C.EQ.INT(C).AND.C.LT.0.0
5452        L1=1.0D0-X.LT.1.0D-15.AND.C-A-B.LE.0.0
5453        L2=A.EQ.INT(A).AND.A.LT.0.0
5454        L3=B.EQ.INT(B).AND.B.LT.0.0
5455        L4=C-A.EQ.INT(C-A).AND.C-A.LE.0.0
5456        L5=C-B.EQ.INT(C-B).AND.C-B.LE.0.0
5457        IF (L0.OR.L1) THEN
5458           ISFER=3
5459           RETURN
5460        ENDIF
5461        EPS=1.0D-15
5462        IF (X.GT.0.95) EPS=1.0D-8
5463        IF (X.EQ.0.0.OR.A.EQ.0.0.OR.B.EQ.0.0) THEN
5464           HF=1.0D0
5465           RETURN
5466        ELSE IF (1.0D0-X.EQ.EPS.AND.C-A-B.GT.0.0) THEN
5467           CALL GAMMA2(C,GC)
5468           CALL GAMMA2(C-A-B,GCAB)
5469           CALL GAMMA2(C-A,GCA)
5470           CALL GAMMA2(C-B,GCB)
5471           HF=GC*GCAB/(GCA*GCB)
5472           RETURN
5473        ELSE IF (1.0D0+X.LE.EPS.AND.DABS(C-A+B-1.0).LE.EPS) THEN
5474           G0=DSQRT(PI)*2.0D0**(-A)
5475           CALL GAMMA2(C,G1)
5476           CALL GAMMA2(1.0D0+A/2.0-B,G2)
5477           CALL GAMMA2(0.5D0+0.5*A,G3)
5478           HF=G0*G1/(G2*G3)
5479           RETURN
5480        ELSE IF (L2.OR.L3) THEN
5481           IF (L2) NM=INT(ABS(A))
5482           IF (L3) NM=INT(ABS(B))
5483           HF=1.0D0
5484           R=1.0D0
5485           DO 10 K=1,NM
5486              R=R*(A+K-1.0D0)*(B+K-1.0D0)/(K*(C+K-1.0D0))*X
548710            HF=HF+R
5488           RETURN
5489        ELSE IF (L4.OR.L5) THEN
5490           IF (L4) NM=INT(ABS(C-A))
5491           IF (L5) NM=INT(ABS(C-B))
5492           HF=1.0D0
5493           R=1.0D0
5494           DO 15 K=1,NM
5495              R=R*(C-A+K-1.0D0)*(C-B+K-1.0D0)/(K*(C+K-1.0D0))*X
549615            HF=HF+R
5497           HF=(1.0D0-X)**(C-A-B)*HF
5498           RETURN
5499        ENDIF
5500        AA=A
5501        BB=B
5502        X1=X
5503        IF (X.LT.0.0D0) THEN
5504           X=X/(X-1.0D0)
5505           IF (C.GT.A.AND.B.LT.A.AND.B.GT.0.0) THEN
5506              A=BB
5507              B=AA
5508           ENDIF
5509           B=C-B
5510        ENDIF
5511        HW=0.0D0
5512        IF (X.GE.0.75D0) THEN
5513           GM=0.0D0
5514           IF (DABS(C-A-B-INT(C-A-B)).LT.1.0D-15) THEN
5515              M=INT(C-A-B)
5516              CALL GAMMA2(A,GA)
5517              CALL GAMMA2(B,GB)
5518              CALL GAMMA2(C,GC)
5519              CALL GAMMA2(A+M,GAM)
5520              CALL GAMMA2(B+M,GBM)
5521              CALL PSI_SPEC(A,PA)
5522              CALL PSI_SPEC(B,PB)
5523              IF (M.NE.0) GM=1.0D0
5524              DO 30 J=1,ABS(M)-1
552530               GM=GM*J
5526              RM=1.0D0
5527              DO 35 J=1,ABS(M)
552835               RM=RM*J
5529              F0=1.0D0
5530              R0=1.0D0
5531              R1=1.0D0
5532              SP0=0.D0
5533              SP=0.0D0
5534              IF (M.GE.0) THEN
5535                 C0=GM*GC/(GAM*GBM)
5536                 C1=-GC*(X-1.0D0)**M/(GA*GB*RM)
5537                 DO 40 K=1,M-1
5538                    R0=R0*(A+K-1.0D0)*(B+K-1.0)/(K*(K-M))*(1.0-X)
553940                  F0=F0+R0
5540                 DO 45 K=1,M
554145                  SP0=SP0+1.0D0/(A+K-1.0)+1.0/(B+K-1.0)-1.0/K
5542                 F1=PA+PB+SP0+2.0D0*EL+DLOG(1.0D0-X)
5543                 DO 55 K=1,250
5544                    SP=SP+(1.0D0-A)/(K*(A+K-1.0))+(1.0-B)/(K*(B+K-1.0))
5545                    SM=0.0D0
5546                    DO 50 J=1,M
554750                     SM=SM+(1.0D0-A)/((J+K)*(A+J+K-1.0))+1.0/
5548     &                    (B+J+K-1.0)
5549                    RP=PA+PB+2.0D0*EL+SP+SM+DLOG(1.0D0-X)
5550                    R1=R1*(A+M+K-1.0D0)*(B+M+K-1.0)/(K*(M+K))*(1.0-X)
5551                    F1=F1+R1*RP
5552                    IF (DABS(F1-HW).LT.DABS(F1)*EPS) GO TO 60
555355                  HW=F1
555460               HF=F0*C0+F1*C1
5555              ELSE IF (M.LT.0) THEN
5556                 M=-M
5557                 C0=GM*GC/(GA*GB*(1.0D0-X)**M)
5558                 C1=-(-1)**M*GC/(GAM*GBM*RM)
5559                 DO 65 K=1,M-1
5560                    R0=R0*(A-M+K-1.0D0)*(B-M+K-1.0)/(K*(K-M))*(1.0-X)
556165                  F0=F0+R0
5562                 DO 70 K=1,M
556370                  SP0=SP0+1.0D0/K
5564                 F1=PA+PB-SP0+2.0D0*EL+DLOG(1.0D0-X)
5565                 DO 80 K=1,250
5566                    SP=SP+(1.0D0-A)/(K*(A+K-1.0))+(1.0-B)/(K*(B+K-1.0))
5567                    SM=0.0D0
5568                    DO 75 J=1,M
556975                     SM=SM+1.0D0/(J+K)
5570                    RP=PA+PB+2.0D0*EL+SP-SM+DLOG(1.0D0-X)
5571                    R1=R1*(A+K-1.0D0)*(B+K-1.0)/(K*(M+K))*(1.0-X)
5572                    F1=F1+R1*RP
5573                    IF (DABS(F1-HW).LT.DABS(F1)*EPS) GO TO 85
557480                  HW=F1
557585               HF=F0*C0+F1*C1
5576              ENDIF
5577           ELSE
5578              CALL GAMMA2(A,GA)
5579              CALL GAMMA2(B,GB)
5580              CALL GAMMA2(C,GC)
5581              CALL GAMMA2(C-A,GCA)
5582              CALL GAMMA2(C-B,GCB)
5583              CALL GAMMA2(C-A-B,GCAB)
5584              CALL GAMMA2(A+B-C,GABC)
5585              C0=GC*GCAB/(GCA*GCB)
5586              C1=GC*GABC/(GA*GB)*(1.0D0-X)**(C-A-B)
5587              HF=0.0D0
5588              R0=C0
5589              R1=C1
5590              DO 90 K=1,250
5591                 R0=R0*(A+K-1.0D0)*(B+K-1.0)/(K*(A+B-C+K))*(1.0-X)
5592                 R1=R1*(C-A+K-1.0D0)*(C-B+K-1.0)/(K*(C-A-B+K))
5593     &              *(1.0-X)
5594                 HF=HF+R0+R1
5595                 IF (DABS(HF-HW).LT.DABS(HF)*EPS) GO TO 95
559690               HW=HF
559795            HF=HF+C0+C1
5598           ENDIF
5599        ELSE
5600           A0=1.0D0
5601           IF (C.GT.A.AND.C.LT.2.0D0*A.AND.
5602     &         C.GT.B.AND.C.LT.2.0D0*B) THEN
5603              A0=(1.0D0-X)**(C-A-B)
5604              A=C-A
5605              B=C-B
5606           ENDIF
5607           HF=1.0D0
5608           R=1.0D0
5609           DO 100 K=1,250
5610              R=R*(A+K-1.0D0)*(B+K-1.0D0)/(K*(C+K-1.0D0))*X
5611              HF=HF+R
5612              IF (DABS(HF-HW).LE.DABS(HF)*EPS) GO TO 105
5613100           HW=HF
5614105        HF=A0*HF
5615        ENDIF
5616        IF (X1.LT.0.0D0) THEN
5617           X=X1
5618           C0=1.0D0/(1.0D0-X)**AA
5619           HF=C0*HF
5620        ENDIF
5621        A=AA
5622        B=BB
5623        IF (K.GT.120) ISFER=5
5624        RETURN
5625        END
5626
5627
5628
5629C       **********************************
5630
5631        SUBROUTINE CCHG(A,B,Z,CHG)
5632C
5633C       ===================================================
5634C       Purpose: Compute confluent hypergeometric function
5635C                M(a,b,z) with real parameters a, b and a
5636C                complex argument z
5637C       Input :  a --- Parameter
5638C                b --- Parameter
5639C                z --- Complex argument
5640C       Output:  CHG --- M(a,b,z)
5641C       Routine called: CGAMA for computing complex ln[Г(x)]
5642C       ===================================================
5643C
5644        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
5645        IMPLICIT COMPLEX *16 (C,Z)
5646        PI=3.141592653589793D0
5647        CI=(0.0D0,1.0D0)
5648        A0=A
5649        A1=A
5650        Z0=Z
5651        IF (B.EQ.0.0.OR.B.EQ.-INT(ABS(B))) THEN
5652           CHG=(1.0D+300,0.0D0)
5653        ELSE IF (A.EQ.0.0D0.OR.Z.EQ.0.0D0) THEN
5654           CHG=(1.0D0,0.0D0)
5655        ELSE IF (A.EQ.-1.0D0) THEN
5656           CHG=1.0D0-Z/B
5657        ELSE IF (A.EQ.B) THEN
5658           CHG=CDEXP(Z)
5659        ELSE IF (A-B.EQ.1.0D0) THEN
5660           CHG=(1.0D0+Z/B)*CDEXP(Z)
5661        ELSE IF (A.EQ.1.0D0.AND.B.EQ.2.0D0) THEN
5662           CHG=(CDEXP(Z)-1.0D0)/Z
5663        ELSE IF (A.EQ.INT(A).AND.A.LT.0.0D0) THEN
5664           M=INT(-A)
5665           CR=(1.0D0,0.0D0)
5666           CHG=(1.0D0,0.0D0)
5667           DO 10 K=1,M
5668              CR=CR*(A+K-1.0D0)/K/(B+K-1.0D0)*Z
566910            CHG=CHG+CR
5670        ELSE
5671           X0=DBLE(Z)
5672           IF (X0.LT.0.0D0) THEN
5673              A=B-A
5674              A0=A
5675              Z=-Z
5676           ENDIF
5677           NL=0
5678           LA=0
5679           IF (A.GE.2.0D0) THEN
5680              NL=1
5681              LA=INT(A)
5682              A=A-LA-1.0D0
5683           ENDIF
5684           NS=0
5685           DO 30 N=0,NL
5686              IF (A0.GE.2.0D0) A=A+1.0D0
5687              IF (CDABS(Z).LT.20.0D0+ABS(B).OR.A.LT.0.0D0) THEN
5688                 CHG=(1.0D0,0.0D0)
5689                 CRG=(1.0D0,0.0D0)
5690                 DO 15 J=1,500
5691                    CRG=CRG*(A+J-1.0D0)/(J*(B+J-1.0D0))*Z
5692                    CHG=CHG+CRG
5693                    IF (CDABS((CHG-CHW)/CHG).LT.1.D-15) GO TO 25
5694                    CHW=CHG
569515               CONTINUE
5696              ELSE
5697                 Y=0.0D0
5698                 CALL CGAMA(A,Y,0,G1R,G1I)
5699                 CG1 = DCMPLX(G1R, G1I)
5700                 Y=0.0D0
5701                 CALL CGAMA(B,Y,0,G2R,G2I)
5702                 CG2 = DCMPLX(G2R,G2I)
5703                 BA=B-A
5704                 Y=0.0D0
5705                 CALL CGAMA(BA,Y,0,G3R,G3I)
5706                 CG3 = DCMPLX(G3R, G3I)
5707                 CS1=(1.0D0,0.0D0)
5708                 CS2=(1.0D0,0.0D0)
5709                 CR1=(1.0D0,0.0D0)
5710                 CR2=(1.0D0,0.0D0)
5711                 DO 20 I=1,8
5712                    CR1=-CR1*(A+I-1.0D0)*(A-B+I)/(Z*I)
5713                    CR2=CR2*(B-A+I-1.0D0)*(I-A)/(Z*I)
5714                    CS1=CS1+CR1
571520                  CS2=CS2+CR2
5716                 X=DBLE(Z)
5717                 Y=DIMAG(Z)
5718                 IF (X.EQ.0.0.AND.Y.GE.0.0) THEN
5719                    PHI=0.5D0*PI
5720                 ELSE IF (X.EQ.0.0.AND.Y.LE.0.0) THEN
5721                    PHI=-0.5D0*PI
5722                 ELSE
5723                    PHI=DATAN(Y/X)
5724                 ENDIF
5725                 IF (PHI.GT.-0.5*PI.AND.PHI.LT.1.5*PI) NS=1
5726                 IF (PHI.GT.-1.5*PI.AND.PHI.LE.-0.5*PI) NS=-1
5727                 CFAC=CDEXP(NS*CI*PI*A)
5728                 IF (Y.EQ.0.0D0) CFAC=DCOS(PI*A)
5729                 CHG1=CDEXP(CG2-CG3)*Z**(-A)*CFAC*CS1
5730                 CHG2=CDEXP(CG2-CG1+Z)*Z**(A-B)*CS2
5731                 CHG=CHG1+CHG2
5732              ENDIF
573325            IF (N.EQ.0) CY0=CHG
5734              IF (N.EQ.1) CY1=CHG
573530         CONTINUE
5736           IF (A0.GE.2.0D0) THEN
5737              DO 35 I=1,LA-1
5738                 CHG=((2.0D0*A-B+Z)*CY1+(B-A)*CY0)/A
5739                 CY0=CY1
5740                 CY1=CHG
574135               A=A+1.0D0
5742           ENDIF
5743           IF (X0.LT.0.0D0) CHG=CHG*CDEXP(-Z)
5744        ENDIF
5745        A=A1
5746        Z=Z0
5747        RETURN
5748        END
5749
5750
5751
5752C       **********************************
5753
5754        SUBROUTINE HYGFZ(A,B,C,Z,ZHF,ISFER)
5755C
5756C       ======================================================
5757C       Purpose: Compute the hypergeometric function for a
5758C                complex argument, F(a,b,c,z)
5759C       Input :  a --- Parameter
5760C                b --- Parameter
5761C                c --- Parameter,  c <> 0,-1,-2,...
5762C                z --- Complex argument
5763C       Output:  ZHF --- F(a,b,c,z)
5764C                ISFER --- Error flag
5765C       Routines called:
5766C            (1) GAMMA2 for computing gamma function
5767C            (2) PSI_SPEC for computing psi function
5768C       ======================================================
5769C
5770        IMPLICIT DOUBLE PRECISION (A-H,O-Y)
5771        IMPLICIT COMPLEX *16 (Z)
5772        LOGICAL L0,L1,L2,L3,L4,L5,L6
5773        X=DBLE(Z)
5774        Y=DIMAG(Z)
5775        EPS=1.0D-15
5776        ISFER=0
5777        L0=C.EQ.INT(C).AND.C.LT.0.0D0
5778        L1=DABS(1.0D0-X).LT.EPS.AND.Y.EQ.0.0D0.AND.C-A-B.LE.0.0D0
5779        L2=CDABS(Z+1.0D0).LT.EPS.AND.DABS(C-A+B-1.0D0).LT.EPS
5780        L3=A.EQ.INT(A).AND.A.LT.0.0D0
5781        L4=B.EQ.INT(B).AND.B.LT.0.0D0
5782        L5=C-A.EQ.INT(C-A).AND.C-A.LE.0.0D0
5783        L6=C-B.EQ.INT(C-B).AND.C-B.LE.0.0D0
5784        AA=A
5785        BB=B
5786        A0=CDABS(Z)
5787        IF (A0.GT.0.95D0) EPS=1.0D-8
5788        PI=3.141592653589793D0
5789        EL=.5772156649015329D0
5790        IF (L0.OR.L1) THEN
5791           ISFER=3
5792           RETURN
5793        ENDIF
5794        NM=0
5795        IF (A0.EQ.0.0D0.OR.A.EQ.0.0D0.OR.B.EQ.0.0D0) THEN
5796           ZHF=(1.0D0,0.0D0)
5797        ELSE IF (Z.EQ.1.0D0.AND.C-A-B.GT.0.0D0) THEN
5798           CALL GAMMA2(C,GC)
5799           CALL GAMMA2(C-A-B,GCAB)
5800           CALL GAMMA2(C-A,GCA)
5801           CALL GAMMA2(C-B,GCB)
5802           ZHF=GC*GCAB/(GCA*GCB)
5803        ELSE IF (L2) THEN
5804           G0=DSQRT(PI)*2.0D0**(-A)
5805           CALL GAMMA2(C,G1)
5806           CALL GAMMA2(1.0D0+A/2.0D0-B,G2)
5807           CALL GAMMA2(0.5D0+0.5D0*A,G3)
5808           ZHF=G0*G1/(G2*G3)
5809        ELSE IF (L3.OR.L4) THEN
5810           IF (L3) NM=INT(ABS(A))
5811           IF (L4) NM=INT(ABS(B))
5812           ZHF=(1.0D0,0.0D0)
5813           ZR=(1.0D0,0.0D0)
5814           DO 10 K=1,NM
5815              ZR=ZR*(A+K-1.0D0)*(B+K-1.0D0)/(K*(C+K-1.0D0))*Z
581610            ZHF=ZHF+ZR
5817        ELSE IF (L5.OR.L6) THEN
5818           IF (L5) NM=INT(ABS(C-A))
5819           IF (L6) NM=INT(ABS(C-B))
5820           ZHF=(1.0D0,0.0D0)
5821           ZR=(1.0D0,0.0D0)
5822           DO 15 K=1,NM
5823              ZR=ZR*(C-A+K-1.0D0)*(C-B+K-1.0D0)/(K*(C+K-1.0D0))*Z
582415            ZHF=ZHF+ZR
5825           ZHF=(1.0D0-Z)**(C-A-B)*ZHF
5826        ELSE IF (A0.LE.1.0D0) THEN
5827           IF (X.LT.0.0D0) THEN
5828              Z1=Z/(Z-1.0D0)
5829              IF (C.GT.A.AND.B.LT.A.AND.B.GT.0.0) THEN
5830                 A=BB
5831                 B=AA
5832              ENDIF
5833              ZC0=1.0D0/((1.0D0-Z)**A)
5834              ZHF=(1.0D0,0.0D0)
5835              ZR0=(1.0D0,0.0D0)
5836              DO 20 K=1,500
5837                 ZR0=ZR0*(A+K-1.0D0)*(C-B+K-1.0D0)/(K*(C+K-1.0D0))*Z1
5838                 ZHF=ZHF+ZR0
5839                 IF (CDABS(ZHF-ZW).LT.CDABS(ZHF)*EPS) GO TO 25
584020               ZW=ZHF
584125            ZHF=ZC0*ZHF
5842           ELSE IF (A0.GE.0.90D0) THEN
5843              GM=0.0D0
5844              MCAB=INT(C-A-B+EPS*DSIGN(1.0D0,C-A-B))
5845              IF (DABS(C-A-B-MCAB).LT.EPS) THEN
5846                 M=INT(C-A-B)
5847                 CALL GAMMA2(A,GA)
5848                 CALL GAMMA2(B,GB)
5849                 CALL GAMMA2(C,GC)
5850                 CALL GAMMA2(A+M,GAM)
5851                 CALL GAMMA2(B+M,GBM)
5852                 CALL PSI_SPEC(A,PA)
5853                 CALL PSI_SPEC(B,PB)
5854                 IF (M.NE.0) GM=1.0D0
5855                 DO 30 J=1,ABS(M)-1
585630                  GM=GM*J
5857                 RM=1.0D0
5858                 DO 35 J=1,ABS(M)
585935                  RM=RM*J
5860                 ZF0=(1.0D0,0.0D0)
5861                 ZR0=(1.0D0,0.0D0)
5862                 ZR1=(1.0D0,0.0D0)
5863                 SP0=0.D0
5864                 SP=0.0D0
5865                 IF (M.GE.0) THEN
5866                    ZC0=GM*GC/(GAM*GBM)
5867                    ZC1=-GC*(Z-1.0D0)**M/(GA*GB*RM)
5868                    DO 40 K=1,M-1
5869                       ZR0=ZR0*(A+K-1.D0)*(B+K-1.D0)/(K*(K-M))*(1.D0-Z)
587040                     ZF0=ZF0+ZR0
5871                    DO 45 K=1,M
587245                     SP0=SP0+1.0D0/(A+K-1.0D0)+1.0/(B+K-1.0D0)-1.D0/K
5873                    ZF1=PA+PB+SP0+2.0D0*EL+CDLOG(1.0D0-Z)
5874                    DO 55 K=1,500
5875                       SP=SP+(1.0D0-A)/(K*(A+K-1.0D0))+(1.0D0-B)/
5876     &                    (K*(B+K-1.0D0))
5877                       SM=0.0D0
5878                       DO 50 J=1,M
5879                          SM=SM+(1.0D0-A)/((J+K)*(A+J+K-1.0D0))
5880     &                       +1.0D0/(B+J+K-1.0D0)
588150                     CONTINUE
5882                       ZP=PA+PB+2.0D0*EL+SP+SM+CDLOG(1.0D0-Z)
5883                       ZR1=ZR1*(A+M+K-1.0D0)*(B+M+K-1.0D0)/(K*(M+K))
5884     &                     *(1.0D0-Z)
5885                       ZF1=ZF1+ZR1*ZP
5886                       IF (CDABS(ZF1-ZW).LT.CDABS(ZF1)*EPS) GO TO 60
588755                     ZW=ZF1
588860                  ZHF=ZF0*ZC0+ZF1*ZC1
5889                 ELSE IF (M.LT.0) THEN
5890                    M=-M
5891                    ZC0=GM*GC/(GA*GB*(1.0D0-Z)**M)
5892                    ZC1=-(-1)**M*GC/(GAM*GBM*RM)
5893                    DO 65 K=1,M-1
5894                       ZR0=ZR0*(A-M+K-1.0D0)*(B-M+K-1.0D0)/(K*(K-M))
5895     &                     *(1.0D0-Z)
589665                     ZF0=ZF0+ZR0
5897                    DO 70 K=1,M
589870                     SP0=SP0+1.0D0/K
5899                    ZF1=PA+PB-SP0+2.0D0*EL+CDLOG(1.0D0-Z)
5900                    DO 80 K=1,500
5901                       SP=SP+(1.0D0-A)/(K*(A+K-1.0D0))+(1.0D0-B)/(K*
5902     &                    (B+K-1.0D0))
5903                       SM=0.0D0
5904                       DO 75 J=1,M
590575                        SM=SM+1.0D0/(J+K)
5906                       ZP=PA+PB+2.0D0*EL+SP-SM+CDLOG(1.0D0-Z)
5907                       ZR1=ZR1*(A+K-1.D0)*(B+K-1.D0)/(K*(M+K))*(1.D0-Z)
5908                       ZF1=ZF1+ZR1*ZP
5909                       IF (CDABS(ZF1-ZW).LT.CDABS(ZF1)*EPS) GO TO 85
591080                     ZW=ZF1
591185                  ZHF=ZF0*ZC0+ZF1*ZC1
5912                 ENDIF
5913              ELSE
5914                 CALL GAMMA2(A,GA)
5915                 CALL GAMMA2(B,GB)
5916                 CALL GAMMA2(C,GC)
5917                 CALL GAMMA2(C-A,GCA)
5918                 CALL GAMMA2(C-B,GCB)
5919                 CALL GAMMA2(C-A-B,GCAB)
5920                 CALL GAMMA2(A+B-C,GABC)
5921                 ZC0=GC*GCAB/(GCA*GCB)
5922                 ZC1=GC*GABC/(GA*GB)*(1.0D0-Z)**(C-A-B)
5923                 ZHF=(0.0D0,0.0D0)
5924                 ZR0=ZC0
5925                 ZR1=ZC1
5926                 DO 90 K=1,500
5927                    ZR0=ZR0*(A+K-1.D0)*(B+K-1.D0)/(K*(A+B-C+K))*(1.D0-Z)
5928                    ZR1=ZR1*(C-A+K-1.0D0)*(C-B+K-1.0D0)/(K*(C-A-B+K))
5929     &                  *(1.0D0-Z)
5930                    ZHF=ZHF+ZR0+ZR1
5931                    IF (CDABS(ZHF-ZW).LT.CDABS(ZHF)*EPS) GO TO 95
593290                  ZW=ZHF
593395               ZHF=ZHF+ZC0+ZC1
5934              ENDIF
5935           ELSE
5936              Z00=(1.0D0,0.0D0)
5937              IF (C-A.LT.A.AND.C-B.LT.B) THEN
5938                  Z00=(1.0D0-Z)**(C-A-B)
5939                  A=C-A
5940                  B=C-B
5941              ENDIF
5942              ZHF=(1.0D0,0.D0)
5943              ZR=(1.0D0,0.0D0)
5944              DO 100 K=1,1500
5945                 ZR=ZR*(A+K-1.0D0)*(B+K-1.0D0)/(K*(C+K-1.0D0))*Z
5946                 ZHF=ZHF+ZR
5947                 IF (CDABS(ZHF-ZW).LE.CDABS(ZHF)*EPS) GO TO 105
5948100              ZW=ZHF
5949105           ZHF=Z00*ZHF
5950           ENDIF
5951        ELSE IF (A0.GT.1.0D0) THEN
5952           MAB=INT(A-B+EPS*DSIGN(1.0D0,A-B))
5953           IF (DABS(A-B-MAB).LT.EPS.AND.A0.LE.1.1D0) B=B+EPS
5954           IF (DABS(A-B-MAB).GT.EPS) THEN
5955              CALL GAMMA2(A,GA)
5956              CALL GAMMA2(B,GB)
5957              CALL GAMMA2(C,GC)
5958              CALL GAMMA2(A-B,GAB)
5959              CALL GAMMA2(B-A,GBA)
5960              CALL GAMMA2(C-A,GCA)
5961              CALL GAMMA2(C-B,GCB)
5962              ZC0=GC*GBA/(GCA*GB*(-Z)**A)
5963              ZC1=GC*GAB/(GCB*GA*(-Z)**B)
5964              ZR0=ZC0
5965              ZR1=ZC1
5966              ZHF=(0.0D0,0.0D0)
5967              DO 110 K=1,500
5968                 ZR0=ZR0*(A+K-1.0D0)*(A-C+K)/((A-B+K)*K*Z)
5969                 ZR1=ZR1*(B+K-1.0D0)*(B-C+K)/((B-A+K)*K*Z)
5970                 ZHF=ZHF+ZR0+ZR1
5971                 IF (CDABS((ZHF-ZW)/ZHF).LE.EPS) GO TO 115
5972110              ZW=ZHF
5973115           ZHF=ZHF+ZC0+ZC1
5974           ELSE
5975              IF (A-B.LT.0.0D0) THEN
5976                 A=BB
5977                 B=AA
5978              ENDIF
5979              CA=C-A
5980              CB=C-B
5981              NCA=INT(CA+EPS*DSIGN(1.0D0,CA))
5982              NCB=INT(CB+EPS*DSIGN(1.0D0,CB))
5983              IF (DABS(CA-NCA).LT.EPS.OR.DABS(CB-NCB).LT.EPS) C=C+EPS
5984              CALL GAMMA2(A,GA)
5985              CALL GAMMA2(C,GC)
5986              CALL GAMMA2(C-B,GCB)
5987              CALL PSI_SPEC(A,PA)
5988              CALL PSI_SPEC(C-A,PCA)
5989              CALL PSI_SPEC(A-C,PAC)
5990              MAB=INT(A-B+EPS)
5991              ZC0=GC/(GA*(-Z)**B)
5992              CALL GAMMA2(A-B,GM)
5993              ZF0=GM/GCB*ZC0
5994              ZR=ZC0
5995              DO 120 K=1,MAB-1
5996                 ZR=ZR*(B+K-1.0D0)/(K*Z)
5997                 T0=A-B-K
5998                 CALL GAMMA2(T0,G0)
5999                 CALL GAMMA2(C-B-K,GCBK)
6000120              ZF0=ZF0+ZR*G0/GCBK
6001              IF (MAB.EQ.0) ZF0=(0.0D0,0.0D0)
6002              ZC1=GC/(GA*GCB*(-Z)**A)
6003              SP=-2.0D0*EL-PA-PCA
6004              DO 125 J=1,MAB
6005125              SP=SP+1.0D0/J
6006              ZP0=SP+CDLOG(-Z)
6007              SQ=1.0D0
6008              DO 130 J=1,MAB
6009130              SQ=SQ*(B+J-1.0D0)*(B-C+J)/J
6010              ZF1=(SQ*ZP0)*ZC1
6011              ZR=ZC1
6012              RK1=1.0D0
6013              SJ1=0.0D0
6014              W0=0.0D0
6015              DO 145 K=1,10000
6016                 ZR=ZR/Z
6017                 RK1=RK1*(B+K-1.0D0)*(B-C+K)/(K*K)
6018                 RK2=RK1
6019                 DO 135 J=K+1,K+MAB
6020135                 RK2=RK2*(B+J-1.0D0)*(B-C+J)/J
6021                 SJ1=SJ1+(A-1.0D0)/(K*(A+K-1.0D0))+(A-C-1.0D0)/
6022     &               (K*(A-C+K-1.0D0))
6023                 SJ2=SJ1
6024                 DO 140 J=K+1,K+MAB
6025140                 SJ2=SJ2+1.0D0/J
6026                 ZP=-2.0D0*EL-PA-PAC+SJ2-1.0D0/(K+A-C)
6027     &              -PI/DTAN(PI*(K+A-C))+CDLOG(-Z)
6028                 ZF1=ZF1+RK2*ZR*ZP
6029                 WS=CDABS(ZF1)
6030                 IF (DABS((WS-W0)/WS).LT.EPS) GO TO 150
6031145              W0=WS
6032150           ZHF=ZF0+ZF1
6033           ENDIF
6034        ENDIF
6035        A=AA
6036        B=BB
6037        IF (K.GT.150) ISFER=5
6038        RETURN
6039        END
6040
6041
6042
6043C       **********************************
6044
6045        SUBROUTINE ITAIRY(X,APT,BPT,ANT,BNT)
6046C
6047C       ======================================================
6048C       Purpose: Compute the integrals of Airy fnctions with
6049C                respect to t from 0 and x ( x ≥ 0 )
6050C       Input  : x   --- Upper limit of the integral
6051C       Output : APT --- Integration of Ai(t) from 0 and x
6052C                BPT --- Integration of Bi(t) from 0 and x
6053C                ANT --- Integration of Ai(-t) from 0 and x
6054C                BNT --- Integration of Bi(-t) from 0 and x
6055C       ======================================================
6056C
6057        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
6058        DIMENSION A(16)
6059        EPS=1.0D-15
6060        PI=3.141592653589793D0
6061        C1=.355028053887817D0
6062        C2=.258819403792807D0
6063        SR3=1.732050807568877D0
6064        IF (X.EQ.0.0D0) THEN
6065           APT=0.0D0
6066           BPT=0.0D0
6067           ANT=0.0D0
6068           BNT=0.0D0
6069        ELSE
6070           IF (DABS(X).LE.9.25D0) THEN
6071              DO 30 L=0,1
6072                 X=(-1)**L*X
6073                 FX=X
6074                 R=X
6075                 DO 10 K=1,40
6076                    R=R*(3.0*K-2.0D0)/(3.0*K+1.0D0)*X/(3.0*K)
6077     &                *X/(3.0*K-1.0D0)*X
6078                    FX=FX+R
6079                    IF (DABS(R).LT.DABS(FX)*EPS) GO TO 15
608010               CONTINUE
608115               GX=.5D0*X*X
6082                 R=GX
6083                 DO 20 K=1,40
6084                    R=R*(3.0*K-1.0D0)/(3.0*K+2.0D0)*X/(3.0*K)
6085     &                *X/(3.0*K+1.0D0)*X
6086                    GX=GX+R
6087                    IF (DABS(R).LT.DABS(GX)*EPS) GO TO 25
608820               CONTINUE
608925               ANT=C1*FX-C2*GX
6090                 BNT=SR3*(C1*FX+C2*GX)
6091                 IF (L.EQ.0) THEN
6092                    APT=ANT
6093                    BPT=BNT
6094                 ELSE
6095                    ANT=-ANT
6096                    BNT=-BNT
6097                    X=-X
6098                 ENDIF
609930            CONTINUE
6100           ELSE
6101              DATA A/.569444444444444D0,.891300154320988D0,
6102     &             .226624344493027D+01,.798950124766861D+01,
6103     &             .360688546785343D+02,.198670292131169D+03,
6104     &             .129223456582211D+04,.969483869669600D+04,
6105     &             .824184704952483D+05,.783031092490225D+06,
6106     &             .822210493622814D+07,.945557399360556D+08,
6107     &             .118195595640730D+10,.159564653040121D+11,
6108     &             .231369166433050D+12,.358622522796969D+13/
6109              Q2=1.414213562373095D0
6110              Q0=.3333333333333333D0
6111              Q1=.6666666666666667D0
6112              XE=X*DSQRT(X)/1.5D0
6113              XP6=1.0D0/DSQRT(6.0D0*PI*XE)
6114              SU1=1.0D0
6115              R=1.0D0
6116              XR1=1.0D0/XE
6117              DO 35 K=1,16
6118                 R=-R*XR1
611935               SU1=SU1+A(K)*R
6120              SU2=1.0D0
6121              R=1.0D0
6122              DO 40 K=1,16
6123                 R=R*XR1
612440               SU2=SU2+A(K)*R
6125              APT=Q0-DEXP(-XE)*XP6*SU1
6126              BPT=2.0D0*DEXP(XE)*XP6*SU2
6127              SU3=1.0D0
6128              R=1.0D0
6129              XR2=1.0D0/(XE*XE)
6130              DO 45 K=1,8
6131                 R=-R*XR2
613245               SU3=SU3+A(2*K)*R
6133              SU4=A(1)*XR1
6134              R=XR1
6135              DO 50 K=1,7
6136                 R=-R*XR2
613750               SU4=SU4+A(2*K+1)*R
6138              SU5=SU3+SU4
6139              SU6=SU3-SU4
6140              ANT=Q1-Q2*XP6*(SU5*DCOS(XE)-SU6*DSIN(XE))
6141              BNT=Q2*XP6*(SU5*DSIN(XE)+SU6*DCOS(XE))
6142           ENDIF
6143        ENDIF
6144        RETURN
6145        END
6146
6147C       **********************************
6148
6149        SUBROUTINE IKNA(N,X,NM,BI,DI,BK,DK)
6150C
6151C       ========================================================
6152C       Purpose: Compute modified Bessel functions In(x) and
6153C                Kn(x), and their derivatives
6154C       Input:   x --- Argument of In(x) and Kn(x) ( x ≥ 0 )
6155C                n --- Order of In(x) and Kn(x)
6156C       Output:  BI(n) --- In(x)
6157C                DI(n) --- In'(x)
6158C                BK(n) --- Kn(x)
6159C                DK(n) --- Kn'(x)
6160C                NM --- Highest order computed
6161C       Routines called:
6162C            (1) IK01A for computing I0(x),I1(x),K0(x) & K1(x)
6163C            (2) MSTA1 and MSTA2 for computing the starting
6164C                point for backward recurrence
6165C       ========================================================
6166C
6167        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
6168        DIMENSION BI(0:N),DI(0:N),BK(0:N),DK(0:N)
6169        NM=N
6170        IF (X.LE.1.0D-100) THEN
6171           DO 10 K=0,N
6172              BI(K)=0.0D0
6173              DI(K)=0.0D0
6174              BK(K)=1.0D+300
617510            DK(K)=-1.0D+300
6176           BI(0)=1.0D0
6177           DI(1)=0.5D0
6178           RETURN
6179        ENDIF
6180        CALL IK01A(X,BI0,DI0,BI1,DI1,BK0,DK0,BK1,DK1)
6181        BI(0)=BI0
6182        BI(1)=BI1
6183        BK(0)=BK0
6184        BK(1)=BK1
6185        DI(0)=DI0
6186        DI(1)=DI1
6187        DK(0)=DK0
6188        DK(1)=DK1
6189        IF (N.LE.1) RETURN
6190        IF (X.GT.40.0.AND.N.LT.INT(0.25*X)) THEN
6191           H0=BI0
6192           H1=BI1
6193           DO 15 K=2,N
6194           H=-2.0D0*(K-1.0D0)/X*H1+H0
6195           BI(K)=H
6196           H0=H1
619715         H1=H
6198        ELSE
6199           M=MSTA1(X,200)
6200           IF (M.LT.N) THEN
6201              NM=M
6202           ELSE
6203              M=MSTA2(X,N,15)
6204           ENDIF
6205           F0=0.0D0
6206           F1=1.0D-100
6207           F=0.0D0
6208           DO 20 K=M,0,-1
6209              F=2.0D0*(K+1.0D0)*F1/X+F0
6210              IF (K.LE.NM) BI(K)=F
6211              F0=F1
621220            F1=F
6213           S0=BI0/F
6214           DO 25 K=0,NM
621525            BI(K)=S0*BI(K)
6216        ENDIF
6217        G0=BK0
6218        G1=BK1
6219        DO 30 K=2,NM
6220           G=2.0D0*(K-1.0D0)/X*G1+G0
6221           BK(K)=G
6222           G0=G1
622330         G1=G
6224        DO 40 K=2,NM
6225           DI(K)=BI(K-1)-K/X*BI(K)
622640         DK(K)=-BK(K-1)-K/X*BK(K)
6227        RETURN
6228        END
6229
6230
6231
6232C       **********************************
6233
6234        SUBROUTINE CJYNB(N,Z,NM,CBJ,CDJ,CBY,CDY)
6235C
6236C       =======================================================
6237C       Purpose: Compute Bessel functions Jn(z), Yn(z) and
6238C                their derivatives for a complex argument
6239C       Input :  z --- Complex argument of Jn(z) and Yn(z)
6240C                n --- Order of Jn(z) and Yn(z)
6241C       Output:  CBJ(n) --- Jn(z)
6242C                CDJ(n) --- Jn'(z)
6243C                CBY(n) --- Yn(z)
6244C                CDY(n) --- Yn'(z)
6245C                NM --- Highest order computed
6246C       Routines called:
6247C                MSTA1 and MSTA2 to calculate the starting
6248C                point for backward recurrence
6249C       =======================================================
6250C
6251        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
6252        IMPLICIT COMPLEX*16 (C,Z)
6253        DIMENSION CBJ(0:N),CDJ(0:N),CBY(0:N),CDY(0:N),
6254     &            A(4),B(4),A1(4),B1(4)
6255        EL=0.5772156649015329D0
6256        PI=3.141592653589793D0
6257        R2P=.63661977236758D0
6258        Y0=DABS(DIMAG(Z))
6259        A0=CDABS(Z)
6260        NM=N
6261        IF (A0.LT.1.0D-100) THEN
6262           DO 10 K=0,N
6263              CBJ(K)=(0.0D0,0.0D0)
6264              CDJ(K)=(0.0D0,0.0D0)
6265              CBY(K)=-(1.0D+300,0.0D0)
626610            CDY(K)=(1.0D+300,0.0D0)
6267           CBJ(0)=(1.0D0,0.0D0)
6268           CDJ(1)=(0.5D0,0.0D0)
6269           RETURN
6270        ENDIF
6271        IF (A0.LE.300.D0.OR.N.GT.80) THEN
6272           IF (N.EQ.0) NM=1
6273           M=MSTA1(A0,200)
6274           IF (M.LT.NM) THEN
6275              NM=M
6276           ELSE
6277              M=MSTA2(A0,NM,15)
6278           ENDIF
6279           CBS=(0.0D0,0.0D0)
6280           CSU=(0.0D0,0.0D0)
6281           CSV=(0.0D0,0.0D0)
6282           CF2=(0.0D0,0.0D0)
6283           CF1=(1.0D-100,0.0D0)
6284           DO 15 K=M,0,-1
6285              CF=2.0D0*(K+1.0D0)/Z*CF1-CF2
6286              IF (K.LE.NM) CBJ(K)=CF
6287              IF (K.EQ.2*INT(K/2).AND.K.NE.0) THEN
6288                 IF (Y0.LE.1.0D0) THEN
6289                    CBS=CBS+2.0D0*CF
6290                 ELSE
6291                    CBS=CBS+(-1)**(K/2)*2.0D0*CF
6292                 ENDIF
6293                 CSU=CSU+(-1)**(K/2)*CF/K
6294              ELSE IF (K.GT.1) THEN
6295                 CSV=CSV+(-1)**(K/2)*K/(K*K-1.0D0)*CF
6296              ENDIF
6297              CF2=CF1
629815            CF1=CF
6299           IF (Y0.LE.1.0D0) THEN
6300              CS0=CBS+CF
6301           ELSE
6302              CS0=(CBS+CF)/CDCOS(Z)
6303           ENDIF
6304           DO 20 K=0,NM
630520            CBJ(K)=CBJ(K)/CS0
6306           CE=CDLOG(Z/2.0D0)+EL
6307           CBY(0)=R2P*(CE*CBJ(0)-4.0D0*CSU/CS0)
6308           CBY(1)=R2P*(-CBJ(0)/Z+(CE-1.0D0)*CBJ(1)-4.0D0*CSV/CS0)
6309        ELSE
6310           DATA A/-.7031250000000000D-01,.1121520996093750D+00,
6311     &            -.5725014209747314D+00,.6074042001273483D+01/
6312           DATA B/ .7324218750000000D-01,-.2271080017089844D+00,
6313     &             .1727727502584457D+01,-.2438052969955606D+02/
6314           DATA A1/.1171875000000000D+00,-.1441955566406250D+00,
6315     &             .6765925884246826D+00,-.6883914268109947D+01/
6316           DATA B1/-.1025390625000000D+00,.2775764465332031D+00,
6317     &             -.1993531733751297D+01,.2724882731126854D+02/
6318           CT1=Z-0.25D0*PI
6319           CP0=(1.0D0,0.0D0)
6320           DO 25 K=1,4
632125            CP0=CP0+A(K)*Z**(-2*K)
6322           CQ0=-0.125D0/Z
6323           DO 30 K=1,4
632430            CQ0=CQ0+B(K)*Z**(-2*K-1)
6325           CU=CDSQRT(R2P/Z)
6326           CBJ0=CU*(CP0*CDCOS(CT1)-CQ0*CDSIN(CT1))
6327           CBY0=CU*(CP0*CDSIN(CT1)+CQ0*CDCOS(CT1))
6328           CBJ(0)=CBJ0
6329           CBY(0)=CBY0
6330           CT2=Z-0.75D0*PI
6331           CP1=(1.0D0,0.0D0)
6332           DO 35 K=1,4
633335            CP1=CP1+A1(K)*Z**(-2*K)
6334           CQ1=0.375D0/Z
6335           DO 40 K=1,4
633640            CQ1=CQ1+B1(K)*Z**(-2*K-1)
6337           CBJ1=CU*(CP1*CDCOS(CT2)-CQ1*CDSIN(CT2))
6338           CBY1=CU*(CP1*CDSIN(CT2)+CQ1*CDCOS(CT2))
6339           CBJ(1)=CBJ1
6340           CBY(1)=CBY1
6341           DO 45 K=2,NM
6342              CBJK=2.0D0*(K-1.0D0)/Z*CBJ1-CBJ0
6343              CBJ(K)=CBJK
6344              CBJ0=CBJ1
634545            CBJ1=CBJK
6346        ENDIF
6347        CDJ(0)=-CBJ(1)
6348        DO 50 K=1,NM
634950         CDJ(K)=CBJ(K-1)-K/Z*CBJ(K)
6350        IF (CDABS(CBJ(0)).GT.1.0D0) THEN
6351           CBY(1)=(CBJ(1)*CBY(0)-2.0D0/(PI*Z))/CBJ(0)
6352        ENDIF
6353        DO 55 K=2,NM
6354           IF (CDABS(CBJ(K-1)).GE.CDABS(CBJ(K-2))) THEN
6355              CYY=(CBJ(K)*CBY(K-1)-2.0D0/(PI*Z))/CBJ(K-1)
6356           ELSE
6357              CYY=(CBJ(K)*CBY(K-2)-4.0D0*(K-1.0D0)/(PI*Z*Z))/CBJ(K-2)
6358           ENDIF
6359           CBY(K)=CYY
636055      CONTINUE
6361        CDY(0)=-CBY(1)
6362        DO 60 K=1,NM
636360         CDY(K)=CBY(K-1)-K/Z*CBY(K)
6364        RETURN
6365        END
6366
6367
6368
6369C       **********************************
6370
6371        SUBROUTINE IKNB(N,X,NM,BI,DI,BK,DK)
6372C
6373C       ============================================================
6374C       Purpose: Compute modified Bessel functions In(x) and Kn(x),
6375C                and their derivatives
6376C       Input:   x --- Argument of In(x) and Kn(x) ( 0 ≤ x ≤ 700 )
6377C                n --- Order of In(x) and Kn(x)
6378C       Output:  BI(n) --- In(x)
6379C                DI(n) --- In'(x)
6380C                BK(n) --- Kn(x)
6381C                DK(n) --- Kn'(x)
6382C                NM --- Highest order computed
6383C       Routines called:
6384C                MSTA1 and MSTA2 for computing the starting point
6385C                for backward recurrence
6386C       ===========================================================
6387C
6388        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
6389        DIMENSION BI(0:N),DI(0:N),BK(0:N),DK(0:N)
6390        PI=3.141592653589793D0
6391        EL=0.5772156649015329D0
6392        NM=N
6393        IF (X.LE.1.0D-100) THEN
6394           DO 10 K=0,N
6395              BI(K)=0.0D0
6396              DI(K)=0.0D0
6397              BK(K)=1.0D+300
639810            DK(K)=-1.0D+300
6399           BI(0)=1.0D0
6400           DI(1)=0.5D0
6401           RETURN
6402        ENDIF
6403        IF (N.EQ.0) NM=1
6404        M=MSTA1(X,200)
6405        IF (M.LT.NM) THEN
6406           NM=M
6407        ELSE
6408           M=MSTA2(X,NM,15)
6409        ENDIF
6410        BS=0.0D0
6411        SK0=0.0D0
6412        F=0.0D0
6413        F0=0.0D0
6414        F1=1.0D-100
6415        DO 15 K=M,0,-1
6416           F=2.0D0*(K+1.0D0)/X*F1+F0
6417           IF (K.LE.NM) BI(K)=F
6418           IF (K.NE.0.AND.K.EQ.2*INT(K/2)) SK0=SK0+4.0D0*F/K
6419           BS=BS+2.0D0*F
6420           F0=F1
642115         F1=F
6422        S0=DEXP(X)/(BS-F)
6423        DO 20 K=0,NM
642420         BI(K)=S0*BI(K)
6425        IF (X.LE.8.0D0) THEN
6426           BK(0)=-(DLOG(0.5D0*X)+EL)*BI(0)+S0*SK0
6427           BK(1)=(1.0D0/X-BI(1)*BK(0))/BI(0)
6428        ELSE
6429           A0=DSQRT(PI/(2.0D0*X))*DEXP(-X)
6430           K0=16
6431           IF (X.GE.25.0) K0=10
6432           IF (X.GE.80.0) K0=8
6433           IF (X.GE.200.0) K0=6
6434           DO 30 L=0,1
6435              BKL=1.0D0
6436              VT=4.0D0*L
6437              R=1.0D0
6438              DO 25 K=1,K0
6439                 R=0.125D0*R*(VT-(2.0*K-1.0)**2)/(K*X)
644025               BKL=BKL+R
6441              BK(L)=A0*BKL
644230         CONTINUE
6443        ENDIF
6444        G0=BK(0)
6445        G1=BK(1)
6446        DO 35 K=2,NM
6447           G=2.0D0*(K-1.0D0)/X*G1+G0
6448           BK(K)=G
6449           G0=G1
645035         G1=G
6451        DI(0)=BI(1)
6452        DK(0)=-BK(1)
6453        DO 40 K=1,NM
6454           DI(K)=BI(K-1)-K/X*BI(K)
645540         DK(K)=-BK(K-1)-K/X*BK(K)
6456        RETURN
6457        END
6458
6459
6460
6461C       **********************************
6462
6463        SUBROUTINE LPMN(MM,M,N,X,PM,PD)
6464C
6465C       =====================================================
6466C       Purpose: Compute the associated Legendre functions
6467C                Pmn(x) and their derivatives Pmn'(x) for
6468C                real argument
6469C       Input :  x  --- Argument of Pmn(x)
6470C                m  --- Order of Pmn(x),  m = 0,1,2,...,n
6471C                n  --- Degree of Pmn(x), n = 0,1,2,...,N
6472C                mm --- Physical dimension of PM and PD
6473C       Output:  PM(m,n) --- Pmn(x)
6474C                PD(m,n) --- Pmn'(x)
6475C       =====================================================
6476C
6477        IMPLICIT DOUBLE PRECISION (D,P,X)
6478        DIMENSION PM(0:MM,0:N),PD(0:MM,0:N)
6479        INTRINSIC MIN
6480        DO 10 I=0,N
6481        DO 10 J=0,M
6482           PM(J,I)=0.0D0
648310         PD(J,I)=0.0D0
6484        PM(0,0)=1.0D0
6485        IF (N.EQ.0) RETURN
6486        IF (DABS(X).EQ.1.0D0) THEN
6487           DO 15 I=1,N
6488              PM(0,I)=X**I
648915            PD(0,I)=0.5D0*I*(I+1.0D0)*X**(I+1)
6490           DO 20 J=1,N
6491           DO 20 I=1,M
6492              IF (I.EQ.1) THEN
6493                 PD(I,J)=DINF()
6494              ELSE IF (I.EQ.2) THEN
6495                 PD(I,J)=-0.25D0*(J+2)*(J+1)*J*(J-1)*X**(J+1)
6496              ENDIF
649720         CONTINUE
6498           RETURN
6499        ENDIF
6500        LS=1
6501        IF (DABS(X).GT.1.0D0) LS=-1
6502        XQ=DSQRT(LS*(1.0D0-X*X))
6503C       Ensure connection to the complex-valued function for |x| > 1
6504        IF (X.LT.-1D0) XQ=-XQ
6505        XS=LS*(1.0D0-X*X)
6506        DO 30 I=1,M
650730         PM(I,I)=-LS*(2.0D0*I-1.0D0)*XQ*PM(I-1,I-1)
6508        DO 35 I=0,MIN(M,N-1)
650935         PM(I,I+1)=(2.0D0*I+1.0D0)*X*PM(I,I)
6510        DO 40 I=0,M
6511        DO 40 J=I+2,N
6512           PM(I,J)=((2.0D0*J-1.0D0)*X*PM(I,J-1)-
6513     &             (I+J-1.0D0)*PM(I,J-2))/(J-I)
651440      CONTINUE
6515        PD(0,0)=0.0D0
6516        DO 45 J=1,N
651745         PD(0,J)=LS*J*(PM(0,J-1)-X*PM(0,J))/XS
6518        DO 50 I=1,M
6519        DO 50 J=I,N
6520           PD(I,J)=LS*I*X*PM(I,J)/XS+(J+I)
6521     &             *(J-I+1.0D0)/XQ*PM(I-1,J)
652250      CONTINUE
6523        RETURN
6524        END
6525
6526C       **********************************
6527
6528        SUBROUTINE MTU0(KF,M,Q,X,CSF,CSD)
6529C
6530C       ===============================================================
6531C       Purpose: Compute Mathieu functions cem(x,q) and sem(x,q)
6532C                and their derivatives ( q ≥ 0 )
6533C       Input :  KF  --- Function code
6534C                        KF=1 for computing cem(x,q) and cem'(x,q)
6535C                        KF=2 for computing sem(x,q) and sem'(x,q)
6536C                m   --- Order of Mathieu functions
6537C                q   --- Parameter of Mathieu functions
6538C                x   --- Argument of Mathieu functions (in degrees)
6539C       Output:  CSF --- cem(x,q) or sem(x,q)
6540C                CSD --- cem'x,q) or sem'x,q)
6541C       Routines called:
6542C            (1) CVA2 for computing the characteristic values
6543C            (2) FCOEF for computing the expansion coefficients
6544C       ===============================================================
6545C
6546        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
6547        DIMENSION FG(251)
6548        EPS=1.0D-14
6549        IF (KF.EQ.1.AND.M.EQ.2*INT(M/2)) KD=1
6550        IF (KF.EQ.1.AND.M.NE.2*INT(M/2)) KD=2
6551        IF (KF.EQ.2.AND.M.NE.2*INT(M/2)) KD=3
6552        IF (KF.EQ.2.AND.M.EQ.2*INT(M/2)) KD=4
6553        CALL CVA2(KD,M,Q,A)
6554        IF (Q.LE.1.0D0) THEN
6555           QM=7.5+56.1*SQRT(Q)-134.7*Q+90.7*SQRT(Q)*Q
6556        ELSE
6557           QM=17.0+3.1*SQRT(Q)-.126*Q+.0037*SQRT(Q)*Q
6558        ENDIF
6559        KM=INT(QM+0.5*M)
6560        IF(KM.GT.251) THEN
6561           CSF=DNAN()
6562           CSD=DNAN()
6563           RETURN
6564        END IF
6565        CALL FCOEF(KD,M,Q,A,FG)
6566        IC=INT(M/2)+1
6567        RD=1.74532925199433D-2
6568        XR=X*RD
6569        CSF=0.0D0
6570        DO 10 K=1,KM
6571           IF (KD.EQ.1) THEN
6572              CSF=CSF+FG(K)*DCOS((2*K-2)*XR)
6573           ELSE IF (KD.EQ.2) THEN
6574              CSF=CSF+FG(K)*DCOS((2*K-1)*XR)
6575           ELSE IF (KD.EQ.3) THEN
6576              CSF=CSF+FG(K)*DSIN((2*K-1)*XR)
6577           ELSE IF (KD.EQ.4) THEN
6578              CSF=CSF+FG(K)*DSIN(2*K*XR)
6579           ENDIF
6580           IF (K.GE.IC.AND.DABS(FG(K)).LT.DABS(CSF)*EPS) GO TO 15
658110         CONTINUE
658215      CSD=0.0D0
6583        DO 20 K=1,KM
6584           IF (KD.EQ.1) THEN
6585              CSD=CSD-(2*K-2)*FG(K)*DSIN((2*K-2)*XR)
6586           ELSE IF (KD.EQ.2) THEN
6587              CSD=CSD-(2*K-1)*FG(K)*DSIN((2*K-1)*XR)
6588           ELSE IF (KD.EQ.3) THEN
6589              CSD=CSD+(2*K-1)*FG(K)*DCOS((2*K-1)*XR)
6590           ELSE IF (KD.EQ.4) THEN
6591              CSD=CSD+2.0D0*K*FG(K)*DCOS(2*K*XR)
6592           ENDIF
6593           IF (K.GE.IC.AND.DABS(FG(K)).LT.DABS(CSD)*EPS) GO TO 25
659420         CONTINUE
659525      RETURN
6596        END
6597
6598
6599
6600C       **********************************
6601
6602        SUBROUTINE CY01(KF,Z,ZF,ZD)
6603C
6604C       ===========================================================
6605C       Purpose: Compute complex Bessel functions Y0(z), Y1(z)
6606C                and their derivatives
6607C       Input :  z  --- Complex argument of Yn(z) ( n=0,1 )
6608C                KF --- Function choice code
6609C                    KF=0 for ZF=Y0(z) and ZD=Y0'(z)
6610C                    KF=1 for ZF=Y1(z) and ZD=Y1'(z)
6611C                    KF=2 for ZF=Y1'(z) and ZD=Y1''(z)
6612C       Output:  ZF --- Y0(z) or Y1(z) or Y1'(z)
6613C                ZD --- Y0'(z) or Y1'(z) or Y1''(z)
6614C       ===========================================================
6615C
6616        IMPLICIT DOUBLE PRECISION (A,B,E,P,R,W)
6617        IMPLICIT COMPLEX*16 (C,Z)
6618        DIMENSION A(12),B(12),A1(12),B1(12)
6619        PI=3.141592653589793D0
6620        EL=0.5772156649015329D0
6621        RP2=2.0D0/PI
6622        CI=(0.0D0,1.0D0)
6623        A0=CDABS(Z)
6624        Z2=Z*Z
6625        Z1=Z
6626        IF (A0.EQ.0.0D0) THEN
6627           CBJ0=(1.0D0,0.0D0)
6628           CBJ1=(0.0D0,0.0D0)
6629           CBY0=-(1.0D300,0.0D0)
6630           CBY1=-(1.0D300,0.0D0)
6631           CDY0=(1.0D300,0.0D0)
6632           CDY1=(1.0D300,0.0D0)
6633           GO TO 70
6634        ENDIF
6635        IF (DBLE(Z).LT.0.0) Z1=-Z
6636        IF (A0.LE.12.0) THEN
6637           CBJ0=(1.0D0,0.0D0)
6638           CR=(1.0D0,0.0D0)
6639           DO 10 K=1,40
6640              CR=-0.25D0*CR*Z2/(K*K)
6641              CBJ0=CBJ0+CR
6642              IF (CDABS(CR).LT.CDABS(CBJ0)*1.0D-15) GO TO 15
664310         CONTINUE
664415         CBJ1=(1.0D0,0.0D0)
6645           CR=(1.0D0,0.0D0)
6646           DO 20 K=1,40
6647              CR=-0.25D0*CR*Z2/(K*(K+1.0D0))
6648              CBJ1=CBJ1+CR
6649              IF (CDABS(CR).LT.CDABS(CBJ1)*1.0D-15) GO TO 25
665020         CONTINUE
665125         CBJ1=0.5D0*Z1*CBJ1
6652           W0=0.0D0
6653           CR=(1.0D0,0.0D0)
6654           CS=(0.0D0,0.0D0)
6655           DO 30 K=1,40
6656              W0=W0+1.0D0/K
6657              CR=-0.25D0*CR/(K*K)*Z2
6658              CP=CR*W0
6659              CS=CS+CP
6660              IF (CDABS(CP).LT.CDABS(CS)*1.0D-15) GO TO 35
666130         CONTINUE
666235         CBY0=RP2*(CDLOG(Z1/2.0D0)+EL)*CBJ0-RP2*CS
6663           W1=0.0D0
6664           CR=(1.0D0,0.0D0)
6665           CS=(1.0D0,0.0D0)
6666           DO 40 K=1,40
6667              W1=W1+1.0D0/K
6668              CR=-0.25D0*CR/(K*(K+1))*Z2
6669              CP=CR*(2.0D0*W1+1.0D0/(K+1.0D0))
6670              CS=CS+CP
6671              IF (CDABS(CP).LT.CDABS(CS)*1.0D-15) GO TO 45
667240         CONTINUE
667345         CBY1=RP2*((CDLOG(Z1/2.0D0)+EL)*CBJ1-1.0D0/Z1-.25D0*Z1*CS)
6674        ELSE
6675           DATA A/-.703125D-01,.112152099609375D+00,
6676     &            -.5725014209747314D+00,.6074042001273483D+01,
6677     &            -.1100171402692467D+03,.3038090510922384D+04,
6678     &            -.1188384262567832D+06,.6252951493434797D+07,
6679     &            -.4259392165047669D+09,.3646840080706556D+11,
6680     &            -.3833534661393944D+13,.4854014686852901D+15/
6681           DATA B/ .732421875D-01,-.2271080017089844D+00,
6682     &             .1727727502584457D+01,-.2438052969955606D+02,
6683     &             .5513358961220206D+03,-.1825775547429318D+05,
6684     &             .8328593040162893D+06,-.5006958953198893D+08,
6685     &             .3836255180230433D+10,-.3649010818849833D+12,
6686     &             .4218971570284096D+14,-.5827244631566907D+16/
6687           DATA A1/.1171875D+00,-.144195556640625D+00,
6688     &             .6765925884246826D+00,-.6883914268109947D+01,
6689     &             .1215978918765359D+03,-.3302272294480852D+04,
6690     &             .1276412726461746D+06,-.6656367718817688D+07,
6691     &             .4502786003050393D+09,-.3833857520742790D+11,
6692     &             .4011838599133198D+13,-.5060568503314727D+15/
6693           DATA B1/-.1025390625D+00,.2775764465332031D+00,
6694     &             -.1993531733751297D+01,.2724882731126854D+02,
6695     &             -.6038440767050702D+03,.1971837591223663D+05,
6696     &             -.8902978767070678D+06,.5310411010968522D+08,
6697     &             -.4043620325107754D+10,.3827011346598605D+12,
6698     &             -.4406481417852278D+14,.6065091351222699D+16/
6699           K0=12
6700           IF (A0.GE.35.0) K0=10
6701           IF (A0.GE.50.0) K0=8
6702           CT1=Z1-.25D0*PI
6703           CP0=(1.0D0,0.0D0)
6704           DO 50 K=1,K0
670550            CP0=CP0+A(K)*Z1**(-2*K)
6706           CQ0=-0.125D0/Z1
6707           DO 55 K=1,K0
670855            CQ0=CQ0+B(K)*Z1**(-2*K-1)
6709           CU=CDSQRT(RP2/Z1)
6710           CBJ0=CU*(CP0*CDCOS(CT1)-CQ0*CDSIN(CT1))
6711           CBY0=CU*(CP0*CDSIN(CT1)+CQ0*CDCOS(CT1))
6712           CT2=Z1-.75D0*PI
6713           CP1=(1.0D0,0.0D0)
6714           DO 60 K=1,K0
671560            CP1=CP1+A1(K)*Z1**(-2*K)
6716           CQ1=0.375D0/Z1
6717           DO 65 K=1,K0
671865            CQ1=CQ1+B1(K)*Z1**(-2*K-1)
6719           CBJ1=CU*(CP1*CDCOS(CT2)-CQ1*CDSIN(CT2))
6720           CBY1=CU*(CP1*CDSIN(CT2)+CQ1*CDCOS(CT2))
6721        ENDIF
6722        IF (DBLE(Z).LT.0.0) THEN
6723           IF (DIMAG(Z).LT.0.0) CBY0=CBY0-2.0D0*CI*CBJ0
6724           IF (DIMAG(Z).GT.0.0) CBY0=CBY0+2.0D0*CI*CBJ0
6725           IF (DIMAG(Z).LT.0.0) CBY1=-(CBY1-2.0D0*CI*CBJ1)
6726           IF (DIMAG(Z).GT.0.0) CBY1=-(CBY1+2.0D0*CI*CBJ1)
6727           CBJ1=-CBJ1
6728        ENDIF
6729        CDY0=-CBY1
6730        CDY1=CBY0-1.0D0/Z*CBY1
673170      IF (KF.EQ.0) THEN
6732           ZF=CBY0
6733           ZD=CDY0
6734        ELSE IF (KF.EQ.1) THEN
6735           ZF=CBY1
6736           ZD=CDY1
6737        ELSE IF (KF.EQ.2) THEN
6738           ZF=CDY1
6739           ZD=-CDY1/Z-(1.0D0-1.0D0/(Z*Z))*CBY1
6740        ENDIF
6741        RETURN
6742        END
6743
6744
6745C       **********************************
6746
6747        SUBROUTINE FFK(KS,X,FR,FI,FM,FA,GR,GI,GM,GA)
6748C
6749C       =======================================================
6750C       Purpose: Compute modified Fresnel integrals F±(x)
6751C                and K±(x)
6752C       Input :  x   --- Argument of F±(x) and K±(x)
6753C                KS  --- Sign code
6754C                        KS=0 for calculating F+(x) and K+(x)
6755C                        KS=1 for calculating F_(x) and K_(x)
6756C       Output:  FR  --- Re[F±(x)]
6757C                FI  --- Im[F±(x)]
6758C                FM  --- |F±(x)|
6759C                FA  --- Arg[F±(x)]  (Degs.)
6760C                GR  --- Re[K±(x)]
6761C                GI  --- Im[K±(x)]
6762C                GM  --- |K±(x)|
6763C                GA  --- Arg[K±(x)]  (Degs.)
6764C       ======================================================
6765C
6766        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
6767        SRD= 57.29577951308233D0
6768        EPS=1.0D-15
6769        PI=3.141592653589793D0
6770        PP2=1.2533141373155D0
6771        P2P=.7978845608028654D0
6772        XA=DABS(X)
6773        X2=X*X
6774        X4=X2*X2
6775        IF (X.EQ.0.0D0) THEN
6776           FR=.5D0*DSQRT(0.5D0*PI)
6777           FI=(-1)**KS*FR
6778           FM=DSQRT(0.25D0*PI)
6779           FA=(-1)**KS*45.0D0
6780           GR=.5D0
6781           GI=0.0D0
6782           GM=.5D0
6783           GA=0.0D0
6784        ELSE
6785           IF (XA.LE.2.5D0) THEN
6786              XR=P2P*XA
6787              C1=XR
6788              DO 10 K=1,50
6789                 XR=-.5D0*XR*(4.0D0*K-3.0D0)/K/(2.0D0*K-1.0D0)
6790     &              /(4.0D0*K+1.0D0)*X4
6791                 C1=C1+XR
6792                 IF (DABS(XR/C1).LT.EPS) GO TO 15
679310            CONTINUE
679415            S1=P2P*XA*XA*XA/3.0D0
6795              XR=S1
6796              DO 20 K=1,50
6797                 XR=-.5D0*XR*(4.0D0*K-1.0D0)/K/(2.0D0*K+1.0D0)
6798     &              /(4.0D0*K+3.0D0)*X4
6799                 S1=S1+XR
6800                 IF (DABS(XR/S1).LT.EPS) GO TO 40
680120            CONTINUE
6802           ELSE IF (XA.LT.5.5D0) THEN
6803              M=INT(42+1.75*X2)
6804              XSU=0.0D0
6805              XC=0.0D0
6806              XS=0.0D0
6807              XF1=0.0D0
6808              XF0=1D-100
6809              DO 25 K=M,0,-1
6810                 XF=(2.0D0*K+3.0D0)*XF0/X2-XF1
6811                 IF (K.EQ.2*INT(K/2))  THEN
6812                    XC=XC+XF
6813                 ELSE
6814                    XS=XS+XF
6815                 ENDIF
6816                 XSU=XSU+(2.0D0*K+1.0D0)*XF*XF
6817                 XF1=XF0
681825               XF0=XF
6819              XQ=DSQRT(XSU)
6820              XW=P2P*XA/XQ
6821              C1=XC*XW
6822              S1=XS*XW
6823           ELSE
6824              XR=1.0D0
6825              XF=1.0D0
6826              DO 30 K=1,12
6827                 XR=-.25D0*XR*(4.0D0*K-1.0D0)*(4.0D0*K-3.0D0)/X4
682830               XF=XF+XR
6829              XR=1.0D0/(2.0D0*XA*XA)
6830              XG=XR
6831              DO 35 K=1,12
6832                 XR=-.25D0*XR*(4.0D0*K+1.0D0)*(4.0D0*K-1.0D0)/X4
683335               XG=XG+XR
6834              C1=.5D0+(XF*DSIN(X2)-XG*DCOS(X2))/DSQRT(2.0D0*PI)/XA
6835              S1=.5D0-(XF*DCOS(X2)+XG*DSIN(X2))/DSQRT(2.0D0*PI)/XA
6836           ENDIF
683740         FR=PP2*(.5D0-C1)
6838           FI0=PP2*(.5D0-S1)
6839           FI=(-1)**KS*FI0
6840           FM=DSQRT(FR*FR+FI*FI)
6841           IF (FR.GE.0.0) THEN
6842              FA=SRD*DATAN(FI/FR)
6843           ELSE IF (FI.GT.0.0) THEN
6844              FA=SRD*(DATAN(FI/FR)+PI)
6845           ELSE IF (FI.LT.0.0) THEN
6846              FA=SRD*(DATAN(FI/FR)-PI)
6847           ENDIF
6848           XP=X*X+PI/4.0D0
6849           CS=DCOS(XP)
6850           SS=DSIN(XP)
6851           XQ2=1.0D0/DSQRT(PI)
6852           GR=XQ2*(FR*CS+FI0*SS)
6853           GI=(-1)**KS*XQ2*(FI0*CS-FR*SS)
6854           GM=DSQRT(GR*GR+GI*GI)
6855           IF (GR.GE.0.0) THEN
6856              GA=SRD*DATAN(GI/GR)
6857           ELSE IF (GI.GT.0.0) THEN
6858              GA=SRD*(DATAN(GI/GR)+PI)
6859           ELSE IF (GI.LT.0.0) THEN
6860              GA=SRD*(DATAN(GI/GR)-PI)
6861           ENDIF
6862           IF (X.LT.0.0D0) THEN
6863              FR=PP2-FR
6864              FI=(-1)**KS*PP2-FI
6865              FM=DSQRT(FR*FR+FI*FI)
6866              FA=SRD*DATAN(FI/FR)
6867              GR=DCOS(X*X)-GR
6868              GI=-(-1)**KS*DSIN(X*X)-GI
6869              GM=DSQRT(GR*GR+GI*GI)
6870              GA=SRD*DATAN(GI/GR)
6871           ENDIF
6872        ENDIF
6873        RETURN
6874        END
6875
6876C       **********************************
6877
6878        SUBROUTINE AIRYA(X,AI,BI,AD,BD)
6879C
6880C       ======================================================
6881C       Purpose: Compute Airy functions and their derivatives
6882C       Input:   x  --- Argument of Airy function
6883C       Output:  AI --- Ai(x)
6884C                BI --- Bi(x)
6885C                AD --- Ai'(x)
6886C                BD --- Bi'(x)
6887C       Routine called:
6888C                AJYIK for computing Jv(x), Yv(x), Iv(x) and
6889C                Kv(x) with v=1/3 and 2/3
6890C       ======================================================
6891C
6892        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
6893        XA=DABS(X)
6894        PIR=0.318309886183891D0
6895        C1=0.355028053887817D0
6896        C2=0.258819403792807D0
6897        SR3=1.732050807568877D0
6898        Z=XA**1.5/1.5D0
6899        XQ=DSQRT(XA)
6900        CALL AJYIK(Z,VJ1,VJ2,VY1,VY2,VI1,VI2,VK1,VK2)
6901        IF (X.EQ.0.0D0) THEN
6902           AI=C1
6903           BI=SR3*C1
6904           AD=-C2
6905           BD=SR3*C2
6906        ELSE IF (X.GT.0.0D0) THEN
6907           AI=PIR*XQ/SR3*VK1
6908           BI=XQ*(PIR*VK1+2.0D0/SR3*VI1)
6909           AD=-XA/SR3*PIR*VK2
6910           BD=XA*(PIR*VK2+2.0D0/SR3*VI2)
6911        ELSE
6912           AI=0.5D0*XQ*(VJ1-VY1/SR3)
6913           BI=-0.5D0*XQ*(VJ1/SR3+VY1)
6914           AD=0.5D0*XA*(VJ2+VY2/SR3)
6915           BD=0.5D0*XA*(VJ2/SR3-VY2)
6916        ENDIF
6917        RETURN
6918        END
6919
6920
6921
6922C       **********************************
6923
6924        SUBROUTINE AIRYB(X,AI,BI,AD,BD)
6925C
6926C       =======================================================
6927C       Purpose: Compute Airy functions and their derivatives
6928C       Input:   x  --- Argument of Airy function
6929C       Output:  AI --- Ai(x)
6930C                BI --- Bi(x)
6931C                AD --- Ai'(x)
6932C                BD --- Bi'(x)
6933C       =======================================================
6934C
6935        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
6936        DIMENSION CK(51),DK(51)
6937        EPS=1.0D-15
6938        PI=3.141592653589793D0
6939        C1=0.355028053887817D0
6940        C2=0.258819403792807D0
6941        SR3=1.732050807568877D0
6942        XA=DABS(X)
6943        XQ=DSQRT(XA)
6944        XM=8.0D0
6945        IF (X.GT.0.0D0) XM=5.0D0
6946        IF (X.EQ.0.0D0) THEN
6947           AI=C1
6948           BI=SR3*C1
6949           AD=-C2
6950           BD=SR3*C2
6951           RETURN
6952        ENDIF
6953        IF (XA.LE.XM) THEN
6954           FX=1.0D0
6955           R=1.0D0
6956           DO 10 K=1,40
6957              R=R*X/(3.0D0*K)*X/(3.0D0*K-1.0D0)*X
6958              FX=FX+R
6959              IF (DABS(R).LT.DABS(FX)*EPS) GO TO 15
696010         CONTINUE
696115         GX=X
6962           R=X
6963           DO 20 K=1,40
6964              R=R*X/(3.0D0*K)*X/(3.0D0*K+1.0D0)*X
6965              GX=GX+R
6966              IF (DABS(R).LT.DABS(GX)*EPS) GO TO 25
696720         CONTINUE
696825         AI=C1*FX-C2*GX
6969           BI=SR3*(C1*FX+C2*GX)
6970           DF=0.5D0*X*X
6971           R=DF
6972           DO 30 K=1,40
6973              R=R*X/(3.0D0*K)*X/(3.0D0*K+2.0D0)*X
6974              DF=DF+R
6975              IF (DABS(R).LT.DABS(DF)*EPS) GO TO 35
697630         CONTINUE
697735         DG=1.0D0
6978           R=1.0D0
6979           DO 40 K=1,40
6980              R=R*X/(3.0D0*K)*X/(3.0D0*K-2.0D0)*X
6981              DG=DG+R
6982              IF (DABS(R).LT.DABS(DG)*EPS) GO TO 45
698340         CONTINUE
698445         AD=C1*DF-C2*DG
6985           BD=SR3*(C1*DF+C2*DG)
6986        ELSE
6987           KM=INT(24.5-XA)
6988           IF (XA.LT.6.0) KM=14
6989           IF (XA.GT.15.0) KM=10
6990           IF (X.GT.0.0D0) THEN
6991              KMAX=KM
6992           ELSE
6993C             Choose cutoffs so that the remainder term in asymptotic
6994C             expansion is epsilon size. The X<0 branch needs to be fast
6995C             in order to make AIRYZO efficient
6996              IF (XA.GT.70.0) KM=3
6997              IF (XA.GT.500.0) KM=2
6998              IF (XA.GT.1000.0) KM=1
6999              KM2=KM
7000              IF (XA.GT.150.0) KM2=1
7001              IF (XA.GT.3000.0) KM2=0
7002              KMAX=2*KM+1
7003           ENDIF
7004           XE=XA*XQ/1.5D0
7005           XR1=1.0D0/XE
7006           XAR=1.0D0/XQ
7007           XF=DSQRT(XAR)
7008           RP=0.5641895835477563D0
7009           R=1.0D0
7010           DO 50 K=1,KMAX
7011              R=R*(6.0D0*K-1.0D0)/216.0D0*(6.0D0*K-3.0D0)
7012     &          /K*(6.0D0*K-5.0D0)/(2.0D0*K-1.0D0)
7013              CK(K)=R
701450            DK(K)=-(6.0D0*K+1.0D0)/(6.0D0*K-1.0D0)*CK(K)
7015           IF (X.GT.0.0D0) THEN
7016              SAI=1.0D0
7017              SAD=1.0D0
7018              R=1.0D0
7019              DO 55 K=1,KM
7020                 R=-R*XR1
7021                 SAI=SAI+CK(K)*R
702255               SAD=SAD+DK(K)*R
7023              SBI=1.0D0
7024              SBD=1.0D0
7025              R=1.0D0
7026              DO 60 K=1,KM
7027                 R=R*XR1
7028                 SBI=SBI+CK(K)*R
702960               SBD=SBD+DK(K)*R
7030              XP1=DEXP(-XE)
7031              AI=0.5D0*RP*XF*XP1*SAI
7032              BI=RP*XF/XP1*SBI
7033              AD=-.5D0*RP/XF*XP1*SAD
7034              BD=RP/XF/XP1*SBD
7035           ELSE
7036              XCS=DCOS(XE+PI/4.0D0)
7037              XSS=DSIN(XE+PI/4.0D0)
7038              SSA=1.0D0
7039              SDA=1.0D0
7040              R=1.0D0
7041              XR2=1.0D0/(XE*XE)
7042              DO 65 K=1,KM
7043                 R=-R*XR2
7044                 SSA=SSA+CK(2*K)*R
704565               SDA=SDA+DK(2*K)*R
7046              SSB=CK(1)*XR1
7047              SDB=DK(1)*XR1
7048              R=XR1
7049              DO 70 K=1,KM2
7050                 R=-R*XR2
7051                 SSB=SSB+CK(2*K+1)*R
705270               SDB=SDB+DK(2*K+1)*R
7053              AI=RP*XF*(XSS*SSA-XCS*SSB)
7054              BI=RP*XF*(XCS*SSA+XSS*SSB)
7055              AD=-RP/XF*(XCS*SDA+XSS*SDB)
7056              BD=RP/XF*(XSS*SDA-XCS*SDB)
7057           ENDIF
7058        ENDIF
7059        RETURN
7060        END
7061
7062C       **********************************
7063
7064        SUBROUTINE SCKA(M,N,C,CV,KD,CK)
7065C
7066C       ======================================================
7067C       Purpose: Compute the expansion coefficients of the
7068C                prolate and oblate spheroidal functions, c2k
7069C       Input :  m  --- Mode parameter
7070C                n  --- Mode parameter
7071C                c  --- Spheroidal parameter
7072C                cv --- Characteristic value
7073C                KD --- Function code
7074C                       KD=1 for prolate; KD=-1 for oblate
7075C       Output:  CK(k) --- Expansion coefficients ck;
7076C                          CK(1), CK(2),... correspond to
7077C                          c0, c2,...
7078C       ======================================================
7079C
7080        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7081        DIMENSION CK(200)
7082        IF (C.LE.1.0D-10) C=1.0D-10
7083        NM=25+INT((N-M)/2+C)
7084        CS=C*C*KD
7085        IP=1
7086        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
7087        FS=1.0D0
7088        F1=0.0D0
7089        F0=1.0D-100
7090        KB=0
7091        CK(NM+1)=0.0D0
7092        FL=0.0D0
7093        DO 15 K=NM,1,-1
7094           F=(((2.0D0*K+M+IP)*(2.0D0*K+M+1.0D0+IP)-CV+CS)*F0
7095     &       -4.0D0*(K+1.0D0)*(K+M+1.0D0)*F1)/CS
7096           IF (DABS(F).GT.DABS(CK(K+1))) THEN
7097              CK(K)=F
7098              F1=F0
7099              F0=F
7100              IF (DABS(F).GT.1.0D+100) THEN
7101                 DO 5 K1=NM,K,-1
71025                   CK(K1)=CK(K1)*1.0D-100
7103                 F1=F1*1.0D-100
7104                 F0=F0*1.0D-100
7105              ENDIF
7106           ELSE
7107              KB=K
7108              FL=CK(K+1)
7109              F1=1.0D0
7110              F2=0.25D0*((M+IP)*(M+IP+1.0)-CV+CS)/(M+1.0)*F1
7111              CK(1)=F1
7112              IF (KB.EQ.1) THEN
7113                 FS=F2
7114              ELSE IF (KB.EQ.2) THEN
7115                 CK(2)=F2
7116                 FS=0.125D0*(((M+IP+2.0)*(M+IP+3.0)-CV+CS)*F2
7117     &              -CS*F1)/(M+2.0)
7118              ELSE
7119                 CK(2)=F2
7120                 DO 10 J=3,KB+1
7121                    F=0.25D0*(((2.0*J+M+IP-4.0)*(2.0*J+M+IP-
7122     &                3.0)-CV+CS)*F2-CS*F1)/((J-1.0)*(J+M-1.0))
7123                    IF (J.LE.KB) CK(J)=F
7124                    F1=F2
712510                  F2=F
7126                 FS=F
7127              ENDIF
7128              GO TO 20
7129           ENDIF
713015      CONTINUE
713120      SU1=0.0D0
7132        DO 25 K=1,KB
713325         SU1=SU1+CK(K)
7134        SU2=0.0D0
7135        DO 30 K=KB+1,NM
713630         SU2=SU2+CK(K)
7137        R1=1.0D0
7138        DO 35 J=1,(N+M+IP)/2
713935         R1=R1*(J+0.5D0*(N+M+IP))
7140        R2=1.0D0
7141        DO 40 J=1,(N-M-IP)/2
714240         R2=-R2*J
7143        IF (KB.EQ.0) THEN
7144            S0=R1/(2.0D0**N*R2*SU2)
7145        ELSE
7146            S0=R1/(2.0D0**N*R2*(FL/FS*SU1+SU2))
7147        ENDIF
7148        DO 45 K=1,KB
714945         CK(K)=FL/FS*S0*CK(K)
7150        DO 50 K=KB+1,NM
715150         CK(K)=S0*CK(K)
7152        RETURN
7153        END
7154
7155
7156
7157C       **********************************
7158
7159        SUBROUTINE SCKB(M,N,C,DF,CK)
7160C
7161C       ======================================================
7162C       Purpose: Compute the expansion coefficients of the
7163C                prolate and oblate spheroidal functions
7164C       Input :  m  --- Mode parameter
7165C                n  --- Mode parameter
7166C                c  --- Spheroidal parameter
7167C                DF(k) --- Expansion coefficients dk
7168C       Output:  CK(k) --- Expansion coefficients ck;
7169C                          CK(1), CK(2), ... correspond to
7170C                          c0, c2, ...
7171C       ======================================================
7172C
7173        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7174        DIMENSION DF(200),CK(200)
7175        IF (C.LE.1.0D-10) C=1.0D-10
7176        NM=25+INT(0.5*(N-M)+C)
7177        IP=1
7178        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
7179        REG=1.0D0
7180        IF (M+NM.GT.80) REG=1.0D-200
7181        FAC=-0.5D0**M
7182        SW=0.0D0
7183        DO 35 K=0,NM-1
7184           FAC=-FAC
7185           I1=2*K+IP+1
7186           R=REG
7187           DO 10 I=I1,I1+2*M-1
718810            R=R*I
7189           I2=K+M+IP
7190           DO 15 I=I2,I2+K-1
719115            R=R*(I+0.5D0)
7192           SUM=R*DF(K+1)
7193           DO 20 I=K+1,NM
7194              D1=2.0D0*I+IP
7195              D2=2.0D0*M+D1
7196              D3=I+M+IP-0.5D0
7197              R=R*D2*(D2-1.0D0)*I*(D3+K)/(D1*(D1-1.0D0)*(I-K)*D3)
7198              SUM=SUM+R*DF(I+1)
7199              IF (DABS(SW-SUM).LT.DABS(SUM)*1.0D-14) GOTO 25
720020            SW=SUM
720125         R1=REG
7202           DO 30 I=2,M+K
720330            R1=R1*I
720435         CK(K+1)=FAC*SUM/R1
7205        RETURN
7206        END
7207
7208
7209
7210C       **********************************
7211
7212        SUBROUTINE CPDLA(N,Z,CDN)
7213C
7214C       ===========================================================
7215C       Purpose: Compute complex parabolic cylinder function Dn(z)
7216C                for large argument
7217C       Input:   z   --- Complex argument of Dn(z)
7218C                n   --- Order of Dn(z) (n = 0,±1,±2,…)
7219C       Output:  CDN --- Dn(z)
7220C       ===========================================================
7221C
7222        IMPLICIT DOUBLE PRECISION (A-B,D-H,O-Y)
7223        IMPLICIT COMPLEX*16 (C,Z)
7224        CB0=Z**N*CDEXP(-.25D0*Z*Z)
7225        CR=(1.0D0,0.0D0)
7226        CDN=(1.0D0,0.0D0)
7227        DO 10 K=1,16
7228           CR=-0.5D0*CR*(2.0*K-N-1.0)*(2.0*K-N-2.0)/(K*Z*Z)
7229           CDN=CDN+CR
7230           IF (CDABS(CR).LT.CDABS(CDN)*1.0D-12) GO TO 15
723110      CONTINUE
723215      CDN=CB0*CDN
7233        RETURN
7234        END
7235
7236
7237
7238C       **********************************
7239
7240        SUBROUTINE FCSZO(KF,NT,ZO)
7241C
7242C       ===============================================================
7243C       Purpose: Compute the complex zeros of Fresnel integral C(z)
7244C                or S(z) using modified Newton's iteration method
7245C       Input :  KF  --- Function code
7246C                        KF=1 for C(z) or KF=2 for S(z)
7247C                NT  --- Total number of zeros
7248C       Output:  ZO(L) --- L-th zero of C(z) or S(z)
7249C       Routines called:
7250C            (1) CFC for computing Fresnel integral C(z)
7251C            (2) CFS for computing Fresnel integral S(z)
7252C       ==============================================================
7253C
7254        IMPLICIT DOUBLE PRECISION (E,P,W)
7255        IMPLICIT COMPLEX *16 (C,Z)
7256        DIMENSION ZO(NT)
7257        PI=3.141592653589793D0
7258        PSQ=0.0D0
7259        W=0.0D0
7260        DO 35 NR=1,NT
7261           IF (KF.EQ.1) PSQ=DSQRT(4.0D0*NR-1.0D0)
7262           IF (KF.EQ.2) PSQ=2.0D0*NR**(0.5)
7263           PX=PSQ-DLOG(PI*PSQ)/(PI*PI*PSQ**3.0)
7264           PY=DLOG(PI*PSQ)/(PI*PSQ)
7265           Z = DCMPLX(PX, PY)
7266           IF (KF.EQ.2) THEN
7267              IF (NR.EQ.2) Z=(2.8334,0.2443)
7268              IF (NR.EQ.3) Z=(3.4674,0.2185)
7269              IF (NR.EQ.4) Z=(4.0025,0.2008)
7270           ENDIF
7271           IT=0
727215         IT=IT+1
7273           IF (KF.EQ.1) CALL CFC(Z,ZF,ZD)
7274           IF (KF.EQ.2) CALL CFS(Z,ZF,ZD)
7275           ZP=(1.0D0,0.0D0)
7276           DO 20 I=1,NR-1
727720            ZP=ZP*(Z-ZO(I))
7278           ZFD=ZF/ZP
7279           ZQ=(0.0D0,0.0D0)
7280           DO 30 I=1,NR-1
7281              ZW=(1.0D0,0.0D0)
7282              DO 25 J=1,NR-1
7283                 IF (J.EQ.I) GO TO 25
7284                 ZW=ZW*(Z-ZO(J))
728525            CONTINUE
728630            ZQ=ZQ+ZW
7287           ZGD=(ZD-ZQ*ZFD)/ZP
7288           Z=Z-ZFD/ZGD
7289           W0=W
7290           W=CDABS(Z)
7291           IF (IT.LE.50.AND.DABS((W-W0)/W).GT.1.0D-12) GO TO 15
729235         ZO(NR)=Z
7293        RETURN
7294        END
7295
7296
7297
7298C       **********************************
7299
7300        SUBROUTINE E1XA(X,E1)
7301C
7302C       ============================================
7303C       Purpose: Compute exponential integral E1(x)
7304C       Input :  x  --- Argument of E1(x)
7305C       Output:  E1 --- E1(x) ( x > 0 )
7306C       ============================================
7307C
7308        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7309        IF (X.EQ.0.0) THEN
7310           E1=1.0D+300
7311        ELSE IF (X.LE.1.0) THEN
7312           E1=-DLOG(X)+((((1.07857D-3*X-9.76004D-3)*X+5.519968D-2)*X
7313     &        -0.24991055D0)*X+0.99999193D0)*X-0.57721566D0
7314        ELSE
7315           ES1=(((X+8.5733287401D0)*X+18.059016973D0)*X
7316     &         +8.6347608925D0)*X+0.2677737343D0
7317           ES2=(((X+9.5733223454D0)*X+25.6329561486D0)*X
7318     &         +21.0996530827D0)*X+3.9584969228D0
7319           E1=DEXP(-X)/X*ES1/ES2
7320        ENDIF
7321        RETURN
7322        END
7323
7324C       **********************************
7325
7326        SUBROUTINE LPMV0(V,M,X,PMV)
7327C
7328C       =======================================================
7329C       Purpose: Compute the associated Legendre function
7330C                Pmv(x) with an integer order and an arbitrary
7331C                nonnegative degree v
7332C       Input :  x   --- Argument of Pm(x)  ( -1 ≤ x ≤ 1 )
7333C                m   --- Order of Pmv(x)
7334C                v   --- Degree of Pmv(x)
7335C       Output:  PMV --- Pmv(x)
7336C       Routine called:  PSI_SPEC for computing Psi function
7337C       =======================================================
7338C
7339        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7340        PI=3.141592653589793D0
7341        EL=.5772156649015329D0
7342        EPS=1.0D-14
7343        NV=INT(V)
7344        V0=V-NV
7345        IF (X.EQ.-1.0D0.AND.V.NE.NV) THEN
7346           IF (M.EQ.0) PMV=-1.0D+300
7347           IF (M.NE.0) PMV=1.0D+300
7348           RETURN
7349        ENDIF
7350        C0=1.0D0
7351        IF (M.NE.0) THEN
7352           RG=V*(V+M)
7353           DO 10 J=1,M-1
735410            RG=RG*(V*V-J*J)
7355           XQ=DSQRT(1.0D0-X*X)
7356           R0=1.0D0
7357           DO 15 J=1,M
735815            R0=.5D0*R0*XQ/J
7359           C0=R0*RG
7360        ENDIF
7361        IF (V0.EQ.0.0D0) THEN
7362C          DLMF 14.3.4, 14.7.17, 15.2.4
7363           PMV=1.0D0
7364           R=1.0D0
7365           DO 20 K=1,NV-M
7366              R=0.5D0*R*(-NV+M+K-1.0D0)*(NV+M+K)/(K*(K+M))
7367     &          *(1.0D0+X)
736820            PMV=PMV+R
7369           PMV=(-1)**NV*C0*PMV
7370        ELSE
7371           IF (X.GE.-0.35D0) THEN
7372C             DLMF 14.3.4, 15.2.1
7373              PMV=1.0D0
7374              R=1.0D0
7375              DO 25 K=1,100
7376                 R=0.5D0*R*(-V+M+K-1.0D0)*(V+M+K)/(K*(M+K))*(1.0D0-X)
7377                 PMV=PMV+R
7378                 IF (K.GT.12.AND.DABS(R/PMV).LT.EPS) GO TO 30
737925            CONTINUE
738030            PMV=(-1)**M*C0*PMV
7381           ELSE
7382C             DLMF 14.3.5, 15.8.10
7383              VS=DSIN(V*PI)/PI
7384              PV0=0.0D0
7385              IF (M.NE.0) THEN
7386                 QR=DSQRT((1.0D0-X)/(1.0D0+X))
7387                 R2=1.0D0
7388                 DO 35 J=1,M
738935                  R2=R2*QR*J
7390                 S0=1.0D0
7391                 R1=1.0D0
7392                 DO 40 K=1,M-1
7393                    R1=0.5D0*R1*(-V+K-1)*(V+K)/(K*(K-M))*(1.0D0+X)
739440                  S0=S0+R1
7395                 PV0=-VS*R2/M*S0
7396              ENDIF
7397              CALL PSI_SPEC(V,PSV)
7398              PA=2.0D0*(PSV+EL)+PI/DTAN(PI*V)+1.0D0/V
7399              S1=0.0D0
7400              DO 45 J=1,M
740145               S1=S1+(J*J+V*V)/(J*(J*J-V*V))
7402              PMV=PA+S1-1.0D0/(M-V)+DLOG(0.5D0*(1.0D0+X))
7403              R=1.0D0
7404              DO 60 K=1,100
7405                 R=0.5D0*R*(-V+M+K-1.0D0)*(V+M+K)/(K*(K+M))*(1.0D0+X)
7406                 S=0.0D0
7407                 DO 50 J=1,M
740850                  S=S+((K+J)**2+V*V)/((K+J)*((K+J)**2-V*V))
7409                 S2=0.0D0
7410                 DO 55 J=1,K
741155                  S2=S2+1.0D0/(J*(J*J-V*V))
7412                 PSS=PA+S+2.0D0*V*V*S2-1.0D0/(M+K-V)
7413     &               +DLOG(0.5D0*(1.0D0+X))
7414                 R2=PSS*R
7415                 PMV=PMV+R2
7416                 IF (DABS(R2/PMV).LT.EPS) GO TO 65
741760            CONTINUE
741865            PMV=PV0+PMV*VS*C0
7419           ENDIF
7420        ENDIF
7421        RETURN
7422        END
7423
7424C       **********************************
7425
7426        SUBROUTINE LPMV(V,M,X,PMV)
7427C
7428C       =======================================================
7429C       Purpose: Compute the associated Legendre function
7430C                Pmv(x) with an integer order and an arbitrary
7431C                degree v, using recursion for large degrees
7432C       Input :  x   --- Argument of Pm(x)  ( -1 ≤ x ≤ 1 )
7433C                m   --- Order of Pmv(x)
7434C                v   --- Degree of Pmv(x)
7435C       Output:  PMV --- Pmv(x)
7436C       Routine called:  LPMV0
7437C       =======================================================
7438C
7439        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7440        IF (X.EQ.-1.0D0.AND.V.NE.INT(V)) THEN
7441           IF (M.EQ.0) PMV=-DINF()
7442           IF (M.NE.0) PMV=DINF()
7443           RETURN
7444        ENDIF
7445        VX=V
7446        MX=M
7447C       DLMF 14.9.5
7448        IF (V.LT.0) THEN
7449           VX=-VX-1
7450        ENDIF
7451        NEG_M=0
7452        IF (M.LT.0) THEN
7453           IF ((VX+M+1).GT.0D0.OR.VX.NE.INT(VX)) THEN
7454              NEG_M=1
7455              MX=-M
7456           ELSE
7457C             We don't handle cases where DLMF 14.9.3 doesn't help
7458              PMV=DNAN()
7459              RETURN
7460           END IF
7461        ENDIF
7462        NV=INT(VX)
7463        V0=VX-NV
7464        IF (NV.GT.2.AND.NV.GT.MX) THEN
7465C          Up-recursion on degree, AMS 8.5.3 / DLMF 14.10.3
7466           CALL LPMV0(V0+MX, MX, X, P0)
7467           CALL LPMV0(V0+MX+1, MX, X, P1)
7468           PMV = P1
7469           DO 10 J=MX+2,NV
7470              PMV = ((2*(V0+J)-1)*X*P1 - (V0+J-1+MX)*P0) / (V0+J-MX)
7471              P0 = P1
7472              P1 = PMV
747310         CONTINUE
7474        ELSE
7475           CALL LPMV0(VX, MX, X, PMV)
7476        ENDIF
7477        IF (NEG_M.NE.0.AND.ABS(PMV).LT.1.0D+300) THEN
7478C          DLMF 14.9.3
7479           CALL GAMMA2(VX-MX+1, G1)
7480           CALL GAMMA2(VX+MX+1, G2)
7481           PMV = PMV*G1/G2 * (-1)**MX
7482        ENDIF
7483        END
7484
7485
7486C       **********************************
7487
7488        SUBROUTINE CGAMA(X,Y,KF,GR,GI)
7489C
7490C       =========================================================
7491C       Purpose: Compute the gamma function Г(z) or ln[Г(z)]
7492C                for a complex argument
7493C       Input :  x  --- Real part of z
7494C                y  --- Imaginary part of z
7495C                KF --- Function code
7496C                       KF=0 for ln[Г(z)]
7497C                       KF=1 for Г(z)
7498C       Output:  GR --- Real part of ln[Г(z)] or Г(z)
7499C                GI --- Imaginary part of ln[Г(z)] or Г(z)
7500C       ========================================================
7501C
7502        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7503        DIMENSION A(10)
7504        PI=3.141592653589793D0
7505        DATA A/8.333333333333333D-02,-2.777777777777778D-03,
7506     &         7.936507936507937D-04,-5.952380952380952D-04,
7507     &         8.417508417508418D-04,-1.917526917526918D-03,
7508     &         6.410256410256410D-03,-2.955065359477124D-02,
7509     &         1.796443723688307D-01,-1.39243221690590D+00/
7510        IF (Y.EQ.0.0D0.AND.X.EQ.INT(X).AND.X.LE.0.0D0) THEN
7511           GR=1.0D+300
7512           GI=0.0D0
7513           RETURN
7514        ELSE IF (X.LT.0.0D0) THEN
7515           X1=X
7516           Y1=Y
7517           X=-X
7518           Y=-Y
7519        ELSE
7520           Y1=0.0D0
7521           X1=X
7522        ENDIF
7523        X0=X
7524        NA=0
7525        IF (X.LE.7.0) THEN
7526           NA=INT(7-X)
7527           X0=X+NA
7528        ENDIF
7529        Z1=DSQRT(X0*X0+Y*Y)
7530        TH=DATAN(Y/X0)
7531        GR=(X0-.5D0)*DLOG(Z1)-TH*Y-X0+0.5D0*DLOG(2.0D0*PI)
7532        GI=TH*(X0-0.5D0)+Y*DLOG(Z1)-Y
7533        DO 10 K=1,10
7534           T=Z1**(1-2*K)
7535           GR=GR+A(K)*T*DCOS((2.0D0*K-1.0D0)*TH)
753610         GI=GI-A(K)*T*DSIN((2.0D0*K-1.0D0)*TH)
7537        IF (X.LE.7.0) THEN
7538           GR1=0.0D0
7539           GI1=0.0D0
7540           DO 15 J=0,NA-1
7541              GR1=GR1+.5D0*DLOG((X+J)**2+Y*Y)
754215            GI1=GI1+DATAN(Y/(X+J))
7543           GR=GR-GR1
7544           GI=GI-GI1
7545        ENDIF
7546        IF (X1.LT.0.0D0) THEN
7547           Z1=DSQRT(X*X+Y*Y)
7548           TH1=DATAN(Y/X)
7549           SR=-DSIN(PI*X)*DCOSH(PI*Y)
7550           SI=-DCOS(PI*X)*DSINH(PI*Y)
7551           Z2=DSQRT(SR*SR+SI*SI)
7552           TH2=DATAN(SI/SR)
7553           IF (SR.LT.0.0D0) TH2=PI+TH2
7554           GR=DLOG(PI/(Z1*Z2))-GR
7555           GI=-TH1-TH2-GI
7556           X=X1
7557           Y=Y1
7558        ENDIF
7559        IF (KF.EQ.1) THEN
7560           G0=DEXP(GR)
7561           GR=G0*DCOS(GI)
7562           GI=G0*DSIN(GI)
7563        ENDIF
7564        RETURN
7565        END
7566
7567C       **********************************
7568
7569        SUBROUTINE ASWFB(M,N,C,X,KD,CV,S1F,S1D)
7570C
7571C       ===========================================================
7572C       Purpose: Compute the prolate and oblate spheroidal angular
7573C                functions of the first kind and their derivatives
7574C       Input :  m  --- Mode parameter,  m = 0,1,2,...
7575C                n  --- Mode parameter,  n = m,m+1,...
7576C                c  --- Spheroidal parameter
7577C                x  --- Argument of angular function, |x| < 1.0
7578C                KD --- Function code
7579C                       KD=1 for prolate;  KD=-1 for oblate
7580C                cv --- Characteristic value
7581C       Output:  S1F --- Angular function of the first kind
7582C                S1D --- Derivative of the angular function of
7583C                        the first kind
7584C       Routines called:
7585C            (1) SDMN for computing expansion coefficients dk
7586C            (2) LPMNS for computing associated Legendre function
7587C                of the first kind Pmn(x)
7588C       ===========================================================
7589C
7590        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7591        DIMENSION DF(200),PM(0:251),PD(0:251)
7592        EPS=1.0D-14
7593        IP=1
7594        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
7595        NM=25+INT((N-M)/2+C)
7596        NM2=2*NM+M
7597        CALL SDMN(M,N,C,CV,KD,DF)
7598        CALL LPMNS(M,NM2,X,PM,PD)
7599        SW=0.0D0
7600        SU1=0.0D0
7601        DO 10 K=1,NM
7602           MK=M+2*(K-1)+IP
7603           SU1=SU1+DF(K)*PM(MK)
7604           IF (DABS(SW-SU1).LT.DABS(SU1)*EPS) GOTO 15
760510         SW=SU1
760615      S1F=(-1)**M*SU1
7607        SU1=0.0D0
7608        DO 20 K=1,NM
7609           MK=M+2*(K-1)+IP
7610           SU1=SU1+DF(K)*PD(MK)
7611           IF (DABS(SW-SU1).LT.DABS(SU1)*EPS) GOTO 25
761220         SW=SU1
761325      S1D=(-1)**M*SU1
7614        RETURN
7615        END
7616
7617
7618
7619C       **********************************
7620
7621        SUBROUTINE CHGUS(A,B,X,HU,ID)
7622C
7623C       ======================================================
7624C       Purpose: Compute confluent hypergeometric function
7625C                U(a,b,x) for small argument x
7626C       Input  : a  --- Parameter
7627C                b  --- Parameter ( b <> 0,-1,-2,...)
7628C                x  --- Argument
7629C       Output:  HU --- U(a,b,x)
7630C                ID --- Estimated number of significant digits
7631C       Routine called: GAMMA2 for computing gamma function
7632C       ======================================================
7633C
7634C       DLMF 13.2.42 with prefactors rewritten according to
7635C       DLMF 5.5.3, M(a, b, x) with DLMF 13.2.2
7636C
7637        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7638        ID=-100
7639        PI=3.141592653589793D0
7640        CALL GAMMA2(A,GA)
7641        CALL GAMMA2(B,GB)
7642        XG1=1.0D0+A-B
7643        CALL GAMMA2(XG1,GAB)
7644        XG2=2.0D0-B
7645        CALL GAMMA2(XG2,GB2)
7646        HU0=PI/DSIN(PI*B)
7647        R1=HU0/(GAB*GB)
7648        R2=HU0*X**(1.0D0-B)/(GA*GB2)
7649        HU=R1-R2
7650        HMAX=0.0D0
7651        HMIN=1.0D+300
7652        H0=0.0D0
7653        DO 10 J=1,150
7654           R1=R1*(A+J-1.0D0)/(J*(B+J-1.0D0))*X
7655           R2=R2*(A-B+J)/(J*(1.0D0-B+J))*X
7656           HU=HU+R1-R2
7657           HUA=DABS(HU)
7658           IF (HUA.GT.HMAX) HMAX=HUA
7659           IF (HUA.LT.HMIN) HMIN=HUA
7660           IF (DABS(HU-H0).LT.DABS(HU)*1.0D-15) GO TO 15
766110         H0=HU
766215      D1=LOG10(HMAX)
7663        D2=0.0D0
7664        IF (HMIN.NE.0.0) D2=LOG10(HMIN)
7665        ID=15-ABS(D1-D2)
7666        RETURN
7667        END
7668
7669
7670
7671C       **********************************
7672
7673        SUBROUTINE ITTH0(X,TTH)
7674C
7675C       ===========================================================
7676C       Purpose: Evaluate the integral H0(t)/t with respect to t
7677C                from x to infinity
7678C       Input :  x   --- Lower limit  ( x ≥ 0 )
7679C       Output:  TTH --- Integration of H0(t)/t from x to infinity
7680C       ===========================================================
7681C
7682        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7683        PI=3.141592653589793D0
7684        S=1.0D0
7685        R=1.0D0
7686        IF (X.LT.24.5D0) THEN
7687           DO 10 K=1,60
7688              R=-R*X*X*(2.0*K-1.0D0)/(2.0*K+1.0D0)**3
7689              S=S+R
7690              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 15
769110         CONTINUE
769215         TTH=PI/2.0D0-2.0D0/PI*X*S
7693        ELSE
7694           DO 20 K=1,10
7695              R=-R*(2.0*K-1.0D0)**3/((2.0*K+1.0D0)*X*X)
7696              S=S+R
7697              IF (DABS(R).LT.DABS(S)*1.0D-12) GO TO 25
769820            CONTINUE
769925         TTH=2.0D0/(PI*X)*S
7700           T=8.0D0/X
7701           XT=X+.25D0*PI
7702           F0=(((((.18118D-2*T-.91909D-2)*T+.017033D0)*T
7703     &        -.9394D-3)*T-.051445D0)*T-.11D-5)*T+.7978846D0
7704           G0=(((((-.23731D-2*T+.59842D-2)*T+.24437D-2)*T
7705     &        -.0233178D0)*T+.595D-4)*T+.1620695D0)*T
7706           TTY=(F0*DSIN(XT)-G0*DCOS(XT))/(DSQRT(X)*X)
7707           TTH=TTH+TTY
7708        ENDIF
7709        RETURN
7710        END
7711
7712C       **********************************
7713
7714        SUBROUTINE LGAMA(KF,X,GL)
7715C
7716C       ==================================================
7717C       Purpose: Compute gamma function Г(x) or ln[Г(x)]
7718C       Input:   x  --- Argument of Г(x) ( x > 0 )
7719C                KF --- Function code
7720C                       KF=1 for Г(x); KF=0 for ln[Г(x)]
7721C       Output:  GL --- Г(x) or ln[Г(x)]
7722C       ==================================================
7723C
7724        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7725        DIMENSION A(10)
7726        DATA A/8.333333333333333D-02,-2.777777777777778D-03,
7727     &         7.936507936507937D-04,-5.952380952380952D-04,
7728     &         8.417508417508418D-04,-1.917526917526918D-03,
7729     &         6.410256410256410D-03,-2.955065359477124D-02,
7730     &         1.796443723688307D-01,-1.39243221690590D+00/
7731        X0=X
7732        N=0
7733        IF (X.EQ.1.0.OR.X.EQ.2.0) THEN
7734           GL=0.0D0
7735           GO TO 20
7736        ELSE IF (X.LE.7.0) THEN
7737           N=INT(7-X)
7738           X0=X+N
7739        ENDIF
7740        X2=1.0D0/(X0*X0)
7741        XP=6.283185307179586477D0
7742        GL0=A(10)
7743        DO 10 K=9,1,-1
774410         GL0=GL0*X2+A(K)
7745        GL=GL0/X0+0.5D0*DLOG(XP)+(X0-.5D0)*DLOG(X0)-X0
7746        IF (X.LE.7.0) THEN
7747           DO 15 K=1,N
7748              GL=GL-DLOG(X0-1.0D0)
774915            X0=X0-1.0D0
7750        ENDIF
775120      IF (KF.EQ.1) GL=DEXP(GL)
7752        RETURN
7753        END
7754
7755C       **********************************
7756
7757        SUBROUTINE LQNA(N,X,QN,QD)
7758C
7759C       =====================================================
7760C       Purpose: Compute Legendre functions Qn(x) and Qn'(x)
7761C       Input :  x  --- Argument of Qn(x) ( -1 ≤ x ≤ 1 )
7762C                n  --- Degree of Qn(x) ( n = 0,1,2,… )
7763C       Output:  QN(n) --- Qn(x)
7764C                QD(n) --- Qn'(x)
7765C                ( 1.0D+300 stands for infinity )
7766C       =====================================================
7767C
7768        IMPLICIT DOUBLE PRECISION (Q,X)
7769        DIMENSION QN(0:N),QD(0:N)
7770        IF (DABS(X).EQ.1.0D0) THEN
7771           DO 10 K=0,N
7772              QN(K)=1.0D+300
7773              QD(K)=-1.0D+300
777410         CONTINUE
7775        ELSE IF (DABS(X).LT.1.0D0) THEN
7776           Q0=0.5D0*DLOG((1.0D0+X)/(1.0D0-X))
7777           Q1=X*Q0-1.0D0
7778           QN(0)=Q0
7779           QN(1)=Q1
7780           QD(0)=1.0D0/(1.0D0-X*X)
7781           QD(1)=QN(0)+X*QD(0)
7782           DO 15 K=2,N
7783              QF=((2*K-1)*X*Q1-(K-1)*Q0)/K
7784              QN(K)=QF
7785              QD(K)=(QN(K-1)-X*QF)*K/(1.0D0-X*X)
7786              Q0=Q1
778715            Q1=QF
7788        ENDIF
7789        RETURN
7790        END
7791
7792C       **********************************
7793
7794        SUBROUTINE DVLA(VA,X,PD)
7795C
7796C       ====================================================
7797C       Purpose: Compute parabolic cylinder functions Dv(x)
7798C                for large argument
7799C       Input:   x  --- Argument
7800C                va --- Order
7801C       Output:  PD --- Dv(x)
7802C       Routines called:
7803C             (1) VVLA for computing Vv(x) for large |x|
7804C             (2) GAMMA2 for computing Г(x)
7805C       ====================================================
7806C
7807        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7808        PI=3.141592653589793D0
7809        EPS=1.0D-12
7810        EP=DEXP(-.25*X*X)
7811        A0=DABS(X)**VA*EP
7812        R=1.0D0
7813        PD=1.0D0
7814        DO 10 K=1,16
7815           R=-0.5D0*R*(2.0*K-VA-1.0)*(2.0*K-VA-2.0)/(K*X*X)
7816           PD=PD+R
7817           IF (DABS(R/PD).LT.EPS) GO TO 15
781810      CONTINUE
781915      PD=A0*PD
7820        IF (X.LT.0.0D0) THEN
7821            X1=-X
7822            CALL VVLA(VA,X1,VL)
7823            CALL GAMMA2(-VA,GL)
7824            PD=PI*VL/GL+DCOS(PI*VA)*PD
7825        ENDIF
7826        RETURN
7827        END
7828
7829
7830
7831C       **********************************
7832
7833        SUBROUTINE IK01A(X,BI0,DI0,BI1,DI1,BK0,DK0,BK1,DK1)
7834C
7835C       =========================================================
7836C       Purpose: Compute modified Bessel functions I0(x), I1(1),
7837C                K0(x) and K1(x), and their derivatives
7838C       Input :  x   --- Argument ( x ≥ 0 )
7839C       Output:  BI0 --- I0(x)
7840C                DI0 --- I0'(x)
7841C                BI1 --- I1(x)
7842C                DI1 --- I1'(x)
7843C                BK0 --- K0(x)
7844C                DK0 --- K0'(x)
7845C                BK1 --- K1(x)
7846C                DK1 --- K1'(x)
7847C       =========================================================
7848C
7849        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
7850        DIMENSION A(12),B(12),A1(8)
7851        PI=3.141592653589793D0
7852        EL=0.5772156649015329D0
7853        X2=X*X
7854        IF (X.EQ.0.0D0) THEN
7855           BI0=1.0D0
7856           BI1=0.0D0
7857           BK0=1.0D+300
7858           BK1=1.0D+300
7859           DI0=0.0D0
7860           DI1=0.5D0
7861           DK0=-1.0D+300
7862           DK1=-1.0D+300
7863           RETURN
7864        ELSE IF (X.LE.18.0D0) THEN
7865           BI0=1.0D0
7866           R=1.0D0
7867           DO 15 K=1,50
7868              R=0.25D0*R*X2/(K*K)
7869              BI0=BI0+R
7870              IF (DABS(R/BI0).LT.1.0D-15) GO TO 20
787115         CONTINUE
787220         BI1=1.0D0
7873           R=1.0D0
7874           DO 25 K=1,50
7875              R=0.25D0*R*X2/(K*(K+1))
7876              BI1=BI1+R
7877              IF (DABS(R/BI1).LT.1.0D-15) GO TO 30
787825         CONTINUE
787930         BI1=0.5D0*X*BI1
7880        ELSE
7881           DATA A/0.125D0,7.03125D-2,
7882     &            7.32421875D-2,1.1215209960938D-1,
7883     &            2.2710800170898D-1,5.7250142097473D-1,
7884     &            1.7277275025845D0,6.0740420012735D0,
7885     &            2.4380529699556D01,1.1001714026925D02,
7886     &            5.5133589612202D02,3.0380905109224D03/
7887           DATA B/-0.375D0,-1.171875D-1,
7888     &            -1.025390625D-1,-1.4419555664063D-1,
7889     &            -2.7757644653320D-1,-6.7659258842468D-1,
7890     &            -1.9935317337513D0,-6.8839142681099D0,
7891     &            -2.7248827311269D01,-1.2159789187654D02,
7892     &            -6.0384407670507D02,-3.3022722944809D03/
7893           K0=12
7894           IF (X.GE.35.0) K0=9
7895           IF (X.GE.50.0) K0=7
7896           CA=DEXP(X)/DSQRT(2.0D0*PI*X)
7897           BI0=1.0D0
7898           XR=1.0D0/X
7899           DO 35 K=1,K0
790035            BI0=BI0+A(K)*XR**K
7901           BI0=CA*BI0
7902           BI1=1.0D0
7903           DO 40 K=1,K0
790440            BI1=BI1+B(K)*XR**K
7905           BI1=CA*BI1
7906        ENDIF
7907        WW=0.0D0
7908        IF (X.LE.9.0D0) THEN
7909           CT=-(DLOG(X/2.0D0)+EL)
7910           BK0=0.0D0
7911           W0=0.0D0
7912           R=1.0D0
7913           DO 65 K=1,50
7914              W0=W0+1.0D0/K
7915              R=0.25D0*R/(K*K)*X2
7916              BK0=BK0+R*(W0+CT)
7917              IF (DABS((BK0-WW)/BK0).LT.1.0D-15) GO TO 70
791865            WW=BK0
791970         BK0=BK0+CT
7920        ELSE
7921           DATA A1/0.125D0,0.2109375D0,
7922     &             1.0986328125D0,1.1775970458984D01,
7923     &             2.1461706161499D02,5.9511522710323D03,
7924     &             2.3347645606175D05,1.2312234987631D07/
7925           CB=0.5D0/X
7926           XR2=1.0D0/X2
7927           BK0=1.0D0
7928           DO 75 K=1,8
792975            BK0=BK0+A1(K)*XR2**K
7930           BK0=CB*BK0/BI0
7931        ENDIF
7932        BK1=(1.0D0/X-BI1*BK0)/BI0
7933        DI0=BI1
7934        DI1=BI0-BI1/X
7935        DK0=-BK1
7936        DK1=-BK0-BK1/X
7937        RETURN
7938        END
7939
7940C       **********************************
7941
7942        SUBROUTINE CPBDN(N,Z,CPB,CPD)
7943C
7944C       ==================================================
7945C       Purpose: Compute the parabolic cylinder functions
7946C                 Dn(z) and Dn'(z) for a complex argument
7947C       Input:   z --- Complex argument of Dn(z)
7948C                n --- Order of Dn(z)  ( n=0,±1,±2,… )
7949C       Output:  CPB(|n|) --- Dn(z)
7950C                CPD(|n|) --- Dn'(z)
7951C       Routines called:
7952C            (1) CPDSA for computing Dn(z) for a small |z|
7953C            (2) CPDLA for computing Dn(z) for a large |z|
7954C       ==================================================
7955C
7956        IMPLICIT DOUBLE PRECISION (A-B,D-H,O-Y)
7957        IMPLICIT COMPLEX*16 (C,Z)
7958        DIMENSION CPB(0:*),CPD(0:*)
7959        PI=3.141592653589793D0
7960        X=DBLE(Z)
7961        A0=CDABS(Z)
7962        C0=(0.0D0,0.0D0)
7963        CA0=CDEXP(-0.25D0*Z*Z)
7964        N0=0
7965        IF (N.GE.0) THEN
7966           CF0=CA0
7967           CF1=Z*CA0
7968           CPB(0)=CF0
7969           CPB(1)=CF1
7970           DO 10 K=2,N
7971              CF=Z*CF1-(K-1.0D0)*CF0
7972              CPB(K)=CF
7973              CF0=CF1
797410            CF1=CF
7975        ELSE
7976           N0=-N
7977           IF (X.LE.0.0.OR.CDABS(Z).EQ.0.0) THEN
7978              CF0=CA0
7979              CPB(0)=CF0
7980              Z1=-Z
7981              IF (A0.LE.7.0) THEN
7982                 CALL CPDSA(-1,Z1,CF1)
7983              ELSE
7984                 CALL CPDLA(-1,Z1,CF1)
7985              ENDIF
7986              CF1=DSQRT(2.0D0*PI)/CA0-CF1
7987              CPB(1)=CF1
7988              DO 15 K=2,N0
7989                 CF=(-Z*CF1+CF0)/(K-1.0D0)
7990                 CPB(K)=CF
7991                 CF0=CF1
799215               CF1=CF
7993           ELSE
7994              IF (A0.LE.3.0) THEN
7995                 CALL CPDSA(-N0,Z,CFA)
7996                 CPB(N0)=CFA
7997                 N1=N0+1
7998                 CALL CPDSA(-N1,Z,CFB)
7999                 CPB(N1)=CFB
8000                 NM1=N0-1
8001                 DO 20 K=NM1,0,-1
8002                    CF=Z*CFA+(K+1.0D0)*CFB
8003                    CPB(K)=CF
8004                    CFB=CFA
800520                  CFA=CF
8006              ELSE
8007                 M=100+ABS(N)
8008                 CFA=C0
8009                 CFB=(1.0D-30,0.0D0)
8010                 DO 25 K=M,0,-1
8011                    CF=Z*CFB+(K+1.0D0)*CFA
8012                    IF (K.LE.N0) CPB(K)=CF
8013                    CFA=CFB
801425                  CFB=CF
8015                 CS0=CA0/CF
8016                 DO 30 K=0,N0
801730                  CPB(K)=CS0*CPB(K)
8018              ENDIF
8019           ENDIF
8020        ENDIF
8021        CPD(0)=-0.5D0*Z*CPB(0)
8022        IF (N.GE.0) THEN
8023           DO 35 K=1,N
802435            CPD(K)=-0.5D0*Z*CPB(K)+K*CPB(K-1)
8025        ELSE
8026           DO 40 K=1,N0
802740            CPD(K)=0.5D0*Z*CPB(K)-CPB(K-1)
8028        ENDIF
8029        RETURN
8030        END
8031
8032
8033
8034C       **********************************
8035
8036        SUBROUTINE IK01B(X,BI0,DI0,BI1,DI1,BK0,DK0,BK1,DK1)
8037C
8038C       =========================================================
8039C       Purpose: Compute modified Bessel functions I0(x), I1(1),
8040C                K0(x) and K1(x), and their derivatives
8041C       Input :  x   --- Argument ( x ≥ 0 )
8042C       Output:  BI0 --- I0(x)
8043C                DI0 --- I0'(x)
8044C                BI1 --- I1(x)
8045C                DI1 --- I1'(x)
8046C                BK0 --- K0(x)
8047C                DK0 --- K0'(x)
8048C                BK1 --- K1(x)
8049C                DK1 --- K1'(x)
8050C       =========================================================
8051C
8052        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8053        IF (X.EQ.0.0D0) THEN
8054           BI0=1.0D0
8055           BI1=0.0D0
8056           BK0=1.0D+300
8057           BK1=1.0D+300
8058           DI0=0.0D0
8059           DI1=0.5D0
8060           DK0=-1.0D+300
8061           DK1=-1.0D+300
8062           RETURN
8063        ELSE IF (X.LE.3.75D0) THEN
8064           T=X/3.75D0
8065           T2=T*T
8066           BI0=(((((.0045813D0*T2+.0360768D0)*T2+.2659732D0)
8067     &         *T2+1.2067492D0)*T2+3.0899424D0)*T2
8068     &         +3.5156229D0)*T2+1.0D0
8069           BI1=X*((((((.00032411D0*T2+.00301532D0)*T2
8070     &         +.02658733D0)*T2+.15084934D0)*T2+.51498869D0)
8071     &         *T2+.87890594D0)*T2+.5D0)
8072        ELSE
8073           T=3.75D0/X
8074           BI0=((((((((.00392377D0*T-.01647633D0)*T
8075     &         +.02635537D0)*T-.02057706D0)*T+.916281D-2)*T
8076     &         -.157565D-2)*T+.225319D-2)*T+.01328592D0)*T
8077     &         +.39894228D0)*DEXP(X)/DSQRT(X)
8078           BI1=((((((((-.420059D-2*T+.01787654D0)*T
8079     &         -.02895312D0)*T+.02282967D0)*T-.01031555D0)*T
8080     &         +.163801D-2)*T-.00362018D0)*T-.03988024D0)*T
8081     &         +.39894228D0)*DEXP(X)/DSQRT(X)
8082        ENDIF
8083        IF (X.LE.2.0D0) THEN
8084           T=X/2.0D0
8085           T2=T*T
8086           BK0=(((((.0000074D0*T2+.0001075D0)*T2+.00262698D0)
8087     &         *T2+.0348859D0)*T2+.23069756D0)*T2+.4227842D0)
8088     &         *T2-.57721566D0-BI0*DLOG(T)
8089           BK1=((((((-.00004686D0*T2-.00110404D0)*T2
8090     &         -.01919402D0)*T2-.18156897D0)*T2-.67278579D0)
8091     &         *T2+.15443144D0)*T2+1.0D0)/X+BI1*DLOG(T)
8092        ELSE
8093           T=2.0D0/X
8094           T2=T*T
8095           BK0=((((((.00053208D0*T-.0025154D0)*T+.00587872D0)
8096     &         *T-.01062446D0)*T+.02189568D0)*T-.07832358D0)
8097     &         *T+1.25331414D0)*DEXP(-X)/DSQRT(X)
8098           BK1=((((((-.00068245D0*T+.00325614D0)*T
8099     &         -.00780353D0)*T+.01504268D0)*T-.0365562D0)*T+
8100     &         .23498619D0)*T+1.25331414D0)*DEXP(-X)/DSQRT(X)
8101        ENDIF
8102        DI0=BI1
8103        DI1=BI0-BI1/X
8104        DK0=-BK1
8105        DK1=-BK0-BK1/X
8106        RETURN
8107        END
8108
8109C       **********************************
8110
8111        SUBROUTINE BETA(P,Q,BT)
8112C
8113C       ==========================================
8114C       Purpose: Compute the beta function B(p,q)
8115C       Input :  p  --- Parameter  ( p > 0 )
8116C                q  --- Parameter  ( q > 0 )
8117C       Output:  BT --- B(p,q)
8118C       Routine called: GAMMA2 for computing Г(x)
8119C       ==========================================
8120C
8121        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8122        CALL GAMMA2(P,GP)
8123        CALL GAMMA2(Q,GQ)
8124        PPQ=P+Q
8125        CALL GAMMA2(PPQ,GPQ)
8126        BT=GP*GQ/GPQ
8127        RETURN
8128        END
8129
8130
8131
8132C       **********************************
8133
8134        SUBROUTINE LPN(N,X,PN,PD)
8135C
8136C       ===============================================
8137C       Purpose: Compute Legendre polynomials Pn(x)
8138C                and their derivatives Pn'(x)
8139C       Input :  x --- Argument of Pn(x)
8140C                n --- Degree of Pn(x) ( n = 0,1,...)
8141C       Output:  PN(n) --- Pn(x)
8142C                PD(n) --- Pn'(x)
8143C       ===============================================
8144C
8145        IMPLICIT DOUBLE PRECISION (P,X)
8146        DIMENSION PN(0:N),PD(0:N)
8147        PN(0)=1.0D0
8148        PN(1)=X
8149        PD(0)=0.0D0
8150        PD(1)=1.0D0
8151        P0=1.0D0
8152        P1=X
8153        DO 10 K=2,N
8154           PF=(2.0D0*K-1.0D0)/K*X*P1-(K-1.0D0)/K*P0
8155           PN(K)=PF
8156           IF (DABS(X).EQ.1.0D0) THEN
8157              PD(K)=0.5D0*X**(K+1)*K*(K+1.0D0)
8158           ELSE
8159              PD(K)=K*(P1-X*PF)/(1.0D0-X*X)
8160           ENDIF
8161           P0=P1
816210         P1=PF
8163        RETURN
8164        END
8165
8166C       **********************************
8167
8168        SUBROUTINE FCOEF(KD,M,Q,A,FC)
8169C
8170C       =====================================================
8171C       Purpose: Compute expansion coefficients for Mathieu
8172C                functions and modified Mathieu functions
8173C       Input :  m  --- Order of Mathieu functions
8174C                q  --- Parameter of Mathieu functions
8175C                KD --- Case code
8176C                       KD=1 for cem(x,q)  ( m = 0,2,4,...)
8177C                       KD=2 for cem(x,q)  ( m = 1,3,5,...)
8178C                       KD=3 for sem(x,q)  ( m = 1,3,5,...)
8179C                       KD=4 for sem(x,q)  ( m = 2,4,6,...)
8180C                A  --- Characteristic value of Mathieu
8181C                       functions for given m and q
8182C       Output:  FC(k) --- Expansion coefficients of Mathieu
8183C                       functions ( k= 1,2,...,KM )
8184C                       FC(1),FC(2),FC(3),... correspond to
8185C                       A0,A2,A4,... for KD=1 case, A1,A3,
8186C                       A5,... for KD=2 case, B1,B3,B5,...
8187C                       for KD=3 case and B2,B4,B6,... for
8188C                       KD=4 case
8189C       =====================================================
8190C
8191        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8192        DIMENSION FC(251)
8193        DO 5 I=1,251
81945          FC(I)=0.0D0
8195        IF (DABS(Q).LE.1.0D-7) THEN
8196C          Expansion up to order Q^1 (Abramowitz & Stegun 20.2.27-28)
8197           IF (KD.EQ.1) THEN
8198              JM=M/2 + 1
8199           ELSE IF (KD.EQ.2.OR.KD.EQ.3) THEN
8200              JM=(M-1)/2+1
8201           ELSE IF (KD.EQ.4) THEN
8202              JM=M/2
8203           END IF
8204C          Check for overflow
8205           IF (JM+1.GT.251) GOTO 6
8206C          Proceed using the simplest expansion
8207           IF (KD.EQ.1.OR.KD.EQ.2) THEN
8208              IF (M.EQ.0) THEN
8209                 FC(1) = 1/SQRT(2.0D0)
8210                 FC(2) = -Q/2.0D0/SQRT(2.0D0)
8211              ELSE IF (M.EQ.1) THEN
8212                 FC(1) = 1.0D0
8213                 FC(2) = -Q/8.0D0
8214              ELSE IF (M.EQ.2) THEN
8215                 FC(1) = Q/4.0D0
8216                 FC(2) = 1.0D0
8217                 FC(3) = -Q/12.0D0
8218              ELSE
8219                 FC(JM) = 1.0D0
8220                 FC(JM+1) = -Q/(4.0D0 * (M + 1))
8221                 FC(JM-1) =  Q/(4.0D0 * (M - 1))
8222              END IF
8223           ELSE IF (KD.EQ.3.OR.KD.EQ.4) THEN
8224              IF (M.EQ.1) THEN
8225                 FC(1) = 1.0D0
8226                 FC(2) = -Q/8.0D0
8227              ELSE IF (M.EQ.2) THEN
8228                 FC(1) = 1.0D0
8229                 FC(2) = -Q/12.0D0
8230              ELSE
8231                 FC(JM) = 1.0D0
8232                 FC(JM+1) = -Q/(4.0D0 * (M + 1))
8233                 FC(JM-1) =  Q/(4.0D0 * (M - 1))
8234              END IF
8235           ENDIF
8236           RETURN
8237        ELSE IF (Q.LE.1.0D0) THEN
8238           QM=7.5+56.1*SQRT(Q)-134.7*Q+90.7*SQRT(Q)*Q
8239        ELSE
8240           QM=17.0+3.1*SQRT(Q)-.126*Q+.0037*SQRT(Q)*Q
8241        ENDIF
8242        KM=INT(QM+0.5*M)
8243        IF (KM.GT.251) THEN
8244C          Overflow, generate NaNs
8245 6         FNAN=DNAN()
8246           DO 7 I=1,251
8247 7            FC(I)=FNAN
8248           RETURN
8249        ENDIF
8250        KB=0
8251        S=0.0D0
8252        F=1.0D-100
8253        U=0.0D0
8254        FC(KM)=0.0D0
8255        F2=0.0D0
8256        IF (KD.EQ.1) THEN
8257           DO 25 K=KM,3,-1
8258              V=U
8259              U=F
8260              F=(A-4.0D0*K*K)*U/Q-V
8261              IF (DABS(F).LT.DABS(FC(K+1))) THEN
8262                 KB=K
8263                 FC(1)=1.0D-100
8264                 SP=0.0D0
8265                 F3=FC(K+1)
8266                 FC(2)=A/Q*FC(1)
8267                 FC(3)=(A-4.0D0)*FC(2)/Q-2.0D0*FC(1)
8268                 U=FC(2)
8269                 F1=FC(3)
8270                 DO 15 I=3,KB
8271                    V=U
8272                    U=F1
8273                    F1=(A-4.0D0*(I-1.0D0)**2)*U/Q-V
8274                    FC(I+1)=F1
8275                    IF (I.EQ.KB) F2=F1
8276                    IF (I.NE.KB) SP=SP+F1*F1
827715               CONTINUE
8278                 SP=SP+2.0D0*FC(1)**2+FC(2)**2+FC(3)**2
8279                 SS=S+SP*(F3/F2)**2
8280                 S0=DSQRT(1.0D0/SS)
8281                 DO 20 J=1,KM
8282                    IF (J.LE.KB+1) THEN
8283                       FC(J)=S0*FC(J)*F3/F2
8284                    ELSE
8285                       FC(J)=S0*FC(J)
8286                    ENDIF
828720               CONTINUE
8288                 GO TO 85
8289              ELSE
8290                 FC(K)=F
8291                 S=S+F*F
8292              ENDIF
829325         CONTINUE
8294           FC(2)=Q*FC(3)/(A-4.0D0-2.0D0*Q*Q/A)
8295           FC(1)=Q/A*FC(2)
8296           S=S+2.0D0*FC(1)**2+FC(2)**2
8297           S0=DSQRT(1.0D0/S)
8298           DO 30 K=1,KM
829930            FC(K)=S0*FC(K)
8300        ELSE IF (KD.EQ.2.OR.KD.EQ.3) THEN
8301           DO 35 K=KM,3,-1
8302              V=U
8303              U=F
8304              F=(A-(2.0D0*K-1)**2)*U/Q-V
8305              IF (DABS(F).GE.DABS(FC(K))) THEN
8306                 FC(K-1)=F
8307                 S=S+F*F
8308              ELSE
8309                 KB=K
8310                 F3=FC(K)
8311                 GO TO 45
8312              ENDIF
831335         CONTINUE
8314           FC(1)=Q/(A-1.0D0-(-1)**KD*Q)*FC(2)
8315           S=S+FC(1)*FC(1)
8316           S0=DSQRT(1.0D0/S)
8317           DO 40 K=1,KM
831840            FC(K)=S0*FC(K)
8319           GO TO 85
832045         FC(1)=1.0D-100
8321           FC(2)=(A-1.0D0-(-1)**KD*Q)/Q*FC(1)
8322           SP=0.0D0
8323           U=FC(1)
8324           F1=FC(2)
8325           DO 50 I=2,KB-1
8326              V=U
8327              U=F1
8328              F1=(A-(2.0D0*I-1.0D0)**2)*U/Q-V
8329              IF (I.NE.KB-1) THEN
8330                 FC(I+1)=F1
8331                 SP=SP+F1*F1
8332              ELSE
8333                 F2=F1
8334              ENDIF
833550         CONTINUE
8336           SP=SP+FC(1)**2+FC(2)**2
8337           SS=S+SP*(F3/F2)**2
8338           S0=1.0D0/DSQRT(SS)
8339           DO 55 J=1,KM
8340              IF (J.LT.KB) FC(J)=S0*FC(J)*F3/F2
8341              IF (J.GE.KB) FC(J)=S0*FC(J)
834255         CONTINUE
8343        ELSE IF (KD.EQ.4) THEN
8344           DO 60 K=KM,3,-1
8345              V=U
8346              U=F
8347              F=(A-4.0D0*K*K)*U/Q-V
8348              IF (DABS(F).GE.DABS(FC(K))) THEN
8349                 FC(K-1)=F
8350                 S=S+F*F
8351              ELSE
8352                 KB=K
8353                 F3=FC(K)
8354                 GO TO 70
8355              ENDIF
835660         CONTINUE
8357           FC(1)=Q/(A-4.0D0)*FC(2)
8358           S=S+FC(1)*FC(1)
8359           S0=DSQRT(1.0D0/S)
8360           DO 65 K=1,KM
836165            FC(K)=S0*FC(K)
8362           GO TO 85
836370         FC(1)=1.0D-100
8364           FC(2)=(A-4.0D0)/Q*FC(1)
8365           SP=0.0D0
8366           U=FC(1)
8367           F1=FC(2)
8368           DO 75 I=2,KB-1
8369              V=U
8370              U=F1
8371              F1=(A-4.0D0*I*I)*U/Q-V
8372              IF (I.NE.KB-1) THEN
8373                 FC(I+1)=F1
8374                 SP=SP+F1*F1
8375              ELSE
8376                 F2=F1
8377              ENDIF
837875         CONTINUE
8379           SP=SP+FC(1)**2+FC(2)**2
8380           SS=S+SP*(F3/F2)**2
8381           S0=1.0D0/DSQRT(SS)
8382           DO 80 J=1,KM
8383              IF (J.LT.KB) FC(J)=S0*FC(J)*F3/F2
8384              IF (J.GE.KB) FC(J)=S0*FC(J)
838580         CONTINUE
8386        ENDIF
838785      IF (FC(1).LT.0.0D0) THEN
8388           DO 90 J=1,KM
838990            FC(J)=-FC(J)
8390        ENDIF
8391        RETURN
8392        END
8393
8394
8395
8396C       **********************************
8397
8398        SUBROUTINE SPHI(N,X,NM,SI,DI)
8399C
8400C       ========================================================
8401C       Purpose: Compute modified spherical Bessel functions
8402C                of the first kind, in(x) and in'(x)
8403C       Input :  x --- Argument of in(x)
8404C                n --- Order of in(x) ( n = 0,1,2,... )
8405C       Output:  SI(n) --- in(x)
8406C                DI(n) --- in'(x)
8407C                NM --- Highest order computed
8408C       Routines called:
8409C                MSTA1 and MSTA2 for computing the starting
8410C                point for backward recurrence
8411C       ========================================================
8412C
8413        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8414        DIMENSION SI(0:N),DI(0:N)
8415        NM=N
8416        IF (DABS(X).LT.1.0D-100) THEN
8417           DO 10 K=0,N
8418              SI(K)=0.0D0
841910            DI(K)=0.0D0
8420           SI(0)=1.0D0
8421           DI(1)=0.333333333333333D0
8422           RETURN
8423        ENDIF
8424        SI(0)=DSINH(X)/X
8425        SI(1)=-(DSINH(X)/X-DCOSH(X))/X
8426        SI0=SI(0)
8427        IF (N.GE.2) THEN
8428           M=MSTA1(X,200)
8429           IF (M.LT.N) THEN
8430              NM=M
8431           ELSE
8432              M=MSTA2(X,N,15)
8433           ENDIF
8434           F=0.0D0
8435           F0=0.0D0
8436           F1=1.0D0-100
8437           DO 15 K=M,0,-1
8438              F=(2.0D0*K+3.0D0)*F1/X+F0
8439              IF (K.LE.NM) SI(K)=F
8440              F0=F1
844115            F1=F
8442           CS=SI0/F
8443           DO 20 K=0,NM
844420            SI(K)=CS*SI(K)
8445        ENDIF
8446        DI(0)=SI(1)
8447        DO 25 K=1,NM
844825         DI(K)=SI(K-1)-(K+1.0D0)/X*SI(K)
8449        RETURN
8450        END
8451
8452
8453
8454C       **********************************
8455
8456        SUBROUTINE PBWA(A,X,W1F,W1D,W2F,W2D)
8457C
8458C       ======================================================
8459C       Purpose: Compute parabolic cylinder functions W(a,±x)
8460C                and their derivatives
8461C       Input  : a --- Parameter  ( 0 ≤ |a| ≤ 5 )
8462C                x --- Argument of W(a,±x)  ( 0 ≤ |x| ≤ 5 )
8463C       Output : W1F --- W(a,x)
8464C                W1D --- W'(a,x)
8465C                W2F --- W(a,-x)
8466C                W2D --- W'(a,-x)
8467C       Routine called:
8468C               CGAMA for computing complex gamma function
8469C       ======================================================
8470C
8471        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
8472        IMPLICIT COMPLEX *16 (C,Z)
8473        DIMENSION H(100),D(80)
8474        EPS=1.0D-15
8475        P0=0.59460355750136D0
8476        IF (A.EQ.0.0D0) THEN
8477           G1=3.625609908222D0
8478           G2=1.225416702465D0
8479        ELSE
8480           X1=0.25D0
8481           Y1=0.5D0*A
8482           CALL CGAMA(X1,Y1,1,UGR,UGI)
8483           G1=DSQRT(UGR*UGR+UGI*UGI)
8484           X2=0.75D0
8485           CALL CGAMA(X2,Y1,1,VGR,VGI)
8486           G2=DSQRT(VGR*VGR+VGI*VGI)
8487        ENDIF
8488        F1=DSQRT(G1/G2)
8489        F2=DSQRT(2.0D0*G2/G1)
8490        H0=1.0D0
8491        H1=A
8492        H(1)=A
8493        DO 10 L1=4,200,2
8494           M=L1/2
8495           HL=A*H1-0.25D0*(L1-2.0D0)*(L1-3.0D0)*H0
8496           H(M)=HL
8497           H0=H1
849810         H1=HL
8499        Y1F=1.0D0
8500        R=1.0D0
8501        DO 15 K=1,100
8502           R=0.5D0*R*X*X/(K*(2.0D0*K-1.0D0))
8503           R1=H(K)*R
8504           Y1F=Y1F+R1
8505           IF (DABS(R1).LE.EPS*DABS(Y1F).AND.K.GT.30) GO TO 20
850615      CONTINUE
850720      Y1D=A
8508        R=1.0D0
8509        DO 25 K=1,99
8510           R=0.5D0*R*X*X/(K*(2.0D0*K+1.0D0))
8511           R1=H(K+1)*R
8512           Y1D=Y1D+R1
8513           IF (DABS(R1).LE.EPS*DABS(Y1D).AND.K.GT.30) GO TO 30
851425      CONTINUE
851530      Y1D=X*Y1D
8516        D1=1.0D0
8517        D2=A
8518        D(1)=1.0D0
8519        D(2)=A
8520        DO 40 L2=5,160,2
8521           M=(L2+1)/2
8522           DL=A*D2-0.25D0*(L2-2.0D0)*(L2-3.0D0)*D1
8523           D(M)=DL
8524           D1=D2
852540         D2=DL
8526        Y2F=1.0D0
8527        R=1.0D0
8528        DO 45 K=1,79
8529           R=0.5D0*R*X*X/(K*(2.0D0*K+1.0D0))
8530           R1=D(K+1)*R
8531           Y2F=Y2F+R1
8532           IF (DABS(R1).LE.EPS*DABS(Y2F).AND.K.GT.30) GO TO 50
853345      CONTINUE
853450      Y2F=X*Y2F
8535        Y2D=1.0D0
8536        R=1.0D0
8537        DO 55 K=1,79
8538           R=0.5D0*R*X*X/(K*(2.0D0*K-1.0D0))
8539           R1=D(K+1)*R
8540           Y2D=Y2D+R1
8541           IF (DABS(R1).LE.EPS*DABS(Y2F).AND.K.GT.30) GO TO 60
854255      CONTINUE
854360      W1F=P0*(F1*Y1F-F2*Y2F)
8544        W2F=P0*(F1*Y1F+F2*Y2F)
8545        W1D=P0*(F1*Y1D-F2*Y2D)
8546        W2D=P0*(F1*Y1D+F2*Y2D)
8547        RETURN
8548        END
8549
8550
8551
8552C       **********************************
8553
8554        SUBROUTINE RMN1(M,N,C,X,DF,KD,R1F,R1D)
8555C
8556C       =======================================================
8557C       Purpose: Compute prolate and oblate spheroidal radial
8558C                functions of the first kind for given m, n,
8559C                c and x
8560C       Routines called:
8561C            (1) SCKB for computing expansion coefficients c2k
8562C            (2) SPHJ for computing the spherical Bessel
8563C                functions of the first kind
8564C       =======================================================
8565C
8566        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8567        DIMENSION CK(200),DF(200),SJ(0:251),DJ(0:251)
8568        EPS=1.0D-14
8569        IP=1
8570        NM1=INT((N-M)/2)
8571        IF (N-M.EQ.2*NM1) IP=0
8572        NM=25+NM1+INT(C)
8573        REG=1.0D0
8574        IF (M+NM.GT.80) REG=1.0D-200
8575        R0=REG
8576        DO 10 J=1,2*M+IP
857710         R0=R0*J
8578        R=R0
8579        SUC=R*DF(1)
8580        SW=0.0D0
8581        DO 15 K=2,NM
8582           R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
8583           SUC=SUC+R*DF(K)
8584           IF (K.GT.NM1.AND.DABS(SUC-SW).LT.DABS(SUC)*EPS) GO TO 20
858515         SW=SUC
858620      CONTINUE
8587        IF (X.EQ.0.0) THEN
8588           CALL SCKB(M,N,C,DF,CK)
8589           SUM=0.0D0
8590           SW1=0.0D0
8591           DO 25 J=1,NM
8592              SUM=SUM+CK(J)
8593              IF (DABS(SUM-SW1).LT.DABS(SUM)*EPS) GO TO 30
859425            SW1=SUM
859530         R1=1.0D0
8596           DO 35 J=1,(N+M+IP)/2
859735            R1=R1*(J+0.5D0*(N+M+IP))
8598           R2=1.0D0
8599           DO 40 J=1,M
860040            R2=2.0D0*C*R2*J
8601           R3=1.0D0
8602           DO 45 J=1,(N-M-IP)/2
860345            R3=R3*J
8604           SA0=(2.0*(M+IP)+1.0)*R1/(2.0**N*C**IP*R2*R3)
8605           IF (IP.EQ.0) THEN
8606              R1F=SUM/(SA0*SUC)*DF(1)*REG
8607              R1D=0.0D0
8608           ELSE IF (IP.EQ.1) THEN
8609              R1F=0.0D0
8610              R1D=SUM/(SA0*SUC)*DF(1)*REG
8611           ENDIF
8612           RETURN
8613        ENDIF
8614        CX=C*X
8615        NM2=2*NM+M
8616        CALL SPHJ(NM2,CX,NM2,SJ,DJ)
8617        A0=(1.0D0-KD/(X*X))**(0.5D0*M)/SUC
8618        R1F=0.0D0
8619        SW=0.0D0
8620        LG=0
8621        DO 50 K=1,NM
8622           L=2*K+M-N-2+IP
8623           IF (L.EQ.4*INT(L/4)) LG=1
8624           IF (L.NE.4*INT(L/4)) LG=-1
8625           IF (K.EQ.1) THEN
8626              R=R0
8627           ELSE
8628              R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
8629           ENDIF
8630           NP=M+2*K-2+IP
8631           R1F=R1F+LG*R*DF(K)*SJ(NP)
8632           IF (K.GT.NM1.AND.DABS(R1F-SW).LT.DABS(R1F)*EPS) GO TO 55
863350         SW=R1F
863455      R1F=R1F*A0
8635        B0=KD*M/X**3.0D0/(1.0-KD/(X*X))*R1F
8636        SUD=0.0D0
8637        SW=0.0D0
8638        DO 60 K=1,NM
8639           L=2*K+M-N-2+IP
8640           IF (L.EQ.4*INT(L/4)) LG=1
8641           IF (L.NE.4*INT(L/4)) LG=-1
8642           IF (K.EQ.1) THEN
8643              R=R0
8644           ELSE
8645              R=R*(M+K-1.0)*(M+K+IP-1.5D0)/(K-1.0D0)/(K+IP-1.5D0)
8646           ENDIF
8647           NP=M+2*K-2+IP
8648           SUD=SUD+LG*R*DF(K)*DJ(NP)
8649           IF (K.GT.NM1.AND.DABS(SUD-SW).LT.DABS(SUD)*EPS) GO TO 65
865060         SW=SUD
865165      R1D=B0+A0*C*SUD
8652        RETURN
8653        END
8654
8655
8656
8657C       **********************************
8658
8659        SUBROUTINE DVSA(VA,X,PD)
8660C
8661C       ===================================================
8662C       Purpose: Compute parabolic cylinder function Dv(x)
8663C                for small argument
8664C       Input:   x  --- Argument
8665C                va --- Order
8666C       Output:  PD --- Dv(x)
8667C       Routine called: GAMMA2 for computing Г(x)
8668C       ===================================================
8669C
8670        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8671        EPS=1.0D-15
8672        PI=3.141592653589793D0
8673        SQ2=DSQRT(2.0D0)
8674        EP=DEXP(-.25D0*X*X)
8675        VA0=0.5D0*(1.0D0-VA)
8676        IF (VA.EQ.0.0) THEN
8677           PD=EP
8678        ELSE
8679           IF (X.EQ.0.0) THEN
8680              IF (VA0.LE.0.0.AND.VA0.EQ.INT(VA0)) THEN
8681                 PD=0.0D0
8682              ELSE
8683                 CALL GAMMA2(VA0,GA0)
8684                 PD=DSQRT(PI)/(2.0D0**(-.5D0*VA)*GA0)
8685              ENDIF
8686           ELSE
8687              CALL GAMMA2(-VA,G1)
8688              A0=2.0D0**(-0.5D0*VA-1.0D0)*EP/G1
8689              VT=-.5D0*VA
8690              CALL GAMMA2(VT,G0)
8691              PD=G0
8692              R=1.0D0
8693              DO 10 M=1,250
8694                 VM=.5D0*(M-VA)
8695                 CALL GAMMA2(VM,GM)
8696                 R=-R*SQ2*X/M
8697                 R1=GM*R
8698                 PD=PD+R1
8699                 IF (DABS(R1).LT.DABS(PD)*EPS) GO TO 15
870010            CONTINUE
870115            PD=A0*PD
8702           ENDIF
8703        ENDIF
8704        RETURN
8705        END
8706
8707
8708
8709C       **********************************
8710
8711        SUBROUTINE E1Z(Z,CE1)
8712C
8713C       ====================================================
8714C       Purpose: Compute complex exponential integral E1(z)
8715C       Input :  z   --- Argument of E1(z)
8716C       Output:  CE1 --- E1(z)
8717C       ====================================================
8718C
8719        IMPLICIT COMPLEX*16 (C,Z)
8720        IMPLICIT DOUBLE PRECISION (A,D-H,O-Y)
8721        PI=3.141592653589793D0
8722        EL=0.5772156649015328D0
8723        X=DBLE(Z)
8724        A0=CDABS(Z)
8725C       Continued fraction converges slowly near negative real axis,
8726C       so use power series in a wedge around it until radius 40.0
8727        XT=-2*DABS(DIMAG(Z))
8728        IF (A0.EQ.0.0D0) THEN
8729           CE1=(1.0D+300,0.0D0)
8730        ELSE IF (A0.LE.5.0.OR.X.LT.XT.AND.A0.LT.40.0) THEN
8731C          Power series
8732           CE1=(1.0D0,0.0D0)
8733           CR=(1.0D0,0.0D0)
8734           DO 10 K=1,500
8735              CR=-CR*K*Z/(K+1.0D0)**2
8736              CE1=CE1+CR
8737              IF (CDABS(CR).LE.CDABS(CE1)*1.0D-15) GO TO 15
873810         CONTINUE
873915         CONTINUE
8740           IF (X.LE.0.0.AND.DIMAG(Z).EQ.0.0) THEN
8741C     Careful on the branch cut -- use the sign of the imaginary part
8742C     to get the right sign on the factor if pi.
8743              CE1=-EL-CDLOG(-Z)+Z*CE1-DSIGN(PI,DIMAG(Z))*(0.0D0,1.0D0)
8744           ELSE
8745              CE1=-EL-CDLOG(Z)+Z*CE1
8746           ENDIF
8747        ELSE
8748C          Continued fraction https://dlmf.nist.gov/6.9
8749C
8750C                           1     1     1     2     2     3     3
8751C          E1 = exp(-z) * ----- ----- ----- ----- ----- ----- ----- ...
8752C                         Z +   1 +   Z +   1 +   Z +   1 +   Z +
8753           ZC=0D0
8754           ZD=1/Z
8755           ZDC=1*ZD
8756           ZC=ZC + ZDC
8757           DO 20 K=1,500
8758              ZD=1/(ZD*K + 1)
8759              ZDC=(1*ZD - 1)*ZDC
8760              ZC=ZC + ZDC
8761
8762              ZD=1/(ZD*K + Z)
8763              ZDC=(Z*ZD - 1)*ZDC
8764              ZC=ZC + ZDC
8765
8766              IF (CDABS(ZDC).LE.CDABS(ZC)*1.0D-15.AND.K.GT.20) GO TO 25
876720         CONTINUE
876825         CE1=CDEXP(-Z)*ZC
8769           IF (X.LE.0.0.AND.DIMAG(Z).EQ.0.0) CE1=CE1-PI*(0.0D0,1.0D0)
8770        ENDIF
8771        RETURN
8772        END
8773
8774C       **********************************
8775
8776        SUBROUTINE ITJYB(X,TJ,TY)
8777C
8778C       =======================================================
8779C       Purpose: Integrate Bessel functions J0(t) and Y0(t)
8780C                with respect to t from 0 to x ( x ≥ 0 )
8781C       Input :  x  --- Upper limit of the integral
8782C       Output:  TJ --- Integration of J0(t) from 0 to x
8783C                TY --- Integration of Y0(t) from 0 to x
8784C       =======================================================
8785C
8786        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8787        PI=3.141592653589793D0
8788        IF (X.EQ.0.0D0) THEN
8789           TJ=0.0D0
8790           TY=0.0D0
8791        ELSE IF (X.LE.4.0D0) THEN
8792           X1=X/4.0D0
8793           T=X1*X1
8794           TJ=(((((((-.133718D-3*T+.2362211D-2)*T
8795     &        -.025791036D0)*T+.197492634D0)*T-1.015860606D0)
8796     &        *T+3.199997842D0)*T-5.333333161D0)*T+4.0D0)*X1
8797           TY=((((((((.13351D-4*T-.235002D-3)*T+.3034322D-2)*
8798     &        T-.029600855D0)*T+.203380298D0)*T-.904755062D0)
8799     &        *T+2.287317974D0)*T-2.567250468D0)*T
8800     &        +1.076611469D0)*X1
8801           TY=2.0D0/PI*DLOG(X/2.0D0)*TJ-TY
8802        ELSE IF (X.LE.8.0D0) THEN
8803           XT=X-.25D0*PI
8804           T=16.0D0/(X*X)
8805           F0=((((((.1496119D-2*T-.739083D-2)*T+.016236617D0)
8806     &        *T-.022007499D0)*T+.023644978D0)
8807     &        *T-.031280848D0)*T+.124611058D0)*4.0D0/X
8808           G0=(((((.1076103D-2*T-.5434851D-2)*T+.01242264D0)
8809     &        *T-.018255209)*T+.023664841D0)*T-.049635633D0)
8810     &        *T+.79784879D0
8811           TJ=1.0D0-(F0*DCOS(XT)-G0*DSIN(XT))/DSQRT(X)
8812           TY=-(F0*DSIN(XT)+G0*DCOS(XT))/DSQRT(X)
8813        ELSE
8814           T=64.0D0/(X*X)
8815           XT=X-.25D0*PI
8816           F0=(((((((-.268482D-4*T+.1270039D-3)*T
8817     &        -.2755037D-3)*T+.3992825D-3)*T-.5366169D-3)*T
8818     &        +.10089872D-2)*T-.40403539D-2)*T+.0623347304D0)
8819     &        *8.0D0/X
8820           G0=((((((-.226238D-4*T+.1107299D-3)*T-.2543955D-3)
8821     &        *T+.4100676D-3)*T-.6740148D-3)*T+.17870944D-2)
8822     &        *T-.01256424405D0)*T+.79788456D0
8823           TJ=1.0D0-(F0*DCOS(XT)-G0*DSIN(XT))/DSQRT(X)
8824           TY=-(F0*DSIN(XT)+G0*DCOS(XT))/DSQRT(X)
8825        ENDIF
8826        RETURN
8827        END
8828
8829
8830C       **********************************
8831
8832        SUBROUTINE CHGUL(A,B,X,HU,ID)
8833C
8834C       =======================================================
8835C       Purpose: Compute the confluent hypergeometric function
8836C                U(a,b,x) for large argument x
8837C       Input  : a  --- Parameter
8838C                b  --- Parameter
8839C                x  --- Argument
8840C       Output:  HU --- U(a,b,x)
8841C                ID --- Estimated number of significant digits
8842C       =======================================================
8843C
8844        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8845        LOGICAL IL1,IL2
8846        ID=-100
8847        AA=A-B+1.0D0
8848        IL1=A.EQ.INT(A).AND.A.LE.0.0
8849        IL2=AA.EQ.INT(AA).AND.AA.LE.0.0
8850        NM=0
8851        IF (IL1) NM=ABS(A)
8852        IF (IL2) NM=ABS(AA)
8853C       IL1: DLMF 13.2.7 with k=-s-a
8854C       IL2: DLMF 13.2.8
8855        IF (IL1.OR.IL2) THEN
8856           HU=1.0D0
8857           R=1.0D0
8858           DO 10 K=1,NM
8859              R=-R*(A+K-1.0D0)*(A-B+K)/(K*X)
8860              HU=HU+R
886110         CONTINUE
8862           HU=X**(-A)*HU
8863           ID=10
8864        ELSE
8865C       DLMF 13.7.3
8866           HU=1.0D0
8867           R=1.0D0
8868           DO 15 K=1,25
8869              R=-R*(A+K-1.0D0)*(A-B+K)/(K*X)
8870              RA=DABS(R)
8871              IF (K.GT.5.AND.RA.GE.R0.OR.RA.LT.1.0D-15) GO TO 20
8872              R0=RA
887315            HU=HU+R
887420         ID=ABS(LOG10(RA))
8875           HU=X**(-A)*HU
8876        ENDIF
8877        RETURN
8878        END
8879
8880
8881
8882C       **********************************
8883
8884        SUBROUTINE GMN(M,N,C,X,BK,GF,GD)
8885C
8886C       ===========================================================
8887C       Purpose: Compute gmn(-ic,ix) and its derivative for oblate
8888C                radial functions with a small argument
8889C       ===========================================================
8890C
8891        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8892        DIMENSION BK(200)
8893        EPS=1.0D-14
8894        IP=1
8895        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
8896        NM=25+INT(0.5*(N-M)+C)
8897        XM=(1.0D0+X*X)**(-0.5D0*M)
8898        GF0=0.0D0
8899        GW=0.0D0
8900        DO 10 K=1,NM
8901           GF0=GF0+BK(K)*X**(2.0*K-2.0)
8902           IF (DABS((GF0-GW)/GF0).LT.EPS.AND.K.GE.10) GO TO 15
890310         GW=GF0
890415      GF=XM*GF0*X**(1-IP)
8905        GD1=-M*X/(1.0D0+X*X)*GF
8906        GD0=0.0D0
8907        DO 20 K=1,NM
8908           IF (IP.EQ.0) THEN
8909              GD0=GD0+(2.0D0*K-1.0)*BK(K)*X**(2.0*K-2.0)
8910           ELSE
8911              GD0=GD0+2.0D0*K*BK(K+1)*X**(2.0*K-1.0)
8912           ENDIF
8913           IF (DABS((GD0-GW)/GD0).LT.EPS.AND.K.GE.10) GO TO 25
891420         GW=GD0
891525      GD=GD1+XM*GD0
8916        RETURN
8917        END
8918
8919
8920
8921C       **********************************
8922
8923        SUBROUTINE ITJYA(X,TJ,TY)
8924C
8925C       ==========================================================
8926C       Purpose: Integrate Bessel functions J0(t) & Y0(t) with
8927C                respect to t from 0 to x
8928C       Input :  x  --- Upper limit of the integral ( x >= 0 )
8929C       Output:  TJ --- Integration of J0(t) from 0 to x
8930C                TY --- Integration of Y0(t) from 0 to x
8931C       =======================================================
8932C
8933        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
8934        DIMENSION A(18)
8935        PI=3.141592653589793D0
8936        EL=.5772156649015329D0
8937        EPS=1.0D-12
8938        IF (X.EQ.0.0D0) THEN
8939           TJ=0.0D0
8940           TY=0.0D0
8941        ELSE IF (X.LE.20.0D0) THEN
8942           X2=X*X
8943           TJ=X
8944           R=X
8945           DO 10 K=1,60
8946              R=-.25D0*R*(2*K-1.0D0)/(2*K+1.0D0)/(K*K)*X2
8947              TJ=TJ+R
8948              IF (DABS(R).LT.DABS(TJ)*EPS) GO TO 15
894910         CONTINUE
895015         TY1=(EL+DLOG(X/2.0D0))*TJ
8951           RS=0.0D0
8952           TY2=1.0D0
8953           R=1.0D0
8954           DO 20 K=1,60
8955              R=-.25D0*R*(2*K-1.0D0)/(2*K+1.0D0)/(K*K)*X2
8956              RS=RS+1.0D0/K
8957              R2=R*(RS+1.0D0/(2.0D0*K+1.0D0))
8958              TY2=TY2+R2
8959              IF (DABS(R2).LT.DABS(TY2)*EPS) GO TO 25
896020         CONTINUE
896125         TY=(TY1-X*TY2)*2.0D0/PI
8962        ELSE
8963           A0=1.0D0
8964           A1=5.0D0/8.0D0
8965           A(1)=A1
8966           DO 30 K=1,16
8967              AF=((1.5D0*(K+.5D0)*(K+5.0D0/6.0D0)*A1-.5D0
8968     &           *(K+.5D0)*(K+.5D0)*(K-.5D0)*A0))/(K+1.0D0)
8969              A(K+1)=AF
8970              A0=A1
897130            A1=AF
8972           BF=1.0D0
8973           R=1.0D0
8974           DO 35 K=1,8
8975              R=-R/(X*X)
897635            BF=BF+A(2*K)*R
8977           BG=A(1)/X
8978           R=1.0D0/X
8979           DO 40 K=1,8
8980              R=-R/(X*X)
898140            BG=BG+A(2*K+1)*R
8982           XP=X+.25D0*PI
8983           RC=DSQRT(2.0D0/(PI*X))
8984           TJ=1.0D0-RC*(BF*DCOS(XP)+BG*DSIN(XP))
8985           TY=RC*(BG*DCOS(XP)-BF*DSIN(XP))
8986        ENDIF
8987        RETURN
8988        END
8989
8990C       **********************************
8991
8992        SUBROUTINE RCTY(N,X,NM,RY,DY)
8993C
8994C       ========================================================
8995C       Purpose: Compute Riccati-Bessel functions of the second
8996C                kind and their derivatives
8997C       Input:   x --- Argument of Riccati-Bessel function
8998C                n --- Order of yn(x)
8999C       Output:  RY(n) --- x·yn(x)
9000C                DY(n) --- [x·yn(x)]'
9001C                NM --- Highest order computed
9002C       ========================================================
9003C
9004        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9005        DIMENSION RY(0:N),DY(0:N)
9006        NM=N
9007        IF (X.LT.1.0D-60) THEN
9008           DO 10 K=0,N
9009              RY(K)=-1.0D+300
901010            DY(K)=1.0D+300
9011           RY(0)=-1.0D0
9012           DY(0)=0.0D0
9013           RETURN
9014        ENDIF
9015        RY(0)=-DCOS(X)
9016        RY(1)=RY(0)/X-DSIN(X)
9017        RF0=RY(0)
9018        RF1=RY(1)
9019        DO 15 K=2,N
9020           RF2=(2.0D0*K-1.0D0)*RF1/X-RF0
9021           IF (DABS(RF2).GT.1.0D+300) GO TO 20
9022           RY(K)=RF2
9023           RF0=RF1
902415         RF1=RF2
902520      NM=K-1
9026        DY(0)=DSIN(X)
9027        DO 25 K=1,NM
902825         DY(K)=-K*RY(K)/X+RY(K-1)
9029        RETURN
9030        END
9031
9032C       **********************************
9033
9034        SUBROUTINE LPNI(N,X,PN,PD,PL)
9035C
9036C       =====================================================
9037C       Purpose: Compute Legendre polynomials Pn(x), Pn'(x)
9038C                and the integral of Pn(t) from 0 to x
9039C       Input :  x --- Argument of Pn(x)
9040C                n --- Degree of Pn(x) ( n = 0,1,... )
9041C       Output:  PN(n) --- Pn(x)
9042C                PD(n) --- Pn'(x)
9043C                PL(n) --- Integral of Pn(t) from 0 to x
9044C       =====================================================
9045C
9046        IMPLICIT DOUBLE PRECISION (P,R,X)
9047        DIMENSION PN(0:N),PD(0:N),PL(0:N)
9048        PN(0)=1.0D0
9049        PN(1)=X
9050        PD(0)=0.0D0
9051        PD(1)=1.0D0
9052        PL(0)=X
9053        PL(1)=0.5D0*X*X
9054        P0=1.0D0
9055        P1=X
9056        DO 15 K=2,N
9057           PF=(2.0D0*K-1.0D0)/K*X*P1-(K-1.0D0)/K*P0
9058           PN(K)=PF
9059           IF (DABS(X).EQ.1.0D0) THEN
9060              PD(K)=0.5D0*X**(K+1)*K*(K+1.0D0)
9061           ELSE
9062              PD(K)=K*(P1-X*PF)/(1.0D0-X*X)
9063           ENDIF
9064           PL(K)=(X*PN(K)-PN(K-1))/(K+1.0D0)
9065           P0=P1
9066           P1=PF
9067           IF (K.EQ.2*INT(K/2)) GO TO 15
9068           R=1.0D0/(K+1.0D0)
9069           N1=(K-1)/2
9070           DO 10 J=1,N1
907110            R=(0.5D0/J-1.0D0)*R
9072           PL(K)=PL(K)+R
907315      CONTINUE
9074        RETURN
9075        END
9076
9077C       **********************************
9078
9079        SUBROUTINE KLVNA(X,BER,BEI,GER,GEI,DER,DEI,HER,HEI)
9080C
9081C       ======================================================
9082C       Purpose: Compute Kelvin functions ber x, bei x, ker x
9083C                and kei x, and their derivatives  ( x > 0 )
9084C       Input :  x   --- Argument of Kelvin functions
9085C       Output:  BER --- ber x
9086C                BEI --- bei x
9087C                GER --- ker x
9088C                GEI --- kei x
9089C                DER --- ber'x
9090C                DEI --- bei'x
9091C                HER --- ker'x
9092C                HEI --- kei'x
9093C       ================================================
9094C
9095        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9096        PI=3.141592653589793D0
9097        EL=.5772156649015329D0
9098        EPS=1.0D-15
9099        IF (X.EQ.0.0D0) THEN
9100           BER=1.0D0
9101           BEI=0.0D0
9102           GER=1.0D+300
9103           GEI=-0.25D0*PI
9104           DER=0.0D0
9105           DEI=0.0D0
9106           HER=-1.0D+300
9107           HEI=0.0D0
9108           RETURN
9109        ENDIF
9110        X2=0.25D0*X*X
9111        X4=X2*X2
9112        IF (DABS(X).LT.10.0D0) THEN
9113           BER=1.0D0
9114           R=1.0D0
9115           DO 10 M=1,60
9116              R=-0.25D0*R/(M*M)/(2.0D0*M-1.0D0)**2*X4
9117              BER=BER+R
9118              IF (DABS(R).LT.DABS(BER)*EPS) GO TO 15
911910         CONTINUE
912015         BEI=X2
9121           R=X2
9122           DO 20 M=1,60
9123              R=-0.25D0*R/(M*M)/(2.0D0*M+1.0D0)**2*X4
9124              BEI=BEI+R
9125              IF (DABS(R).LT.DABS(BEI)*EPS) GO TO 25
912620         CONTINUE
912725         GER=-(DLOG(X/2.0D0)+EL)*BER+0.25D0*PI*BEI
9128           R=1.0D0
9129           GS=0.0D0
9130           DO 30 M=1,60
9131              R=-0.25D0*R/(M*M)/(2.0D0*M-1.0D0)**2*X4
9132              GS=GS+1.0D0/(2.0D0*M-1.0D0)+1.0D0/(2.0D0*M)
9133              GER=GER+R*GS
9134              IF (DABS(R*GS).LT.DABS(GER)*EPS) GO TO 35
913530         CONTINUE
913635         GEI=X2-(DLOG(X/2.0D0)+EL)*BEI-0.25D0*PI*BER
9137           R=X2
9138           GS=1.0D0
9139           DO 40 M=1,60
9140              R=-0.25D0*R/(M*M)/(2.0D0*M+1.0D0)**2*X4
9141              GS=GS+1.0D0/(2.0D0*M)+1.0D0/(2.0D0*M+1.0D0)
9142              GEI=GEI+R*GS
9143              IF (DABS(R*GS).LT.DABS(GEI)*EPS) GO TO 45
914440         CONTINUE
914545         DER=-0.25D0*X*X2
9146           R=DER
9147           DO 50 M=1,60
9148              R=-0.25D0*R/M/(M+1.0D0)/(2.0D0*M+1.0D0)**2*X4
9149              DER=DER+R
9150              IF (DABS(R).LT.DABS(DER)*EPS) GO TO 55
915150         CONTINUE
915255         DEI=0.5D0*X
9153           R=DEI
9154           DO 60 M=1,60
9155              R=-0.25D0*R/(M*M)/(2.D0*M-1.D0)/(2.D0*M+1.D0)*X4
9156              DEI=DEI+R
9157              IF (DABS(R).LT.DABS(DEI)*EPS) GO TO 65
915860            CONTINUE
915965         R=-0.25D0*X*X2
9160           GS=1.5D0
9161           HER=1.5D0*R-BER/X-(DLOG(X/2.D0)+EL)*DER+0.25*PI*DEI
9162           DO 70 M=1,60
9163              R=-0.25D0*R/M/(M+1.0D0)/(2.0D0*M+1.0D0)**2*X4
9164              GS=GS+1.0D0/(2*M+1.0D0)+1.0D0/(2*M+2.0D0)
9165              HER=HER+R*GS
9166              IF (DABS(R*GS).LT.DABS(HER)*EPS) GO TO 75
916770         CONTINUE
916875         R=0.5D0*X
9169           GS=1.0D0
9170           HEI=0.5D0*X-BEI/X-(DLOG(X/2.D0)+EL)*DEI-0.25*PI*DER
9171           DO 80 M=1,60
9172              R=-0.25D0*R/(M*M)/(2*M-1.0D0)/(2*M+1.0D0)*X4
9173              GS=GS+1.0D0/(2.0D0*M)+1.0D0/(2*M+1.0D0)
9174              HEI=HEI+R*GS
9175              IF (DABS(R*GS).LT.DABS(HEI)*EPS) RETURN
917680         CONTINUE
9177        ELSE
9178           PP0=1.0D0
9179           PN0=1.0D0
9180           QP0=0.0D0
9181           QN0=0.0D0
9182           R0=1.0D0
9183           KM=18
9184           IF (DABS(X).GE.40.0) KM=10
9185           FAC=1.0D0
9186           DO 85 K=1,KM
9187              FAC=-FAC
9188              XT=0.25D0*K*PI-INT(0.125D0*K)*2.0D0*PI
9189              CS=COS(XT)
9190              SS=SIN(XT)
9191              R0=0.125D0*R0*(2.0D0*K-1.0D0)**2/K/X
9192              RC=R0*CS
9193              RS=R0*SS
9194              PP0=PP0+RC
9195              PN0=PN0+FAC*RC
9196              QP0=QP0+RS
919785            QN0=QN0+FAC*RS
9198           XD=X/DSQRT(2.0D0)
9199           XE1=DEXP(XD)
9200           XE2=DEXP(-XD)
9201           XC1=1.D0/DSQRT(2.0D0*PI*X)
9202           XC2=DSQRT(.5D0*PI/X)
9203           CP0=DCOS(XD+0.125D0*PI)
9204           CN0=DCOS(XD-0.125D0*PI)
9205           SP0=DSIN(XD+0.125D0*PI)
9206           SN0=DSIN(XD-0.125D0*PI)
9207           GER=XC2*XE2*(PN0*CP0-QN0*SP0)
9208           GEI=XC2*XE2*(-PN0*SP0-QN0*CP0)
9209           BER=XC1*XE1*(PP0*CN0+QP0*SN0)-GEI/PI
9210           BEI=XC1*XE1*(PP0*SN0-QP0*CN0)+GER/PI
9211           PP1=1.0D0
9212           PN1=1.0D0
9213           QP1=0.0D0
9214           QN1=0.0D0
9215           R1=1.0D0
9216           FAC=1.0D0
9217           DO 90 K=1,KM
9218              FAC=-FAC
9219              XT=0.25D0*K*PI-INT(0.125D0*K)*2.0D0*PI
9220              CS=DCOS(XT)
9221              SS=DSIN(XT)
9222              R1=0.125D0*R1*(4.D0-(2.0D0*K-1.0D0)**2)/K/X
9223              RC=R1*CS
9224              RS=R1*SS
9225              PP1=PP1+FAC*RC
9226              PN1=PN1+RC
9227              QP1=QP1+FAC*RS
9228              QN1=QN1+RS
922990         CONTINUE
9230           HER=XC2*XE2*(-PN1*CN0+QN1*SN0)
9231           HEI=XC2*XE2*(PN1*SN0+QN1*CN0)
9232           DER=XC1*XE1*(PP1*CP0+QP1*SP0)-HEI/PI
9233           DEI=XC1*XE1*(PP1*SP0-QP1*CP0)+HER/PI
9234        ENDIF
9235        RETURN
9236        END
9237
9238C       **********************************
9239
9240        SUBROUTINE CHGUBI(A,B,X,HU,ID)
9241C
9242C       ======================================================
9243C       Purpose: Compute confluent hypergeometric function
9244C                U(a,b,x) with integer b ( b = ±1,±2,... )
9245C       Input  : a  --- Parameter
9246C                b  --- Parameter
9247C                x  --- Argument
9248C       Output:  HU --- U(a,b,x)
9249C                ID --- Estimated number of significant digits
9250C       Routines called:
9251C            (1) GAMMA2 for computing gamma function Г(x)
9252C            (2) PSI_SPEC for computing psi function
9253C       ======================================================
9254C
9255        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9256        ID=-100
9257        EL=0.5772156649015329D0
9258        N=ABS(B-1)
9259        RN1=1.0D0
9260        RN=1.0D0
9261        DO 10 J=1,N
9262           RN=RN*J
9263           IF (J.EQ.N-1) RN1=RN
926410      CONTINUE
9265        CALL PSI_SPEC(A,PS)
9266        CALL GAMMA2(A,GA)
9267        IF (B.GT.0.0) THEN
9268           A0=A
9269           A1=A-N
9270           A2=A1
9271           CALL GAMMA2(A1,GA1)
9272           UA=(-1)**(N-1)/(RN*GA1)
9273           UB=RN1/GA*X**(-N)
9274        ELSE
9275           A0=A+N
9276           A1=A0
9277           A2=A
9278           CALL GAMMA2(A1,GA1)
9279           UA=(-1)**(N-1)/(RN*GA)*X**N
9280           UB=RN1/GA1
9281        ENDIF
9282        HM1=1.0D0
9283        R=1.0D0
9284        HMAX=0.0D0
9285        HMIN=1.0D+300
9286        H0=0D0
9287        DO 15 K=1,150
9288           R=R*(A0+K-1.0D0)*X/((N+K)*K)
9289           HM1=HM1+R
9290           HU1=DABS(HM1)
9291           IF (HU1.GT.HMAX) HMAX=HU1
9292           IF (HU1.LT.HMIN) HMIN=HU1
9293           IF (DABS(HM1-H0).LT.DABS(HM1)*1.0D-15) GO TO 20
929415         H0=HM1
929520      DA1=LOG10(HMAX)
9296        DA2=0.0D0
9297        IF (HMIN.NE.0.0) DA2=LOG10(HMIN)
9298        ID=15-ABS(DA1-DA2)
9299        HM1=HM1*DLOG(X)
9300        S0=0.0D0
9301        DO 25 M=1,N
9302           IF (B.GE.0.0) S0=S0-1.0D0/M
930325         IF (B.LT.0.0) S0=S0+(1.0D0-A)/(M*(A+M-1.0D0))
9304        HM2=PS+2.0D0*EL+S0
9305        R=1.0D0
9306        HMAX=0.0D0
9307        HMIN=1.0D+300
9308        DO 50 K=1,150
9309           S1=0.0D0
9310           S2=0.0D0
9311           IF (B.GT.0.0) THEN
9312              DO 30 M=1,K
931330               S1=S1-(M+2.0D0*A-2.0D0)/(M*(M+A-1.0D0))
9314              DO 35 M=1,N
931535               S2=S2+1.0D0/(K+M)
9316           ELSE
9317              DO 40 M=1,K+N
931840               S1=S1+(1.0D0-A)/(M*(M+A-1.0D0))
9319              DO 45 M=1,K
932045               S2=S2+1.0D0/M
9321           ENDIF
9322           HW=2.0D0*EL+PS+S1-S2
9323           R=R*(A0+K-1.0D0)*X/((N+K)*K)
9324           HM2=HM2+R*HW
9325           HU2=DABS(HM2)
9326           IF (HU2.GT.HMAX) HMAX=HU2
9327           IF (HU2.LT.HMIN) HMIN=HU2
9328           IF (DABS((HM2-H0)/HM2).LT.1.0D-15) GO TO 55
932950         H0=HM2
933055      DB1=LOG10(HMAX)
9331        DB2=0.0D0
9332        IF (HMIN.NE.0.0) DB2=LOG10(HMIN)
9333        ID1=15-ABS(DB1-DB2)
9334        IF (ID1.LT.ID) ID=ID1
9335        HM3=1.0D0
9336        IF (N.EQ.0) HM3=0.0D0
9337        R=1.0D0
9338        DO 60 K=1,N-1
9339           R=R*(A2+K-1.0D0)/((K-N)*K)*X
934060         HM3=HM3+R
9341        SA=UA*(HM1+HM2)
9342        SB=UB*HM3
9343        HU=SA+SB
9344        ID2=0.0D0
9345        IF (SA.NE.0.0) ID1=INT(LOG10(ABS(SA)))
9346        IF (HU.NE.0.0) ID2=INT(LOG10(ABS(HU)))
9347        IF (SA*SB.LT.0.0) ID=ID-ABS(ID1-ID2)
9348        RETURN
9349        END
9350
9351
9352
9353C       **********************************
9354
9355        SUBROUTINE CYZO(NT,KF,KC,ZO,ZV)
9356C
9357C       ===========================================================
9358C       Purpose : Compute the complex zeros of Y0(z), Y1(z) and
9359C                 Y1'(z), and their associated values at the zeros
9360C                 using the modified Newton's iteration method
9361C       Input:    NT --- Total number of zeros/roots
9362C                 KF --- Function choice code
9363C                        KF=0 for  Y0(z) & Y1(z0)
9364C                        KF=1 for  Y1(z) & Y0(z1)
9365C                        KF=2 for  Y1'(z) & Y1(z1')
9366C                 KC --- Choice code
9367C                        KC=0 for complex roots
9368C                        KC=1 for real roots
9369C       Output:   ZO(L) --- L-th zero of Y0(z) or Y1(z) or Y1'(z)
9370C                 ZV(L) --- Value of Y0'(z) or Y1'(z) or Y1(z)
9371C                           at the L-th zero
9372C       Routine called: CY01 for computing Y0(z) and Y1(z), and
9373C                       their derivatives
9374C       ===========================================================
9375        IMPLICIT DOUBLE PRECISION (H,O-Y)
9376        IMPLICIT COMPLEX*16 (C,Z)
9377        DIMENSION ZO(NT),ZV(NT)
9378        X=0.0D0
9379        Y=0.0D0
9380        H=0.0D0
9381        IF (KC.EQ.0) THEN
9382           X=-2.4D0
9383           Y=0.54D0
9384           H=3.14D0
9385        ELSE IF (KC.EQ.1) THEN
9386           X=0.89
9387           Y=0.0
9388           H=-3.14
9389        ENDIF
9390        IF (KF.EQ.1) X=-0.503
9391        IF (KF.EQ.2) X=0.577
9392        ZERO = DCMPLX(X, Y)
9393        Z=ZERO
9394        W=0.0D0
9395        DO 35 NR=1,NT
9396           IF (NR.NE.1) Z=ZO(NR-1)-H
9397           IT=0
939815         IT=IT+1
9399           CALL CY01(KF,Z,ZF,ZD)
9400           ZP=(1.0D0,0.0D0)
9401           DO 20 I=1,NR-1
940220            ZP=ZP*(Z-ZO(I))
9403           ZFD=ZF/ZP
9404           ZQ=(0.0D0,0.0D0)
9405           DO 30 I=1,NR-1
9406              ZW=(1.0D0,0.0D0)
9407              DO 25 J=1,NR-1
9408                 IF (J.EQ.I) GO TO 25
9409                 ZW=ZW*(Z-ZO(J))
941025            CONTINUE
9411              ZQ=ZQ+ZW
941230         CONTINUE
9413           ZGD=(ZD-ZQ*ZFD)/ZP
9414           Z=Z-ZFD/ZGD
9415           W0=W
9416           W=CDABS(Z)
9417           IF (IT.LE.50.AND.DABS((W-W0)/W).GT.1.0D-12) GO TO 15
9418           ZO(NR)=Z
941935      CONTINUE
9420        DO 40 I=1,NT
9421           Z=ZO(I)
9422           IF (KF.EQ.0.OR.KF.EQ.2) THEN
9423              CALL CY01(1,Z,ZF,ZD)
9424              ZV(I)=ZF
9425           ELSE IF (KF.EQ.1) THEN
9426              CALL CY01(0,Z,ZF,ZD)
9427              ZV(I)=ZF
9428           ENDIF
942940      CONTINUE
9430        RETURN
9431        END
9432
9433
9434
9435C       **********************************
9436
9437        SUBROUTINE KLVNB(X,BER,BEI,GER,GEI,DER,DEI,HER,HEI)
9438C
9439C       ======================================================
9440C       Purpose: Compute Kelvin functions ber x, bei x, ker x
9441C                and kei x, and their derivatives  ( x > 0 )
9442C       Input :  x   --- Argument of Kelvin functions
9443C       Output:  BER --- ber x
9444C                BEI --- bei x
9445C                GER --- ker x
9446C                GEI --- kei x
9447C                DER --- ber'x
9448C                DEI --- bei'x
9449C                HER --- ker'x
9450C                HEI --- kei'x
9451C       ================================================
9452C
9453        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9454        PI=3.141592653589793D0
9455        IF (X.EQ.0.0D0) THEN
9456           BER=1.0D0
9457           BEI=0.0D0
9458           GER=1.0D+300
9459           GEI=-.25D0*PI
9460           DER=0.0D0
9461           DEI=0.0D0
9462           HER=-1.0D+300
9463           HEI=0.0D0
9464        ELSE IF (X.LT.8.0D0) THEN
9465           T=X/8.0D0
9466           T2=T*T
9467           U=T2*T2
9468           BER=((((((-.901D-5*U+.122552D-2)*U-.08349609D0)*U
9469     &         +2.64191397D0)*U-32.36345652D0)*U
9470     &         +113.77777774D0)*U-64.0D0)*U+1.0D0
9471           BEI=T*T*((((((.11346D-3*U-.01103667D0)*U
9472     &         +.52185615D0)*U-10.56765779D0)*U
9473     &         +72.81777742D0)*U-113.77777774D0)*U+16.0D0)
9474           GER=((((((-.2458D-4*U+.309699D-2)*U-.19636347D0)
9475     &         *U+5.65539121D0)*U-60.60977451D0)*U+
9476     &         171.36272133D0)*U-59.05819744D0)*U-.57721566D0
9477           GER=GER-DLOG(.5D0*X)*BER+.25D0*PI*BEI
9478           GEI=T2*((((((.29532D-3*U-.02695875D0)*U
9479     &         +1.17509064D0)*U-21.30060904D0)*U
9480     &         +124.2356965D0)*U-142.91827687D0)*U
9481     &         +6.76454936D0)
9482           GEI=GEI-DLOG(.5D0*X)*BEI-.25D0*PI*BER
9483           DER=X*T2*((((((-.394D-5*U+.45957D-3)*U
9484     &         -.02609253D0)*U+.66047849D0)*U-6.0681481D0)*U
9485     &         +14.22222222D0)*U-4.0D0)
9486           DEI=X*((((((.4609D-4*U-.379386D-2)*U+.14677204D0)
9487     &         *U-2.31167514D0)*U+11.37777772D0)*U
9488     &         -10.66666666D0)*U+.5D0)
9489           HER=X*T2*((((((-.1075D-4*U+.116137D-2)*U
9490     &         -.06136358D0)*U+1.4138478D0)*U-11.36433272D0)
9491     &         *U+21.42034017D0)*U-3.69113734D0)
9492           HER=HER-DLOG(.5D0*X)*DER-BER/X+.25D0*PI*DEI
9493           HEI=X*((((((.11997D-3*U-.926707D-2)*U
9494     &         +.33049424D0)*U-4.65950823D0)*U+19.41182758D0)
9495     &         *U-13.39858846D0)*U+.21139217D0)
9496           HEI=HEI-DLOG(.5D0*X)*DEI-BEI/X-.25D0*PI*DER
9497        ELSE
9498           T=8.0D0/X
9499           TNR=0.0D0
9500           TNI=0.0D0
9501           DO 10 L=1,2
9502              V=(-1)**L*T
9503              TPR=((((.6D-6*V-.34D-5)*V-.252D-4)*V-.906D-4)
9504     &            *V*V+.0110486D0)*V
9505              TPI=((((.19D-5*V+.51D-5)*V*V-.901D-4)*V
9506     &            -.9765D-3)*V-.0110485D0)*V-.3926991D0
9507              IF (L.EQ.1) THEN
9508                 TNR=TPR
9509                 TNI=TPI
9510              ENDIF
951110         CONTINUE
9512           YD=X/DSQRT(2.0D0)
9513           YE1=DEXP(YD+TPR)
9514           YE2=DEXP(-YD+TNR)
9515           YC1=1.0D0/DSQRT(2.0D0*PI*X)
9516           YC2=DSQRT(PI/(2.0D0*X))
9517           CSP=DCOS(YD+TPI)
9518           SSP=DSIN(YD+TPI)
9519           CSN=DCOS(-YD+TNI)
9520           SSN=DSIN(-YD+TNI)
9521           GER=YC2*YE2*CSN
9522           GEI=YC2*YE2*SSN
9523           FXR=YC1*YE1*CSP
9524           FXI=YC1*YE1*SSP
9525           BER=FXR-GEI/PI
9526           BEI=FXI+GER/PI
9527           PNR=0.0D0
9528           PNI=0.0D0
9529           DO 15 L=1,2
9530              V=(-1)**L*T
9531              PPR=(((((.16D-5*V+.117D-4)*V+.346D-4)*V+.5D-6)
9532     &            *V-.13813D-2)*V-.0625001D0)*V+.7071068D0
9533              PPI=(((((-.32D-5*V-.24D-5)*V+.338D-4)*V+
9534     &           .2452D-3)*V+.13811D-2)*V-.1D-6)*V+.7071068D0
9535              IF (L.EQ.1) THEN
9536                 PNR=PPR
9537                 PNI=PPI
9538              ENDIF
953915         CONTINUE
9540           HER=GEI*PNI-GER*PNR
9541           HEI=-(GEI*PNR+GER*PNI)
9542           DER=FXR*PPR-FXI*PPI-HEI/PI
9543           DEI=FXI*PPR+FXR*PPI+HER/PI
9544        ENDIF
9545        RETURN
9546        END
9547
9548C       **********************************
9549
9550        SUBROUTINE RMN2SO(M,N,C,X,CV,DF,KD,R2F,R2D)
9551C
9552C       =============================================================
9553C       Purpose: Compute oblate radial functions of the second kind
9554C                with a small argument, Rmn(-ic,ix) & Rmn'(-ic,ix)
9555C       Routines called:
9556C            (1) SCKB for computing the expansion coefficients c2k
9557C            (2) KMN for computing the joining factors
9558C            (3) QSTAR for computing the factor defined in (15.7.3)
9559C            (4) CBK for computing the the expansion coefficient
9560C                defined in (15.7.6)
9561C            (5) GMN for computing the function defined in (15.7.4)
9562C            (6) RMN1 for computing the radial function of the first
9563C                kind
9564C       =============================================================
9565C
9566        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9567        DIMENSION BK(200),CK(200),DF(200),DN(200)
9568        IF (DABS(DF(1)).LE.1.0D-280) THEN
9569           R2F=1.0D+300
9570           R2D=1.0D+300
9571           RETURN
9572        ENDIF
9573        EPS=1.0D-14
9574        PI=3.141592653589793D0
9575        NM=25+INT((N-M)/2+C)
9576        IP=1
9577        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
9578        CALL SCKB(M,N,C,DF,CK)
9579        CALL KMN(M,N,C,CV,KD,DF,DN,CK1,CK2)
9580        CALL QSTAR(M,N,C,CK,CK1,QS,QT)
9581        CALL CBK(M,N,C,CV,QT,CK,BK)
9582        IF (X.EQ.0.0D0) THEN
9583           SUM=0.0D0
9584           SW=0.0D0
9585           DO 10 J=1,NM
9586              SUM=SUM+CK(J)
9587              IF (DABS(SUM-SW).LT.DABS(SUM)*EPS) GO TO 15
958810            SW=SUM
958915         IF (IP.EQ.0) THEN
9590              R1F=SUM/CK1
9591              R2F=-0.5D0*PI*QS*R1F
9592              R2D=QS*R1F+BK(1)
9593           ELSE IF (IP.EQ.1) THEN
9594              R1D=SUM/CK1
9595              R2F=BK(1)
9596              R2D=-0.5D0*PI*QS*R1D
9597           ENDIF
9598           RETURN
9599        ELSE
9600           CALL GMN(M,N,C,X,BK,GF,GD)
9601           CALL RMN1(M,N,C,X,DF,KD,R1F,R1D)
9602           H0=DATAN(X)-0.5D0*PI
9603           R2F=QS*R1F*H0+GF
9604           R2D=QS*(R1D*H0+R1F/(1.0D0+X*X))+GD
9605        ENDIF
9606        RETURN
9607        END
9608
9609
9610
9611C       **********************************
9612
9613        SUBROUTINE BJNDD(N,X,BJ,DJ,FJ)
9614C
9615C       =====================================================
9616C       Purpose: Compute Bessel functions Jn(x) and their
9617C                first and second derivatives ( n= 0,1,… )
9618C       Input:   x ---  Argument of Jn(x)  ( x ≥ 0 )
9619C                n ---  Order of Jn(x)
9620C       Output:  BJ(n+1) ---  Jn(x)
9621C                DJ(n+1) ---  Jn'(x)
9622C                FJ(n+1) ---  Jn"(x)
9623C       =====================================================
9624C
9625        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9626        DIMENSION BJ(101),DJ(101),FJ(101)
9627        DO 10 NT=1,900
9628           MT=INT(0.5*LOG10(6.28*NT)-NT*LOG10(1.36*DABS(X)/NT))
9629           IF (MT.GT.20) GO TO 15
963010      CONTINUE
963115      M=NT
9632        BS=0.0D0
9633        F=0.0D0
9634        F0=0.0D0
9635        F1=1.0D-35
9636        DO 20 K=M,0,-1
9637           F=2.0D0*(K+1.0D0)*F1/X-F0
9638           IF (K.LE.N) BJ(K+1)=F
9639           IF (K.EQ.2*INT(K/2)) BS=BS+2.0D0*F
9640           F0=F1
964120         F1=F
9642        DO 25 K=0,N
964325         BJ(K+1)=BJ(K+1)/(BS-F)
9644        DJ(1)=-BJ(2)
9645        FJ(1)=-1.0D0*BJ(1)-DJ(1)/X
9646        DO 30 K=1,N
9647           DJ(K+1)=BJ(K)-K*BJ(K+1)/X
964830         FJ(K+1)=(K*K/(X*X)-1.0D0)*BJ(K+1)-DJ(K+1)/X
9649        RETURN
9650        END
9651
9652C       **********************************
9653
9654
9655        SUBROUTINE SPHJ(N,X,NM,SJ,DJ)
9656C       MODIFIED to ALLOW N=0 CASE (ALSO IN SPHY)
9657C
9658C       =======================================================
9659C       Purpose: Compute spherical Bessel functions jn(x) and
9660C                their derivatives
9661C       Input :  x --- Argument of jn(x)
9662C                n --- Order of jn(x)  ( n = 0,1,… )
9663C       Output:  SJ(n) --- jn(x)
9664C                DJ(n) --- jn'(x)
9665C                NM --- Highest order computed
9666C       Routines called:
9667C                MSTA1 and MSTA2 for computing the starting
9668C                point for backward recurrence
9669C       =======================================================
9670C
9671        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9672        DIMENSION SJ(0:N),DJ(0:N)
9673        NM=N
9674        IF (DABS(X).LT.1.0D-100) THEN
9675           DO 10 K=0,N
9676              SJ(K)=0.0D0
967710            DJ(K)=0.0D0
9678           SJ(0)=1.0D0
9679           IF (N.GT.0) THEN
9680              DJ(1)=.3333333333333333D0
9681           ENDIF
9682           RETURN
9683        ENDIF
9684        SJ(0)=DSIN(X)/X
9685        DJ(0)=(DCOS(X)-DSIN(X)/X)/X
9686        IF (N.LT.1) THEN
9687           RETURN
9688        ENDIF
9689        SJ(1)=(SJ(0)-DCOS(X))/X
9690        IF (N.GE.2) THEN
9691           SA=SJ(0)
9692           SB=SJ(1)
9693           M=MSTA1(X,200)
9694           IF (M.LT.N) THEN
9695              NM=M
9696           ELSE
9697              M=MSTA2(X,N,15)
9698           ENDIF
9699           F=0.0D0
9700           F0=0.0D0
9701           F1=1.0D0-100
9702           DO 15 K=M,0,-1
9703              F=(2.0D0*K+3.0D0)*F1/X-F0
9704              IF (K.LE.NM) SJ(K)=F
9705              F0=F1
970615            F1=F
9707           CS=0.0D0
9708           IF (DABS(SA).GT.DABS(SB)) CS=SA/F
9709           IF (DABS(SA).LE.DABS(SB)) CS=SB/F0
9710           DO 20 K=0,NM
971120            SJ(K)=CS*SJ(K)
9712        ENDIF
9713        DO 25 K=1,NM
971425         DJ(K)=SJ(K-1)-(K+1.0D0)*SJ(K)/X
9715        RETURN
9716        END
9717
9718
9719
9720C       **********************************
9721
9722        SUBROUTINE OTHPL(KF,N,X,PL,DPL)
9723C
9724C       ==========================================================
9725C       Purpose: Compute orthogonal polynomials: Tn(x) or Un(x),
9726C                or Ln(x) or Hn(x), and their derivatives
9727C       Input :  KF --- Function code
9728C                       KF=1 for Chebyshev polynomial Tn(x)
9729C                       KF=2 for Chebyshev polynomial Un(x)
9730C                       KF=3 for Laguerre polynomial Ln(x)
9731C                       KF=4 for Hermite polynomial Hn(x)
9732C                n ---  Order of orthogonal polynomials
9733C                x ---  Argument of orthogonal polynomials
9734C       Output:  PL(n) --- Tn(x) or Un(x) or Ln(x) or Hn(x)
9735C                DPL(n)--- Tn'(x) or Un'(x) or Ln'(x) or Hn'(x)
9736C       =========================================================
9737C
9738        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9739        DIMENSION PL(0:N),DPL(0:N)
9740        A=2.0D0
9741        B=0.0D0
9742        C=1.0D0
9743        Y0=1.0D0
9744        Y1=2.0D0*X
9745        DY0=0.0D0
9746        DY1=2.0D0
9747        PL(0)=1.0D0
9748        PL(1)=2.0D0*X
9749        DPL(0)=0.0D0
9750        DPL(1)=2.0D0
9751        IF (KF.EQ.1) THEN
9752           Y1=X
9753           DY1=1.0D0
9754           PL(1)=X
9755           DPL(1)=1.0D0
9756        ELSE IF (KF.EQ.3) THEN
9757           Y1=1.0D0-X
9758           DY1=-1.0D0
9759           PL(1)=1.0D0-X
9760           DPL(1)=-1.0D0
9761        ENDIF
9762        DO 10 K=2,N
9763           IF (KF.EQ.3) THEN
9764              A=-1.0D0/K
9765              B=2.0D0+A
9766              C=1.0D0+A
9767           ELSE IF (KF.EQ.4) THEN
9768              C=2.0D0*(K-1.0D0)
9769           ENDIF
9770           YN=(A*X+B)*Y1-C*Y0
9771           DYN=A*Y1+(A*X+B)*DY1-C*DY0
9772           PL(K)=YN
9773           DPL(K)=DYN
9774           Y0=Y1
9775           Y1=YN
9776           DY0=DY1
977710         DY1=DYN
9778        RETURN
9779        END
9780
9781C       **********************************
9782
9783        SUBROUTINE KLVNZO(NT,KD,ZO)
9784C
9785C       ====================================================
9786C       Purpose: Compute the zeros of Kelvin functions
9787C       Input :  NT  --- Total number of zeros
9788C                KD  --- Function code
9789C                KD=1 to 8 for ber x, bei x, ker x, kei x,
9790C                          ber'x, bei'x, ker'x and kei'x,
9791C                          respectively.
9792C       Output:  ZO(M) --- the M-th zero of Kelvin function
9793C                          for code KD
9794C       Routine called:
9795C                KLVNA for computing Kelvin functions and
9796C                their derivatives
9797C       ====================================================
9798C
9799        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9800        DIMENSION ZO(NT),RT0(8)
9801        RT0(1)=2.84891
9802        RT0(2)=5.02622
9803        RT0(3)=1.71854
9804        RT0(4)=3.91467
9805        RT0(5)=6.03871
9806        RT0(6)=3.77268
9807        RT0(7)=2.66584
9808        RT0(8)=4.93181
9809        RT=RT0(KD)
9810        DO 15 M=1,NT
981110         CALL KLVNA(RT,BER,BEI,GER,GEI,DER,DEI,HER,HEI)
9812           IF (KD.EQ.1) THEN
9813              RT=RT-BER/DER
9814           ELSE IF (KD.EQ.2) THEN
9815              RT=RT-BEI/DEI
9816           ELSE IF (KD.EQ.3) THEN
9817              RT=RT-GER/HER
9818           ELSE IF (KD.EQ.4) THEN
9819              RT=RT-GEI/HEI
9820           ELSE IF (KD.EQ.5) THEN
9821              DDR=-BEI-DER/RT
9822              RT=RT-DER/DDR
9823           ELSE IF (KD.EQ.6) THEN
9824              DDI=BER-DEI/RT
9825              RT=RT-DEI/DDI
9826           ELSE IF (KD.EQ.7) THEN
9827              GDR=-GEI-HER/RT
9828              RT=RT-HER/GDR
9829           ELSE
9830              GDI=GER-HEI/RT
9831              RT=RT-HEI/GDI
9832           ENDIF
9833           IF (DABS(RT-RT0(KD)).GT.5.0D-10) THEN
9834              RT0(KD)=RT
9835              GO TO 10
9836           ENDIF
9837           ZO(M)=RT
983815         RT=RT+4.44D0
9839        RETURN
9840        END
9841
9842
9843
9844C       **********************************
9845
9846        SUBROUTINE RSWFO(M,N,C,X,CV,KF,R1F,R1D,R2F,R2D)
9847C
9848C       ==========================================================
9849C       Purpose: Compute oblate radial functions of the first
9850C                and second kinds, and their derivatives
9851C       Input :  m  --- Mode parameter,  m = 0,1,2,...
9852C                n  --- Mode parameter,  n = m,m+1,m+2,...
9853C                c  --- Spheroidal parameter
9854C                x  --- Argument (x ≥ 0)
9855C                cv --- Characteristic value
9856C                KF --- Function code
9857C                       KF=1 for the first kind
9858C                       KF=2 for the second kind
9859C                       KF=3 for both the first and second kinds
9860C       Output:  R1F --- Radial function of the first kind
9861C                R1D --- Derivative of the radial function of
9862C                        the first kind
9863C                R2F --- Radial function of the second kind
9864C                R2D --- Derivative of the radial function of
9865C                        the second kind
9866C       Routines called:
9867C            (1) SDMN for computing expansion coefficients dk
9868C            (2) RMN1 for computing prolate or oblate radial
9869C                function of the first kind
9870C            (3) RMN2L for computing prolate or oblate radial
9871C                function of the second kind for a large argument
9872C            (4) RMN2SO for computing oblate radial functions of
9873C                the second kind for a small argument
9874C       ==========================================================
9875C
9876        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9877        DIMENSION DF(200)
9878        KD=-1
9879        CALL SDMN(M,N,C,CV,KD,DF)
9880        IF (KF.NE.2) THEN
9881           CALL RMN1(M,N,C,X,DF,KD,R1F,R1D)
9882        ENDIF
9883        IF (KF.GT.1) THEN
9884           ID=10
9885           IF (X.GT.1.0D-8) THEN
9886              CALL RMN2L(M,N,C,X,DF,KD,R2F,R2D,ID)
9887           ENDIF
9888           IF (ID.GT.-1) THEN
9889              CALL RMN2SO(M,N,C,X,CV,DF,KD,R2F,R2D)
9890           ENDIF
9891        ENDIF
9892        RETURN
9893        END
9894
9895
9896
9897C       **********************************
9898
9899        SUBROUTINE CH12N(N,Z,NM,CHF1,CHD1,CHF2,CHD2)
9900C
9901C       ====================================================
9902C       Purpose: Compute Hankel functions of the first and
9903C                second kinds and their derivatives for a
9904C                complex argument
9905C       Input :  z --- Complex argument
9906C                n --- Order of Hn(1)(z) and Hn(2)(z)
9907C       Output:  CHF1(n) --- Hn(1)(z)
9908C                CHD1(n) --- Hn(1)'(z)
9909C                CHF2(n) --- Hn(2)(z)
9910C                CHD2(n) --- Hn(2)'(z)
9911C                NM --- Highest order computed
9912C       Routines called:
9913C             (1) CJYNB for computing Jn(z) and Yn(z)
9914C             (2) CIKNB for computing In(z) and Kn(z)
9915C       ====================================================
9916C
9917        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
9918        IMPLICIT COMPLEX*16 (C,Z)
9919        DIMENSION CBJ(0:250),CDJ(0:250),CBY(0:250),CDY(0:250),
9920     &            CBI(0:250),CDI(0:250),CBK(0:250),CDK(0:250)
9921        DIMENSION CHF1(0:N),CHD1(0:N),CHF2(0:N),CHD2(0:N)
9922        CI=(0.0D0,1.0D0)
9923        PI=3.141592653589793D0
9924        IF (DIMAG(Z).LT.0.0D0) THEN
9925           CALL CJYNB(N,Z,NM,CBJ,CDJ,CBY,CDY)
9926           DO 10 K=0,NM
9927              CHF1(K)=CBJ(K)+CI*CBY(K)
992810            CHD1(K)=CDJ(K)+CI*CDY(K)
9929           ZI=CI*Z
9930           CALL CIKNB(N,ZI,NM,CBI,CDI,CBK,CDK)
9931           CFAC=-2.0D0/(PI*CI)
9932           DO 15 K=0,NM
9933              CHF2(K)=CFAC*CBK(K)
9934              CHD2(K)=CFAC*CI*CDK(K)
993515            CFAC=CFAC*CI
9936        ELSE IF (DIMAG(Z).GT.0.0D0) THEN
9937           ZI=-CI*Z
9938           CALL CIKNB(N,ZI,NM,CBI,CDI,CBK,CDK)
9939           CF1=-CI
9940           CFAC=2.0D0/(PI*CI)
9941           DO 20 K=0,NM
9942              CHF1(K)=CFAC*CBK(K)
9943              CHD1(K)=-CFAC*CI*CDK(K)
994420            CFAC=CFAC*CF1
9945           CALL CJYNB(N,Z,NM,CBJ,CDJ,CBY,CDY)
9946           DO 25 K=0,NM
9947              CHF2(K)=CBJ(K)-CI*CBY(K)
994825            CHD2(K)=CDJ(K)-CI*CDY(K)
9949        ELSE
9950           CALL CJYNB(N,Z,NM,CBJ,CDJ,CBY,CDY)
9951           DO 30 K=0,NM
9952              CHF1(K)=CBJ(K)+CI*CBY(K)
9953              CHD1(K)=CDJ(K)+CI*CDY(K)
9954              CHF2(K)=CBJ(K)-CI*CBY(K)
995530            CHD2(K)=CDJ(K)-CI*CDY(K)
9956        ENDIF
9957        RETURN
9958        END
9959
9960
9961
9962C       **********************************
9963
9964        SUBROUTINE JYZO(N,NT,RJ0,RJ1,RY0,RY1)
9965C
9966C       ======================================================
9967C       Purpose: Compute the zeros of Bessel functions Jn(x),
9968C                Yn(x), and their derivatives
9969C       Input :  n  --- Order of Bessel functions  (n >= 0)
9970C                NT --- Number of zeros (roots)
9971C       Output:  RJ0(L) --- L-th zero of Jn(x),  L=1,2,...,NT
9972C                RJ1(L) --- L-th zero of Jn'(x), L=1,2,...,NT
9973C                RY0(L) --- L-th zero of Yn(x),  L=1,2,...,NT
9974C                RY1(L) --- L-th zero of Yn'(x), L=1,2,...,NT
9975C       Routine called: JYNDD for computing Jn(x), Yn(x), and
9976C                       their first and second derivatives
9977C       ======================================================
9978C
9979        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
9980        DIMENSION RJ0(NT),RJ1(NT),RY0(NT),RY1(NT)
9981        PI=3.141592653589793D0
9982C       -- Newton method for j_{N,L}
9983C       1) initial guess for j_{N,1}
9984        IF (N.LE.20) THEN
9985           X=2.82141+1.15859*N
9986        ELSE
9987C          Abr & Stg (9.5.14)
9988           X=N+1.85576*N**0.33333+1.03315/N**0.33333
9989        ENDIF
9990        L=0
9991C       2) iterate
9992        XGUESS=X
999310      X0=X
9994        CALL JYNDD(N,X,BJN,DJN,FJN,BYN,DYN,FYN)
9995        X=X-BJN/DJN
9996        IF (X-X0.LT.-1) X=X0-1
9997        IF (X-X0.GT.1) X=X0+1
9998        IF (DABS(X-X0).GT.1.0D-11) GO TO 10
9999C       3) initial guess for j_{N,L+1}
10000        IF (L.GE.1)THEN
10001           IF (X.LE.RJ0(L)+0.5) THEN
10002              X=XGUESS+PI
10003              XGUESS=X
10004              GO TO 10
10005           ENDIF
10006        END IF
10007        L=L+1
10008        RJ0(L)=X
10009C       XXX: should have a better initial guess for large N ~> 100 here
10010        X=X+PI+MAX((0.0972d0+0.0679*N-0.000354*N**2)/L, 0d0)
10011        IF (L.LT.NT) GO TO 10
10012C       -- Newton method for j_{N,L}'
10013        IF (N.LE.20) THEN
10014           X=0.961587+1.07703*N
10015        ELSE
10016           X=N+0.80861*N**0.33333+0.07249/N**0.33333
10017        ENDIF
10018        IF (N.EQ.0) X=3.8317
10019        L=0
10020        XGUESS=X
1002115      X0=X
10022        CALL JYNDD(N,X,BJN,DJN,FJN,BYN,DYN,FYN)
10023        X=X-DJN/FJN
10024        IF (X-X0.LT.-1) X=X0-1
10025        IF (X-X0.GT.1) X=X0+1
10026        IF (DABS(X-X0).GT.1.0D-11) GO TO 15
10027        IF (L.GE.1)THEN
10028           IF (X.LE.RJ1(L)+0.5) THEN
10029              X=XGUESS+PI
10030              XGUESS=X
10031              GO TO 15
10032           ENDIF
10033        END IF
10034        L=L+1
10035        RJ1(L)=X
10036C       XXX: should have a better initial guess for large N ~> 100 here
10037        X=X+PI+MAX((0.4955d0+0.0915*N-0.000435*N**2)/L, 0d0)
10038        IF (L.LT.NT) GO TO 15
10039C       -- Newton method for y_{N,L}
10040        IF (N.LE.20) THEN
10041           X=1.19477+1.08933*N
10042        ELSE
10043           X=N+0.93158*N**0.33333+0.26035/N**0.33333
10044        ENDIF
10045        L=0
10046        XGUESS=X
1004720      X0=X
10048        CALL JYNDD(N,X,BJN,DJN,FJN,BYN,DYN,FYN)
10049        X=X-BYN/DYN
10050        IF (X-X0.LT.-1) X=X0-1
10051        IF (X-X0.GT.1) X=X0+1
10052        IF (DABS(X-X0).GT.1.0D-11) GO TO 20
10053        IF (L.GE.1)THEN
10054           IF (X.LE.RY0(L)+0.5) THEN
10055              X=XGUESS+PI
10056              XGUESS=X
10057              GO TO 20
10058           END IF
10059        END IF
10060        L=L+1
10061        RY0(L)=X
10062C       XXX: should have a better initial guess for large N ~> 100 here
10063        X=X+PI+MAX((0.312d0+0.0852*N-0.000403*N**2)/L,0d0)
10064        IF (L.LT.NT) GO TO 20
10065C       -- Newton method for y_{N,L}'
10066        IF (N.LE.20) THEN
10067           X=2.67257+1.16099*N
10068        ELSE
10069           X=N+1.8211*N**0.33333+0.94001/N**0.33333
10070        ENDIF
10071        L=0
10072        XGUESS=X
1007325      X0=X
10074        CALL JYNDD(N,X,BJN,DJN,FJN,BYN,DYN,FYN)
10075        X=X-DYN/FYN
10076        IF (DABS(X-X0).GT.1.0D-11) GO TO 25
10077        IF (L.GE.1) THEN
10078           IF (X.LE.RY1(L)+0.5) THEN
10079              X=XGUESS+PI
10080              XGUESS=X
10081              GO TO 25
10082           END IF
10083        END IF
10084        L=L+1
10085        RY1(L)=X
10086C       XXX: should have a better initial guess for large N ~> 100 here
10087        X=X+PI+MAX((0.197d0+0.0643*N-0.000286*N**2)/L,0d0)
10088        IF (L.LT.NT) GO TO 25
10089        RETURN
10090        END
10091
10092
10093
10094C       **********************************
10095
10096        SUBROUTINE IKV(V,X,VM,BI,DI,BK,DK)
10097C
10098C       =======================================================
10099C       Purpose: Compute modified Bessel functions Iv(x) and
10100C                Kv(x), and their derivatives
10101C       Input :  x --- Argument ( x ≥ 0 )
10102C                v --- Order of Iv(x) and Kv(x)
10103C                      ( v = n+v0, n = 0,1,2,..., 0 ≤ v0 < 1 )
10104C       Output:  BI(n) --- In+v0(x)
10105C                DI(n) --- In+v0'(x)
10106C                BK(n) --- Kn+v0(x)
10107C                DK(n) --- Kn+v0'(x)
10108C                VM --- Highest order computed
10109C       Routines called:
10110C            (1) GAMMA2 for computing the gamma function
10111C            (2) MSTA1 and MSTA2 to compute the starting
10112C                point for backward recurrence
10113C       =======================================================
10114C
10115        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
10116        DIMENSION BI(0:*),DI(0:*),BK(0:*),DK(0:*)
10117        PI=3.141592653589793D0
10118        X2=X*X
10119        N=INT(V)
10120        V0=V-N
10121        IF (N.EQ.0) N=1
10122        IF (X.LT.1.0D-100) THEN
10123           DO 10 K=0,N
10124              BI(K)=0.0D0
10125              DI(K)=0.0D0
10126              BK(K)=-1.0D+300
1012710            DK(K)=1.0D+300
10128           IF (V.EQ.0.0) THEN
10129              BI(0)=1.0D0
10130              DI(1)=0.5D0
10131           ENDIF
10132           VM=V
10133           RETURN
10134        ENDIF
10135        PIV=PI*V0
10136        VT=4.0D0*V0*V0
10137        IF (V0.EQ.0.0D0) THEN
10138           A1=1.0D0
10139        ELSE
10140           V0P=1.0D0+V0
10141           CALL GAMMA2(V0P,GAP)
10142           A1=(0.5D0*X)**V0/GAP
10143        ENDIF
10144        K0=14
10145        IF (X.GE.35.0) K0=10
10146        IF (X.GE.50.0) K0=8
10147        IF (X.LE.18.0) THEN
10148           BI0=1.0D0
10149           R=1.0D0
10150           DO 15 K=1,30
10151              R=0.25D0*R*X2/(K*(K+V0))
10152              BI0=BI0+R
10153              IF (DABS(R/BI0).LT.1.0D-15) GO TO 20
1015415         CONTINUE
1015520         BI0=BI0*A1
10156        ELSE
10157           CA=DEXP(X)/DSQRT(2.0D0*PI*X)
10158           SUM=1.0D0
10159           R=1.0D0
10160           DO 25 K=1,K0
10161              R=-0.125D0*R*(VT-(2.0D0*K-1.0D0)**2.0)/(K*X)
1016225            SUM=SUM+R
10163           BI0=CA*SUM
10164        ENDIF
10165        M=MSTA1(X,200)
10166        IF (M.LT.N) THEN
10167           N=M
10168        ELSE
10169           M=MSTA2(X,N,15)
10170        ENDIF
10171        F=0.0D0
10172        F2=0.0D0
10173        F1=1.0D-100
10174        WW=0.0D0
10175        DO 30 K=M,0,-1
10176           F=2.0D0*(V0+K+1.0D0)/X*F1+F2
10177           IF (K.LE.N) BI(K)=F
10178           F2=F1
1017930         F1=F
10180        CS=BI0/F
10181        DO 35 K=0,N
1018235         BI(K)=CS*BI(K)
10183        DI(0)=V0/X*BI(0)+BI(1)
10184        DO 40 K=1,N
1018540         DI(K)=-(K+V0)/X*BI(K)+BI(K-1)
10186        IF (X.LE.9.0D0) THEN
10187           IF (V0.EQ.0.0D0) THEN
10188              CT=-DLOG(0.5D0*X)-0.5772156649015329D0
10189              CS=0.0D0
10190              W0=0.0D0
10191              R=1.0D0
10192              DO 45 K=1,50
10193                 W0=W0+1.0D0/K
10194                 R=0.25D0*R/(K*K)*X2
10195                 CS=CS+R*(W0+CT)
10196                 WA=DABS(CS)
10197                 IF (DABS((WA-WW)/WA).LT.1.0D-15) GO TO 50
1019845               WW=WA
1019950            BK0=CT+CS
10200           ELSE
10201              V0N=1.0D0-V0
10202              CALL GAMMA2(V0N,GAN)
10203              A2=1.0D0/(GAN*(0.5D0*X)**V0)
10204              A1=(0.5D0*X)**V0/GAP
10205              SUM=A2-A1
10206              R1=1.0D0
10207              R2=1.0D0
10208              DO 55 K=1,120
10209                 R1=0.25D0*R1*X2/(K*(K-V0))
10210                 R2=0.25D0*R2*X2/(K*(K+V0))
10211                 SUM=SUM+A2*R1-A1*R2
10212                 WA=DABS(SUM)
10213                 IF (DABS((WA-WW)/WA).LT.1.0D-15) GO TO 60
1021455               WW=WA
1021560            BK0=0.5D0*PI*SUM/DSIN(PIV)
10216           ENDIF
10217        ELSE
10218           CB=DEXP(-X)*DSQRT(0.5D0*PI/X)
10219           SUM=1.0D0
10220           R=1.0D0
10221           DO 65 K=1,K0
10222              R=0.125D0*R*(VT-(2.0*K-1.0)**2.0)/(K*X)
1022365            SUM=SUM+R
10224           BK0=CB*SUM
10225        ENDIF
10226        BK1=(1.0D0/X-BI(1)*BK0)/BI(0)
10227        BK(0)=BK0
10228        BK(1)=BK1
10229        DO 70 K=2,N
10230           BK2=2.0D0*(V0+K-1.0D0)/X*BK1+BK0
10231           BK(K)=BK2
10232           BK0=BK1
1023370         BK1=BK2
10234        DK(0)=V0/X*BK(0)-BK(1)
10235        DO 80 K=1,N
1023680         DK(K)=-(K+V0)/X*BK(K)-BK(K-1)
10237        VM=N+V0
10238        RETURN
10239        END
10240
10241
10242
10243C       **********************************
10244
10245        SUBROUTINE SDMN(M,N,C,CV,KD,DF)
10246C
10247C       =====================================================
10248C       Purpose: Compute the expansion coefficients of the
10249C                prolate and oblate spheroidal functions, dk
10250C       Input :  m  --- Mode parameter
10251C                n  --- Mode parameter
10252C                c  --- Spheroidal parameter
10253C                cv --- Characteristic value
10254C                KD --- Function code
10255C                       KD=1 for prolate; KD=-1 for oblate
10256C       Output:  DF(k) --- Expansion coefficients dk;
10257C                          DF(1), DF(2), ... correspond to
10258C                          d0, d2, ... for even n-m and d1,
10259C                          d3, ... for odd n-m
10260C       =====================================================
10261C
10262        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
10263        DIMENSION A(200),D(200),G(200),DF(200)
10264        NM=25+INT(0.5*(N-M)+C)
10265        IF (C.LT.1.0D-10) THEN
10266           DO 5 I=1,NM
102675             DF(I)=0D0
10268           DF((N-M)/2+1)=1.0D0
10269           RETURN
10270        ENDIF
10271        CS=C*C*KD
10272        IP=1
10273        K=0
10274        IF (N-M.EQ.2*INT((N-M)/2)) IP=0
10275        DO 10 I=1,NM+2
10276           IF (IP.EQ.0) K=2*(I-1)
10277           IF (IP.EQ.1) K=2*I-1
10278           DK0=M+K
10279           DK1=M+K+1
10280           DK2=2*(M+K)
10281           D2K=2*M+K
10282           A(I)=(D2K+2.0)*(D2K+1.0)/((DK2+3.0)*(DK2+5.0))*CS
10283           D(I)=DK0*DK1+(2.0*DK0*DK1-2.0*M*M-1.0)/((DK2-1.0)
10284     &          *(DK2+3.0))*CS
10285           G(I)=K*(K-1.0)/((DK2-3.0)*(DK2-1.0))*CS
1028610      CONTINUE
10287        FS=1.0D0
10288        F1=0.0D0
10289        F0=1.0D-100
10290        KB=0
10291        DF(NM+1)=0.0D0
10292        FL=0.0D0
10293        DO 30 K=NM,1,-1
10294           F=-((D(K+1)-CV)*F0+A(K+1)*F1)/G(K+1)
10295           IF (DABS(F).GT.DABS(DF(K+1))) THEN
10296              DF(K)=F
10297              F1=F0
10298              F0=F
10299              IF (DABS(F).GT.1.0D+100) THEN
10300                 DO 12 K1=K,NM
1030112                  DF(K1)=DF(K1)*1.0D-100
10302                 F1=F1*1.0D-100
10303                 F0=F0*1.0D-100
10304              ENDIF
10305           ELSE
10306              KB=K
10307              FL=DF(K+1)
10308              F1=1.0D-100
10309              F2=-(D(1)-CV)/A(1)*F1
10310              DF(1)=F1
10311              IF (KB.EQ.1) THEN
10312                 FS=F2
10313              ELSE IF (KB.EQ.2) THEN
10314                 DF(2)=F2
10315                 FS=-((D(2)-CV)*F2+G(2)*F1)/A(2)
10316              ELSE
10317                 DF(2)=F2
10318                 DO 20 J=3,KB+1
10319                    F=-((D(J-1)-CV)*F2+G(J-1)*F1)/A(J-1)
10320                    IF (J.LE.KB) DF(J)=F
10321                    IF (DABS(F).GT.1.0D+100) THEN
10322                       DO 15 K1=1,J
1032315                        DF(K1)=DF(K1)*1.0D-100
10324                       F=F*1.0D-100
10325                       F2=F2*1.0D-100
10326                    ENDIF
10327                    F1=F2
1032820                  F2=F
10329                 FS=F
10330              ENDIF
10331              GO TO 35
10332           ENDIF
1033330      CONTINUE
1033435      SU1=0.0D0
10335        R1=1.0D0
10336        DO 40 J=M+IP+1,2*(M+IP)
1033740         R1=R1*J
10338        SU1=DF(1)*R1
10339        DO 45 K=2,KB
10340           R1=-R1*(K+M+IP-1.5D0)/(K-1.0D0)
1034145           SU1=SU1+R1*DF(K)
10342        SU2=0.0D0
10343        SW=0.0D0
10344        DO 50 K=KB+1,NM
10345           IF (K.NE.1) R1=-R1*(K+M+IP-1.5D0)/(K-1.0D0)
10346           SU2=SU2+R1*DF(K)
10347           IF (DABS(SW-SU2).LT.DABS(SU2)*1.0D-14) GOTO 55
1034850         SW=SU2
1034955      R3=1.0D0
10350        DO 60 J=1,(M+N+IP)/2
1035160         R3=R3*(J+0.5D0*(N+M+IP))
10352        R4=1.0D0
10353        DO 65 J=1,(N-M-IP)/2
1035465         R4=-4.0D0*R4*J
10355        S0=R3/(FL*(SU1/FS)+SU2)/R4
10356        DO 70 K=1,KB
1035770         DF(K)=FL/FS*S0*DF(K)
10358        DO 75 K=KB+1,NM
1035975         DF(K)=S0*DF(K)
10360        RETURN
10361        END
10362
10363
10364
10365
10366C       **********************************
10367
10368        SUBROUTINE AJYIK(X,VJ1,VJ2,VY1,VY2,VI1,VI2,VK1,VK2)
10369C
10370C       =======================================================
10371C       Purpose: Compute Bessel functions Jv(x) and Yv(x),
10372C                and modified Bessel functions Iv(x) and
10373C                Kv(x), and their derivatives with v=1/3,2/3
10374C       Input :  x --- Argument of Jv(x),Yv(x),Iv(x) and
10375C                      Kv(x) ( x ≥ 0 )
10376C       Output:  VJ1 --- J1/3(x)
10377C                VJ2 --- J2/3(x)
10378C                VY1 --- Y1/3(x)
10379C                VY2 --- Y2/3(x)
10380C                VI1 --- I1/3(x)
10381C                VI2 --- I2/3(x)
10382C                VK1 --- K1/3(x)
10383C                VK2 --- K2/3(x)
10384C       =======================================================
10385C
10386        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
10387        IF (X.EQ.0.0D0) THEN
10388           VJ1=0.0D0
10389           VJ2=0.0D0
10390           VY1=-1.0D+300
10391           VY2=1.0D+300
10392           VI1=0.0D0
10393           VI2=0.0D0
10394           VK1=-1.0D+300
10395           VK2=-1.0D+300
10396           RETURN
10397        ENDIF
10398        PI=3.141592653589793D0
10399        RP2=.63661977236758D0
10400        GP1=.892979511569249D0
10401        GP2=.902745292950934D0
10402        GN1=1.3541179394264D0
10403        GN2=2.678938534707747D0
10404        VV0=0.444444444444444D0
10405        UU0=1.1547005383793D0
10406        X2=X*X
10407        K0=12
10408        IF (X.GE.35.0) K0=10
10409        IF (X.GE.50.0) K0=8
10410        IF (X.LE.12.0) THEN
10411           DO 25 L=1,2
10412              VL=L/3.0D0
10413              VJL=1.0D0
10414              R=1.0D0
10415              DO 15 K=1,40
10416                 R=-0.25D0*R*X2/(K*(K+VL))
10417                 VJL=VJL+R
10418                 IF (DABS(R).LT.1.0D-15) GO TO 20
1041915            CONTINUE
1042020            A0=(0.5D0*X)**VL
10421              IF (L.EQ.1) VJ1=A0/GP1*VJL
10422              IF (L.EQ.2) VJ2=A0/GP2*VJL
1042325         CONTINUE
10424        ELSE
10425           DO 40 L=1,2
10426              VV=VV0*L*L
10427              PX=1.0D0
10428              RP=1.0D0
10429              DO 30 K=1,K0
10430                 RP=-0.78125D-2*RP*(VV-(4.0*K-3.0)**2.0)*(VV-
10431     &              (4.0*K-1.0)**2.0)/(K*(2.0*K-1.0)*X2)
1043230               PX=PX+RP
10433              QX=1.0D0
10434              RQ=1.0D0
10435              DO 35 K=1,K0
10436                 RQ=-0.78125D-2*RQ*(VV-(4.0*K-1.0)**2.0)*(VV-
10437     &              (4.0*K+1.0)**2.0)/(K*(2.0*K+1.0)*X2)
1043835               QX=QX+RQ
10439              QX=0.125D0*(VV-1.0)*QX/X
10440              XK=X-(0.5D0*L/3.0D0+0.25D0)*PI
10441              A0=DSQRT(RP2/X)
10442              CK=DCOS(XK)
10443              SK=DSIN(XK)
10444              IF (L.EQ.1) THEN
10445                 VJ1=A0*(PX*CK-QX*SK)
10446                 VY1=A0*(PX*SK+QX*CK)
10447              ELSE IF (L.EQ.2) THEN
10448                 VJ2=A0*(PX*CK-QX*SK)
10449                 VY2=A0*(PX*SK+QX*CK)
10450              ENDIF
1045140         CONTINUE
10452        ENDIF
10453        IF (X.LE.12.0D0) THEN
10454           UJ1=0.0D0
10455           UJ2=0.0D0
10456           DO 55 L=1,2
10457              VL=L/3.0D0
10458              VJL=1.0D0
10459              R=1.0D0
10460              DO 45 K=1,40
10461                 R=-0.25D0*R*X2/(K*(K-VL))
10462                 VJL=VJL+R
10463                 IF (DABS(R).LT.1.0D-15) GO TO 50
1046445            CONTINUE
1046550            B0=(2.0D0/X)**VL
10466              IF (L.EQ.1) UJ1=B0*VJL/GN1
10467              IF (L.EQ.2) UJ2=B0*VJL/GN2
1046855         CONTINUE
10469           PV1=PI/3.0D0
10470           PV2=PI/1.5D0
10471           VY1=UU0*(VJ1*DCOS(PV1)-UJ1)
10472           VY2=UU0*(VJ2*DCOS(PV2)-UJ2)
10473        ENDIF
10474        IF (X.LE.18.0) THEN
10475           DO 70 L=1,2
10476              VL=L/3.0D0
10477              VIL=1.0D0
10478              R=1.0D0
10479              DO 60 K=1,40
10480                 R=0.25D0*R*X2/(K*(K+VL))
10481                 VIL=VIL+R
10482                 IF (DABS(R).LT.1.0D-15) GO TO 65
1048360            CONTINUE
1048465            A0=(0.5D0*X)**VL
10485              IF (L.EQ.1) VI1=A0/GP1*VIL
10486              IF (L.EQ.2) VI2=A0/GP2*VIL
1048770         CONTINUE
10488        ELSE
10489           C0=DEXP(X)/DSQRT(2.0D0*PI*X)
10490           DO 80 L=1,2
10491              VV=VV0*L*L
10492              VSL=1.0D0
10493              R=1.0D0
10494              DO 75 K=1,K0
10495                 R=-0.125D0*R*(VV-(2.0D0*K-1.0D0)**2.0)/(K*X)
1049675               VSL=VSL+R
10497              IF (L.EQ.1) VI1=C0*VSL
10498              IF (L.EQ.2) VI2=C0*VSL
1049980         CONTINUE
10500        ENDIF
10501        IF (X.LE.9.0D0) THEN
10502           GN=0.0D0
10503           DO 95 L=1,2
10504              VL=L/3.0D0
10505               IF (L.EQ.1) GN=GN1
10506               IF (L.EQ.2) GN=GN2
10507               A0=(2.0D0/X)**VL/GN
10508               SUM=1.0D0
10509               R=1.0D0
10510               DO 85 K=1,60
10511                  R=0.25D0*R*X2/(K*(K-VL))
10512                  SUM=SUM+R
10513                  IF (DABS(R).LT.1.0D-15) GO TO 90
1051485             CONTINUE
1051590            IF (L.EQ.1) VK1=0.5D0*UU0*PI*(SUM*A0-VI1)
10516              IF (L.EQ.2) VK2=0.5D0*UU0*PI*(SUM*A0-VI2)
1051795         CONTINUE
10518        ELSE
10519           C0=DEXP(-X)*DSQRT(0.5D0*PI/X)
10520           DO 105 L=1,2
10521              VV=VV0*L*L
10522              SUM=1.0D0
10523              R=1.0D0
10524              DO 100 K=1,K0
10525                 R=0.125D0*R*(VV-(2.0*K-1.0)**2.0)/(K*X)
10526100              SUM=SUM+R
10527              IF (L.EQ.1) VK1=C0*SUM
10528              IF (L.EQ.2) VK2=C0*SUM
10529105        CONTINUE
10530        ENDIF
10531        RETURN
10532        END
10533
10534
10535
10536C       **********************************
10537
10538        SUBROUTINE CIKVB(V,Z,VM,CBI,CDI,CBK,CDK)
10539C
10540C       ===========================================================
10541C       Purpose: Compute the modified Bessel functions Iv(z), Kv(z)
10542C                and their derivatives for an arbitrary order and
10543C                complex argument
10544C       Input :  z --- Complex argument z
10545C                v --- Real order of Iv(z) and Kv(z)
10546C                      ( v =n+v0, n = 0,1,2,..., 0 ≤ v0 < 1 )
10547C       Output:  CBI(n) --- In+v0(z)
10548C                CDI(n) --- In+v0'(z)
10549C                CBK(n) --- Kn+v0(z)
10550C                CDK(n) --- Kn+v0'(z)
10551C                VM --- Highest order computed
10552C       Routines called:
10553C            (1) GAMMA2 for computing the gamma function
10554C            (2) MSTA1 and MSTA2 for computing the starting
10555C                point for backward recurrence
10556C       ===========================================================
10557C
10558        IMPLICIT DOUBLE PRECISION (A,D-H,O-Y)
10559        IMPLICIT COMPLEX*16 (C,Z)
10560        DIMENSION CBI(0:*),CDI(0:*),CBK(0:*),CDK(0:*)
10561        Z1=Z
10562        Z2=Z*Z
10563        A0=CDABS(Z)
10564        PI=3.141592653589793D0
10565        CI=(0.0D0,1.0D0)
10566        N=INT(V)
10567        V0=V-N
10568        PIV=PI*V0
10569        VT=4.0D0*V0*V0
10570        IF (N.EQ.0) N=1
10571        IF (A0.LT.1.0D-100) THEN
10572           DO 10 K=0,N
10573              CBI(K)=0.0D0
10574              CDI(K)=0.0D0
10575              CBK(K)=-1.0D+300
1057610            CDK(K)=1.0D+300
10577           IF (V0.EQ.0.0) THEN
10578              CBI(0)=(1.0D0,0.0D0)
10579              CDI(1)=(0.5D0,0.0D0)
10580           ENDIF
10581           VM=V
10582           RETURN
10583        ENDIF
10584        K0=14
10585        IF (A0.GE.35.0) K0=10
10586        IF (A0.GE.50.0) K0=8
10587        IF (DBLE(Z).LT.0.0) Z1=-Z
10588        IF (A0.LT.18.0) THEN
10589           IF (V0.EQ.0.0) THEN
10590              CA1=(1.0D0,0.0D0)
10591           ELSE
10592              V0P=1.0D0+V0
10593              CALL GAMMA2(V0P,GAP)
10594              CA1=(0.5D0*Z1)**V0/GAP
10595           ENDIF
10596           CI0=(1.0D0,0.0D0)
10597           CR=(1.0D0,0.0D0)
10598           DO 15 K=1,50
10599              CR=0.25D0*CR*Z2/(K*(K+V0))
10600              CI0=CI0+CR
10601              IF (CDABS(CR/CI0).LT.1.0D-15) GO TO 20
1060215         CONTINUE
1060320         CBI0=CI0*CA1
10604        ELSE
10605           CA=CDEXP(Z1)/CDSQRT(2.0D0*PI*Z1)
10606           CS=(1.0D0,0.0D0)
10607           CR=(1.0D0,0.0D0)
10608           DO 25 K=1,K0
10609              CR=-0.125D0*CR*(VT-(2.0D0*K-1.0D0)**2.0)/(K*Z1)
1061025            CS=CS+CR
10611           CBI0=CA*CS
10612        ENDIF
10613        M=MSTA1(A0,200)
10614        IF (M.LT.N) THEN
10615           N=M
10616        ELSE
10617           M=MSTA2(A0,N,15)
10618        ENDIF
10619        CF2=(0.0D0,0.0D0)
10620        CF1=(1.0D-100,0.0D0)
10621        DO 30 K=M,0,-1
10622           CF=2.0D0*(V0+K+1.0D0)/Z1*CF1+CF2
10623           IF (K.LE.N) CBI(K)=CF
10624           CF2=CF1
1062530         CF1=CF
10626        CS=CBI0/CF
10627        DO 35 K=0,N
1062835         CBI(K)=CS*CBI(K)
10629        IF (A0.LE.9.0) THEN
10630           IF (V0.EQ.0.0) THEN
10631              CT=-CDLOG(0.5D0*Z1)-0.5772156649015329D0
10632              CS=(0.0D0,0.0D0)
10633              W0=0.0D0
10634              CR=(1.0D0,0.0D0)
10635              DO 40 K=1,50
10636                 W0=W0+1.0D0/K
10637                 CR=0.25D0*CR/(K*K)*Z2
10638                 CP=CR*(W0+CT)
10639                 CS=CS+CP
10640                 IF (K.GE.10.AND.CDABS(CP/CS).LT.1.0D-15) GO TO 45
1064140            CONTINUE
1064245            CBK0=CT+CS
10643           ELSE
10644              V0N=1.0D0-V0
10645              CALL GAMMA2(V0N,GAN)
10646              CA2=1.0D0/(GAN*(0.5D0*Z1)**V0)
10647              CA1=(0.5D0*Z1)**V0/GAP
10648              CSU=CA2-CA1
10649              CR1=(1.0D0,0.0D0)
10650              CR2=(1.0D0,0.0D0)
10651              DO 50 K=1,50
10652                 CR1=0.25D0*CR1*Z2/(K*(K-V0))
10653                 CR2=0.25D0*CR2*Z2/(K*(K+V0))
10654                 CP=CA2*CR1-CA1*CR2
10655                 CSU=CSU+CP
10656                 IF (K.GE.10.AND.CDABS(CP/CSU).LT.1.0D-15) GO TO 55
1065750            CONTINUE
1065855            CBK0=0.5D0*PI*CSU/DSIN(PIV)
10659           ENDIF
10660        ELSE
10661           CB=CDEXP(-Z1)*CDSQRT(0.5D0*PI/Z1)
10662           CS=(1.0D0,0.0D0)
10663           CR=(1.0D0,0.0D0)
10664           DO 60 K=1,K0
10665              CR=0.125D0*CR*(VT-(2.0D0*K-1.0D0)**2.0)/(K*Z1)
1066660            CS=CS+CR
10667           CBK0=CB*CS
10668        ENDIF
10669        CBK(0)=CBK0
10670        IF (DBLE(Z).LT.0.0) THEN
10671           DO 65 K=0,N
10672              CVK=CDEXP((K+V0)*PI*CI)
10673              IF (DIMAG(Z).LT.0.0D0) THEN
10674                 CBK(K)=CVK*CBK(K)+PI*CI*CBI(K)
10675                 CBI(K)=CBI(K)/CVK
10676              ELSE IF (DIMAG(Z).GT.0.0) THEN
10677                 CBK(K)=CBK(K)/CVK-PI*CI*CBI(K)
10678                 CBI(K)=CVK*CBI(K)
10679              ENDIF
1068065         CONTINUE
10681        ENDIF
10682        DO 70 K=1,N
10683           CKK=(1.0D0/Z-CBI(K)*CBK(K-1))/CBI(K-1)
10684           CBK(K)=CKK
1068570      CONTINUE
10686        CDI(0)=V0/Z*CBI(0)+CBI(1)
10687        CDK(0)=V0/Z*CBK(0)-CBK(1)
10688        DO 80 K=1,N
10689           CDI(K)=-(K+V0)/Z*CBI(K)+CBI(K-1)
1069080         CDK(K)=-(K+V0)/Z*CBK(K)-CBK(K-1)
10691        VM=N+V0
10692        RETURN
10693        END
10694
10695
10696
10697C       **********************************
10698
10699        SUBROUTINE CIKVA(V,Z,VM,CBI,CDI,CBK,CDK)
10700C
10701C       ============================================================
10702C       Purpose: Compute the modified Bessel functions Iv(z), Kv(z)
10703C                and their derivatives for an arbitrary order and
10704C                complex argument
10705C       Input :  z --- Complex argument
10706C                v --- Real order of Iv(z) and Kv(z)
10707C                      ( v = n+v0, n = 0,1,2,…, 0 ≤ v0 < 1 )
10708C       Output:  CBI(n) --- In+v0(z)
10709C                CDI(n) --- In+v0'(z)
10710C                CBK(n) --- Kn+v0(z)
10711C                CDK(n) --- Kn+v0'(z)
10712C                VM --- Highest order computed
10713C       Routines called:
10714C            (1) GAMMA2 for computing the gamma function
10715C            (2) MSTA1 and MSTA2 for computing the starting
10716C                point for backward recurrence
10717C       ============================================================
10718C
10719        IMPLICIT DOUBLE PRECISION (A,G,P,R,V,W)
10720        IMPLICIT COMPLEX*16 (C,Z)
10721        DIMENSION CBI(0:*),CDI(0:*),CBK(0:*),CDK(0:*)
10722        PI=3.141592653589793D0
10723        CI=(0.0D0,1.0D0)
10724        A0=CDABS(Z)
10725        Z1=Z
10726        Z2=Z*Z
10727        N=INT(V)
10728        V0=V-N
10729        PIV=PI*V0
10730        VT=4.0D0*V0*V0
10731        IF (N.EQ.0) N=1
10732        IF (A0.LT.1.0D-100) THEN
10733           DO 10 K=0,N
10734              CBI(K)=0.0D0
10735              CDI(K)=0.0D0
10736              CBK(K)=-1.0D+300
1073710            CDK(K)=1.0D+300
10738           IF (V0.EQ.0.0) THEN
10739              CBI(0)=(1.0D0,0.0D0)
10740              CDI(1)=(0.5D0,0.0D0)
10741           ENDIF
10742           VM=V
10743           RETURN
10744        ENDIF
10745        K0=14
10746        IF (A0.GE.35.0) K0=10
10747        IF (A0.GE.50.0) K0=8
10748        IF (DBLE(Z).LT.0.0) Z1=-Z
10749        IF (A0.LT.18.0) THEN
10750           IF (V0.EQ.0.0) THEN
10751              CA1=(1.0D0,0.0D0)
10752           ELSE
10753              V0P=1.0D0+V0
10754              CALL GAMMA2(V0P,GAP)
10755              CA1=(0.5D0*Z1)**V0/GAP
10756           ENDIF
10757           CI0=(1.0D0,0.0D0)
10758           CR=(1.0D0,0.0D0)
10759           DO 15 K=1,50
10760              CR=0.25D0*CR*Z2/(K*(K+V0))
10761              CI0=CI0+CR
10762              IF (CDABS(CR).LT.CDABS(CI0)*1.0D-15) GO TO 20
1076315         CONTINUE
1076420         CBI0=CI0*CA1
10765        ELSE
10766           CA=CDEXP(Z1)/CDSQRT(2.0D0*PI*Z1)
10767           CS=(1.0D0,0.0D0)
10768           CR=(1.0D0,0.0D0)
10769           DO 25 K=1,K0
10770              CR=-0.125D0*CR*(VT-(2.0D0*K-1.0D0)**2.0)/(K*Z1)
1077125            CS=CS+CR
10772           CBI0=CA*CS
10773        ENDIF
10774        M=MSTA1(A0,200)
10775        IF (M.LT.N) THEN
10776           N=M
10777        ELSE
10778           M=MSTA2(A0,N,15)
10779        ENDIF
10780        CF2=(0.0D0,0.0D0)
10781        CF1=(1.0D-100,0.0D0)
10782        DO 30 K=M,0,-1
10783           CF=2.0D0*(V0+K+1.0D0)/Z1*CF1+CF2
10784           IF (K.LE.N) CBI(K)=CF
10785           CF2=CF1
1078630         CF1=CF
10787        CS=CBI0/CF
10788        DO 35 K=0,N
1078935         CBI(K)=CS*CBI(K)
10790        IF (A0.LE.9.0) THEN
10791           IF (V0.EQ.0.0) THEN
10792              CT=-CDLOG(0.5D0*Z1)-0.5772156649015329D0
10793              CS=(0.0D0,0.0D0)
10794              W0=0.0D0
10795              CR=(1.0D0,0.0D0)
10796              DO 40 K=1,50
10797                 W0=W0+1.0D0/K
10798                 CR=0.25D0*CR/(K*K)*Z2
10799                 CP=CR*(W0+CT)
10800                 CS=CS+CP
10801                 IF (K.GE.10.AND.CDABS(CP/CS).LT.1.0D-15) GO TO 45
1080240            CONTINUE
1080345            CBK0=CT+CS
10804           ELSE
10805              V0N=1.0D0-V0
10806              CALL GAMMA2(V0N,GAN)
10807              CA2=1.0D0/(GAN*(0.5D0*Z1)**V0)
10808              CA1=(0.5D0*Z1)**V0/GAP
10809              CSU=CA2-CA1
10810              CR1=(1.0D0,0.0D0)
10811              CR2=(1.0D0,0.0D0)
10812              WS0=0.0D0
10813              DO 50 K=1,50
10814                 CR1=0.25D0*CR1*Z2/(K*(K-V0))
10815                 CR2=0.25D0*CR2*Z2/(K*(K+V0))
10816                 CSU=CSU+CA2*CR1-CA1*CR2
10817                 WS=CDABS(CSU)
10818                 IF (K.GE.10.AND.DABS(WS-WS0)/WS.LT.1.0D-15) GO TO 55
10819                 WS0=WS
1082050            CONTINUE
1082155            CBK0=0.5D0*PI*CSU/DSIN(PIV)
10822           ENDIF
10823        ELSE
10824           CB=CDEXP(-Z1)*CDSQRT(0.5D0*PI/Z1)
10825           CS=(1.0D0,0.0D0)
10826           CR=(1.0D0,0.0D0)
10827           DO 60 K=1,K0
10828              CR=0.125D0*CR*(VT-(2.0D0*K-1.0D0)**2.0)/(K*Z1)
1082960            CS=CS+CR
10830           CBK0=CB*CS
10831        ENDIF
10832        CBK1=(1.0D0/Z1-CBI(1)*CBK0)/CBI(0)
10833        CBK(0)=CBK0
10834        CBK(1)=CBK1
10835        CG0=CBK0
10836        CG1=CBK1
10837        DO 65 K=2,N
10838           CGK=2.0D0*(V0+K-1.0D0)/Z1*CG1+CG0
10839           CBK(K)=CGK
10840           CG0=CG1
1084165         CG1=CGK
10842        IF (DBLE(Z).LT.0.0) THEN
10843           DO 70 K=0,N
10844              CVK=CDEXP((K+V0)*PI*CI)
10845              IF (DIMAG(Z).LT.0.0D0) THEN
10846                 CBK(K)=CVK*CBK(K)+PI*CI*CBI(K)
10847                 CBI(K)=CBI(K)/CVK
10848              ELSE IF (DIMAG(Z).GT.0.0) THEN
10849                 CBK(K)=CBK(K)/CVK-PI*CI*CBI(K)
10850                 CBI(K)=CVK*CBI(K)
10851              ENDIF
1085270         CONTINUE
10853        ENDIF
10854        CDI(0)=V0/Z*CBI(0)+CBI(1)
10855        CDK(0)=V0/Z*CBK(0)-CBK(1)
10856        DO 75 K=1,N
10857           CDI(K)=-(K+V0)/Z*CBI(K)+CBI(K-1)
1085875         CDK(K)=-(K+V0)/Z*CBK(K)-CBK(K-1)
10859        VM=N+V0
10860        RETURN
10861        END
10862
10863
10864
10865C       **********************************
10866
10867        SUBROUTINE CFC(Z,ZF,ZD)
10868C
10869C       =========================================================
10870C       Purpose: Compute complex Fresnel integral C(z) and C'(z)
10871C       Input :  z --- Argument of C(z)
10872C       Output:  ZF --- C(z)
10873C                ZD --- C'(z)
10874C       =========================================================
10875C
10876        IMPLICIT DOUBLE PRECISION (E,P,W)
10877        IMPLICIT COMPLEX *16 (C,S,Z)
10878        EPS=1.0D-14
10879        PI=3.141592653589793D0
10880        W0=CDABS(Z)
10881        ZP=0.5D0*PI*Z*Z
10882        ZP2=ZP*ZP
10883        Z0=(0.0D0,0.0D0)
10884        IF (Z.EQ.Z0) THEN
10885           C=Z0
10886        ELSE IF (W0.LE.2.5) THEN
10887           CR=Z
10888           C=CR
10889           WA0=0.0D0
10890           DO 10 K=1,80
10891              CR=-.5D0*CR*(4.0D0*K-3.0D0)/K/(2.0D0*K-1.0D0)
10892     &          /(4.0D0*K+1.0D0)*ZP2
10893              C=C+CR
10894              WA=CDABS(C)
10895              IF (DABS((WA-WA0)/WA).LT.EPS.AND.K.GT.10) GO TO 30
1089610            WA0=WA
10897        ELSE IF (W0.GT.2.5.AND.W0.LT.4.5) THEN
10898           M=85
10899           C=Z0
10900           CF1=Z0
10901           CF0=(1.0D-100,0.0D0)
10902           DO 15 K=M,0,-1
10903              CF=(2.0D0*K+3.0D0)*CF0/ZP-CF1
10904              IF (K.EQ.INT(K/2)*2) C=C+CF
10905              CF1=CF0
1090615            CF0=CF
10907           C=CDSQRT(2.0D0/(PI*ZP))*CDSIN(ZP)/CF*C
10908        ELSE
10909           CR=(1.0D0,0.0D0)
10910           CF=(1.0D0,0.0D0)
10911           DO 20 K=1,20
10912              CR=-.25D0*CR*(4.0D0*K-1.0D0)*(4.0D0*K-3.0D0)/ZP2
1091320            CF=CF+CR
10914           CR=1.0D0/(PI*Z*Z)
10915           CG=CR
10916           DO 25 K=1,12
10917              CR=-.25D0*CR*(4.0D0*K+1.0D0)*(4.0D0*K-1.0D0)/ZP2
1091825            CG=CG+CR
10919           C=.5D0+(CF*CDSIN(ZP)-CG*CDCOS(ZP))/(PI*Z)
10920        ENDIF
1092130      ZF=C
10922        ZD=CDCOS(0.5*PI*Z*Z)
10923        RETURN
10924        END
10925
10926
10927
10928C       **********************************
10929
10930        SUBROUTINE FCS(X,C,S)
10931C
10932C       =================================================
10933C       Purpose: Compute Fresnel integrals C(x) and S(x)
10934C       Input :  x --- Argument of C(x) and S(x)
10935C       Output:  C --- C(x)
10936C                S --- S(x)
10937C       =================================================
10938C
10939        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
10940        EPS=1.0D-15
10941        PI=3.141592653589793D0
10942        XA=DABS(X)
10943        PX=PI*XA
10944        T=.5D0*PX*XA
10945        T2=T*T
10946        IF (XA.EQ.0.0) THEN
10947           C=0.0D0
10948           S=0.0D0
10949        ELSE IF (XA.LT.2.5D0) THEN
10950           R=XA
10951           C=R
10952           DO 10 K=1,50
10953              R=-.5D0*R*(4.0D0*K-3.0D0)/K/(2.0D0*K-1.0D0)
10954     &          /(4.0D0*K+1.0D0)*T2
10955              C=C+R
10956              IF (DABS(R).LT.DABS(C)*EPS) GO TO 15
1095710         CONTINUE
1095815         S=XA*T/3.0D0
10959           R=S
10960           DO 20 K=1,50
10961              R=-.5D0*R*(4.0D0*K-1.0D0)/K/(2.0D0*K+1.0D0)
10962     &          /(4.0D0*K+3.0D0)*T2
10963              S=S+R
10964              IF (DABS(R).LT.DABS(S)*EPS) GO TO 40
1096520         CONTINUE
10966        ELSE IF (XA.LT.4.5D0) THEN
10967           M=INT(42.0+1.75*T)
10968           SU=0.0D0
10969           C=0.0D0
10970           S=0.0D0
10971           F1=0.0D0
10972           F0=1.0D-100
10973           DO 25 K=M,0,-1
10974              F=(2.0D0*K+3.0D0)*F0/T-F1
10975              IF (K.EQ.INT(K/2)*2) THEN
10976                 C=C+F
10977              ELSE
10978                 S=S+F
10979              ENDIF
10980              SU=SU+(2.0D0*K+1.0D0)*F*F
10981              F1=F0
1098225            F0=F
10983           Q=DSQRT(SU)
10984           C=C*XA/Q
10985           S=S*XA/Q
10986        ELSE
10987           R=1.0D0
10988           F=1.0D0
10989           DO 30 K=1,20
10990              R=-.25D0*R*(4.0D0*K-1.0D0)*(4.0D0*K-3.0D0)/T2
1099130            F=F+R
10992           R=1.0D0/(PX*XA)
10993           G=R
10994           DO 35 K=1,12
10995              R=-.25D0*R*(4.0D0*K+1.0D0)*(4.0D0*K-1.0D0)/T2
1099635            G=G+R
10997           T0=T-INT(T/(2.0D0*PI))*2.0D0*PI
10998           C=.5D0+(F*DSIN(T0)-G*DCOS(T0))/PX
10999           S=.5D0-(F*DCOS(T0)+G*DSIN(T0))/PX
11000        ENDIF
1100140      IF (X.LT.0.0D0) THEN
11002           C=-C
11003           S=-S
11004        ENDIF
11005        RETURN
11006        END
11007
11008C       **********************************
11009
11010        SUBROUTINE RCTJ(N,X,NM,RJ,DJ)
11011C
11012C       ========================================================
11013C       Purpose: Compute Riccati-Bessel functions of the first
11014C                kind and their derivatives
11015C       Input:   x --- Argument of Riccati-Bessel function
11016C                n --- Order of jn(x)  ( n = 0,1,2,... )
11017C       Output:  RJ(n) --- x·jn(x)
11018C                DJ(n) --- [x·jn(x)]'
11019C                NM --- Highest order computed
11020C       Routines called:
11021C                MSTA1 and MSTA2 for computing the starting
11022C                point for backward recurrence
11023C       ========================================================
11024C
11025        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11026        DIMENSION RJ(0:N),DJ(0:N)
11027        NM=N
11028        IF (DABS(X).LT.1.0D-100) THEN
11029           DO 10 K=0,N
11030              RJ(K)=0.0D0
1103110            DJ(K)=0.0D0
11032           DJ(0)=1.0D0
11033           RETURN
11034        ENDIF
11035        RJ(0)=DSIN(X)
11036        RJ(1)=RJ(0)/X-DCOS(X)
11037        RJ0=RJ(0)
11038        RJ1=RJ(1)
11039        CS=0.0D0
11040        F=0.0D0
11041        IF (N.GE.2) THEN
11042           M=MSTA1(X,200)
11043           IF (M.LT.N) THEN
11044              NM=M
11045           ELSE
11046              M=MSTA2(X,N,15)
11047           ENDIF
11048           F0=0.0D0
11049           F1=1.0D-100
11050           DO 15 K=M,0,-1
11051              F=(2.0D0*K+3.0D0)*F1/X-F0
11052              IF (K.LE.NM) RJ(K)=F
11053              F0=F1
1105415            F1=F
11055           IF (DABS(RJ0).GT.DABS(RJ1)) CS=RJ0/F
11056           IF (DABS(RJ0).LE.DABS(RJ1)) CS=RJ1/F0
11057           DO 20 K=0,NM
1105820            RJ(K)=CS*RJ(K)
11059        ENDIF
11060        DJ(0)=DCOS(X)
11061        DO 25 K=1,NM
1106225         DJ(K)=-K*RJ(K)/X+RJ(K-1)
11063        RETURN
11064        END
11065
11066
11067
11068C       **********************************
11069
11070        SUBROUTINE HERZO(N,X,W)
11071C
11072C       ========================================================
11073C       Purpose : Compute the zeros of Hermite polynomial Ln(x)
11074C                 in the interval [-∞,∞], and the corresponding
11075C                 weighting coefficients for Gauss-Hermite
11076C                 integration
11077C       Input :   n    --- Order of the Hermite polynomial
11078C                 X(n) --- Zeros of the Hermite polynomial
11079C                 W(n) --- Corresponding weighting coefficients
11080C       ========================================================
11081C
11082        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11083        DIMENSION X(N),W(N)
11084        HN=1.0D0/N
11085        ZL=-1.1611D0+1.46D0*N**0.5
11086        Z=0.0D0
11087        HF=0.0D0
11088        HD=0.0D0
11089        DO 40 NR=1,N/2
11090           IF (NR.EQ.1) Z=ZL
11091           IF (NR.NE.1) Z=Z-HN*(N/2+1-NR)
11092           IT=0
1109310         IT=IT+1
11094           Z0=Z
11095           F0=1.0D0
11096           F1=2.0D0*Z
11097           DO 15 K=2,N
11098              HF=2.0D0*Z*F1-2.0D0*(K-1.0D0)*F0
11099              HD=2.0D0*K*F1
11100              F0=F1
1110115            F1=HF
11102           P=1.0D0
11103           DO 20 I=1,NR-1
1110420            P=P*(Z-X(I))
11105           FD=HF/P
11106           Q=0.0D0
11107           DO 30 I=1,NR-1
11108              WP=1.0D0
11109              DO 25 J=1,NR-1
11110                 IF (J.EQ.I) GO TO 25
11111                 WP=WP*(Z-X(J))
1111225            CONTINUE
1111330            Q=Q+WP
11114           GD=(HD-Q*FD)/P
11115           Z=Z-FD/GD
11116           IF (IT.LE.40.AND.DABS((Z-Z0)/Z).GT.1.0D-15) GO TO 10
11117           X(NR)=Z
11118           X(N+1-NR)=-Z
11119           R=1.0D0
11120           DO 35 K=1,N
1112135            R=2.0D0*R*K
11122           W(NR)=3.544907701811D0*R/(HD*HD)
1112340         W(N+1-NR)=W(NR)
11124        IF (N.NE.2*INT(N/2)) THEN
11125           R1=1.0D0
11126           R2=1.0D0
11127           DO 45 J=1,N
11128              R1=2.0D0*R1*J
11129              IF (J.GE.(N+1)/2) R2=R2*J
1113045         CONTINUE
11131           W(N/2+1)=0.88622692545276D0*R1/(R2*R2)
11132           X(N/2+1)=0.0D0
11133        ENDIF
11134        RETURN
11135        END
11136
11137C       **********************************
11138
11139        SUBROUTINE JY01B(X,BJ0,DJ0,BJ1,DJ1,BY0,DY0,BY1,DY1)
11140C
11141C       =======================================================
11142C       Purpose: Compute Bessel functions J0(x), J1(x), Y0(x),
11143C                Y1(x), and their derivatives
11144C       Input :  x   --- Argument of Jn(x) & Yn(x) ( x ≥ 0 )
11145C       Output:  BJ0 --- J0(x)
11146C                DJ0 --- J0'(x)
11147C                BJ1 --- J1(x)
11148C                DJ1 --- J1'(x)
11149C                BY0 --- Y0(x)
11150C                DY0 --- Y0'(x)
11151C                BY1 --- Y1(x)
11152C                DY1 --- Y1'(x)
11153C       =======================================================
11154C
11155        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11156        PI=3.141592653589793D0
11157        IF (X.EQ.0.0D0) THEN
11158           BJ0=1.0D0
11159           BJ1=0.0D0
11160           DJ0=0.0D0
11161           DJ1=0.5D0
11162           BY0=-1.0D+300
11163           BY1=-1.0D+300
11164           DY0=1.0D+300
11165           DY1=1.0D+300
11166           RETURN
11167        ELSE IF (X.LE.4.0D0) THEN
11168           T=X/4.0D0
11169           T2=T*T
11170           BJ0=((((((-.5014415D-3*T2+.76771853D-2)*T2
11171     &         -.0709253492D0)*T2+.4443584263D0)*T2
11172     &         -1.7777560599D0)*T2+3.9999973021D0)
11173     &         *T2-3.9999998721D0)*T2+1.0D0
11174           BJ1=T*(((((((-.1289769D-3*T2+.22069155D-2)
11175     &         *T2-.0236616773D0)*T2+.1777582922D0)*T2
11176     &         -.8888839649D0)*T2+2.6666660544D0)*T2
11177     &         -3.9999999710D0)*T2+1.9999999998D0)
11178           BY0=(((((((-.567433D-4*T2+.859977D-3)*T2
11179     &         -.94855882D-2)*T2+.0772975809D0)*T2
11180     &         -.4261737419D0)*T2+1.4216421221D0)*T2
11181     &         -2.3498519931D0)*T2+1.0766115157D0)*T2
11182     &         +.3674669052D0
11183           BY0=2.0D0/PI*DLOG(X/2.0D0)*BJ0+BY0
11184           BY1=((((((((.6535773D-3*T2-.0108175626D0)*T2
11185     &         +.107657606D0)*T2-.7268945577D0)*T2
11186     &         +3.1261399273D0)*T2-7.3980241381D0)*T2
11187     &         +6.8529236342D0)*T2+.3932562018D0)*T2
11188     &         -.6366197726D0)/X
11189           BY1=2.0D0/PI*DLOG(X/2.0D0)*BJ1+BY1
11190        ELSE
11191           T=4.0D0/X
11192           T2=T*T
11193           A0=DSQRT(2.0D0/(PI*X))
11194           P0=((((-.9285D-5*T2+.43506D-4)*T2-.122226D-3)*T2
11195     &        +.434725D-3)*T2-.4394275D-2)*T2+.999999997D0
11196           Q0=T*(((((.8099D-5*T2-.35614D-4)*T2+.85844D-4)*T2
11197     &        -.218024D-3)*T2+.1144106D-2)*T2-.031249995D0)
11198           TA0=X-.25D0*PI
11199           BJ0=A0*(P0*DCOS(TA0)-Q0*DSIN(TA0))
11200           BY0=A0*(P0*DSIN(TA0)+Q0*DCOS(TA0))
11201           P1=((((.10632D-4*T2-.50363D-4)*T2+.145575D-3)*T2
11202     &        -.559487D-3)*T2+.7323931D-2)*T2+1.000000004D0
11203           Q1=T*(((((-.9173D-5*T2+.40658D-4)*T2-.99941D-4)*T2
11204     &        +.266891D-3)*T2-.1601836D-2)*T2+.093749994D0)
11205           TA1=X-.75D0*PI
11206           BJ1=A0*(P1*DCOS(TA1)-Q1*DSIN(TA1))
11207           BY1=A0*(P1*DSIN(TA1)+Q1*DCOS(TA1))
11208        ENDIF
11209        DJ0=-BJ1
11210        DJ1=BJ0-BJ1/X
11211        DY0=-BY1
11212        DY1=BY0-BY1/X
11213        RETURN
11214        END
11215
11216C       **********************************
11217
11218        SUBROUTINE ENXB(N,X,EN)
11219C
11220C       ===============================================
11221C       Purpose: Compute exponential integral En(x)
11222C       Input :  x --- Argument of En(x)
11223C                n --- Order of En(x)  (n = 0,1,2,...)
11224C       Output:  EN(n) --- En(x)
11225C       ===============================================
11226C
11227        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11228        DIMENSION EN(0:N)
11229        IF (X.EQ.0.0) THEN
11230           EN(0)=1.0D+300
11231           EN(1)=1.0D+300
11232           DO 10 K=2,N
1123310            EN(K)=1.0D0/(K-1.0)
11234           RETURN
11235        ELSE IF (X.LE.1.0) THEN
11236           EN(0)=DEXP(-X)/X
11237           S0=0.0D0
11238           DO 40 L=1,N
11239              RP=1.0D0
11240              DO 15 J=1,L-1
1124115               RP=-RP*X/J
11242              PS=-0.5772156649015328D0
11243              DO 20 M=1,L-1
1124420               PS=PS+1.0D0/M
11245              ENS=RP*(-DLOG(X)+PS)
11246              S=0.0D0
11247              DO 30 M=0,20
11248                 IF (M.EQ.L-1) GO TO 30
11249                 R=1.0D0
11250                 DO 25 J=1,M
1125125                  R=-R*X/J
11252                 S=S+R/(M-L+1.0D0)
11253                 IF (DABS(S-S0).LT.DABS(S)*1.0D-15) GO TO 35
11254                 S0=S
1125530            CONTINUE
1125635            EN(L)=ENS-S
1125740         CONTINUE
11258        ELSE
11259           EN(0)=DEXP(-X)/X
11260           M=15+INT(100.0/X)
11261           DO 50 L=1,N
11262              T0=0.0D0
11263              DO 45 K=M,1,-1
1126445               T0=(L+K-1.0D0)/(1.0D0+K/(X+T0))
11265              T=1.0D0/(X+T0)
1126650            EN(L)=DEXP(-X)*T
11267        ENDIF
11268        END
11269
11270C       **********************************
11271
11272        SUBROUTINE SPHK(N,X,NM,SK,DK)
11273C
11274C       =====================================================
11275C       Purpose: Compute modified spherical Bessel functions
11276C                of the second kind, kn(x) and kn'(x)
11277C       Input :  x --- Argument of kn(x)  ( x ≥ 0 )
11278C                n --- Order of kn(x) ( n = 0,1,2,... )
11279C       Output:  SK(n) --- kn(x)
11280C                DK(n) --- kn'(x)
11281C                NM --- Highest order computed
11282C       =====================================================
11283C
11284        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11285        DIMENSION SK(0:N),DK(0:N)
11286        PI=3.141592653589793D0
11287        NM=N
11288        IF (X.LT.1.0D-60) THEN
11289           DO 10 K=0,N
11290              SK(K)=1.0D+300
1129110            DK(K)=-1.0D+300
11292           RETURN
11293        ENDIF
11294        SK(0)=0.5D0*PI/X*DEXP(-X)
11295        SK(1)=SK(0)*(1.0D0+1.0D0/X)
11296        F0=SK(0)
11297        F1=SK(1)
11298        DO 15 K=2,N
11299           F=(2.0D0*K-1.0D0)*F1/X+F0
11300           SK(K)=F
11301           IF (DABS(F).GT.1.0D+300) GO TO 20
11302           F0=F1
1130315         F1=F
1130420      NM=K-1
11305        DK(0)=-SK(1)
11306        DO 25 K=1,NM
1130725         DK(K)=-SK(K-1)-(K+1.0D0)/X*SK(K)
11308        RETURN
11309        END
11310
11311C       **********************************
11312
11313        SUBROUTINE ENXA(N,X,EN)
11314C
11315C       ============================================
11316C       Purpose: Compute exponential integral En(x)
11317C       Input :  x --- Argument of En(x) ( x ≤ 20 )
11318C                n --- Order of En(x)
11319C       Output:  EN(n) --- En(x)
11320C       Routine called: E1XB for computing E1(x)
11321C       ============================================
11322C
11323        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11324        DIMENSION EN(0:N)
11325        EN(0)=DEXP(-X)/X
11326        CALL E1XB(X,E1)
11327        EN(1)=E1
11328        DO 10 K=2,N
11329           EK=(DEXP(-X)-X*E1)/(K-1.0D0)
11330           EN(K)=EK
1133110         E1=EK
11332        RETURN
11333        END
11334
11335
11336
11337C       **********************************
11338
11339        SUBROUTINE GAIH(X,GA)
11340C
11341C       =====================================================
11342C       Purpose: Compute gamma function Г(x)
11343C       Input :  x  --- Argument of Г(x), x = n/2, n=1,2,…
11344C       Output:  GA --- Г(x)
11345C       =====================================================
11346C
11347        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11348        PI=3.141592653589793D0
11349        IF (X.EQ.INT(X).AND.X.GT.0.0) THEN
11350           GA=1.0D0
11351           M1=INT(X-1.0)
11352           DO 10 K=2,M1
1135310            GA=GA*K
11354        ELSE IF (X+.5D0.EQ.INT(X+.5D0).AND.X.GT.0.0) THEN
11355           M=INT(X)
11356           GA=DSQRT(PI)
11357           DO 15 K=1,M
1135815            GA=0.5D0*GA*(2.0D0*K-1.0D0)
11359        ENDIF
11360        RETURN
11361        END
11362
11363C       **********************************
11364
11365        SUBROUTINE PBVV(V,X,VV,VP,PVF,PVD)
11366C
11367C       ===================================================
11368C       Purpose: Compute parabolic cylinder functions Vv(x)
11369C                and their derivatives
11370C       Input:   x --- Argument of Vv(x)
11371C                v --- Order of Vv(x)
11372C       Output:  VV(na) --- Vv(x)
11373C                VP(na) --- Vv'(x)
11374C                ( na = |n|, v = n+v0, |v0| < 1
11375C                  n = 0,±1,±2,… )
11376C                PVF --- Vv(x)
11377C                PVD --- Vv'(x)
11378C       Routines called:
11379C             (1) VVSA for computing Vv(x) for small |x|
11380C             (2) VVLA for computing Vv(x) for large |x|
11381C       ===================================================
11382C
11383        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11384        DIMENSION VV(0:*),VP(0:*)
11385        PI=3.141592653589793D0
11386        XA=DABS(X)
11387        VH=V
11388        V=V+DSIGN(1.0D0,V)
11389        NV=INT(V)
11390        V0=V-NV
11391        NA=ABS(NV)
11392        QE=DEXP(0.25D0*X*X)
11393        Q2P=DSQRT(2.0D0/PI)
11394        JA=0
11395        IF (NA.GE.1) JA=1
11396        F=0.0D0
11397        IF (V.LE.0.0) THEN
11398           IF (V0.EQ.0.0) THEN
11399              IF (XA.LE.7.5) CALL VVSA(V0,X,PV0)
11400              IF (XA.GT.7.5) CALL VVLA(V0,X,PV0)
11401              F0=Q2P*QE
11402              F1=X*F0
11403              VV(0)=PV0
11404              VV(1)=F0
11405              VV(2)=F1
11406           ELSE
11407              DO 10 L=0,JA
11408                 V1=V0-L
11409                 IF (XA.LE.7.5) CALL VVSA(V1,X,F1)
11410                 IF (XA.GT.7.5) CALL VVLA(V1,X,F1)
11411                 IF (L.EQ.0) F0=F1
1141210            CONTINUE
11413              VV(0)=F0
11414              VV(1)=F1
11415           ENDIF
11416           KV=2
11417           IF (V0.EQ.0.0) KV=3
11418           DO 15 K=KV,NA
11419              F=X*F1+(K-V0-2.0D0)*F0
11420              VV(K)=F
11421              F0=F1
1142215            F1=F
11423        ELSE
11424           IF (X.GE.0.0.AND.X.LE.7.5D0) THEN
11425              V2=V
11426              IF (V2.LT.1.0) V2=V2+1.0D0
11427              CALL VVSA(V2,X,F1)
11428              V1=V2-1.0D0
11429              KV=INT(V2)
11430              CALL VVSA(V1,X,F0)
11431              VV(KV)=F1
11432              VV(KV-1)=F0
11433              DO 20 K=KV-2,0,-1
11434                 F=X*F0-(K+V0+2.0D0)*F1
11435                 IF (K.LE.NA) VV(K)=F
11436                 F1=F0
1143720               F0=F
11438           ELSE IF (X.GT.7.5D0) THEN
11439              CALL VVLA(V0,X,PV0)
11440              M=100+ABS(NA)
11441              VV(1)=PV0
11442              F1=0.0D0
11443              F0=1.0D-40
11444              DO 25 K=M,0,-1
11445                 F=X*F0-(K+V0+2.0D0)*F1
11446                 IF (K.LE.NA) VV(K)=F
11447                 F1=F0
1144825               F0=F
11449              S0=PV0/F
11450              DO 30 K=0,NA
1145130               VV(K)=S0*VV(K)
11452           ELSE
11453              IF (XA.LE.7.5D0) THEN
11454                 CALL VVSA(V0,X,F0)
11455                 V1=V0+1.0
11456                 CALL VVSA(V1,X,F1)
11457              ELSE
11458                 CALL VVLA(V0,X,F0)
11459                 V1=V0+1.0D0
11460                 CALL VVLA(V1,X,F1)
11461              ENDIF
11462              VV(0)=F0
11463              VV(1)=F1
11464              DO 35 K=2,NA
11465                 F=(X*F1-F0)/(K+V0)
11466                 VV(K)=F
11467                 F0=F1
1146835               F1=F
11469           ENDIF
11470        ENDIF
11471        DO 40 K=0,NA-1
11472           V1=V0+K
11473           IF (V.GE.0.0D0) THEN
11474              VP(K)=0.5D0*X*VV(K)-(V1+1.0D0)*VV(K+1)
11475           ELSE
11476              VP(K)=-0.5D0*X*VV(K)+VV(K+1)
11477           ENDIF
1147840      CONTINUE
11479        PVF=VV(NA-1)
11480        PVD=VP(NA-1)
11481        V=VH
11482        RETURN
11483        END
11484
11485
11486
11487C       **********************************
11488
11489        SUBROUTINE CLQMN(MM,M,N,X,Y,CQM,CQD)
11490C
11491C       =======================================================
11492C       Purpose: Compute the associated Legendre functions of
11493C                the second kind, Qmn(z) and Qmn'(z), for a
11494C                complex argument
11495C       Input :  x  --- Real part of z
11496C                y  --- Imaginary part of z
11497C                m  --- Order of Qmn(z)  ( m = 0,1,2,… )
11498C                n  --- Degree of Qmn(z) ( n = 0,1,2,… )
11499C                mm --- Physical dimension of CQM and CQD
11500C       Output:  CQM(m,n) --- Qmn(z)
11501C                CQD(m,n) --- Qmn'(z)
11502C       =======================================================
11503C
11504        IMPLICIT DOUBLE PRECISION (X,Y)
11505        IMPLICIT COMPLEX*16 (C,Z)
11506        DIMENSION CQM(0:MM,0:N),CQD(0:MM,0:N)
11507        Z = DCMPLX(X, Y)
11508        IF (DABS(X).EQ.1.0D0.AND.Y.EQ.0.0D0) THEN
11509           DO 10 I=0,M
11510           DO 10 J=0,N
11511              CQM(I,J)=(1.0D+300,0.0D0)
11512              CQD(I,J)=(1.0D+300,0.0D0)
1151310         CONTINUE
11514           RETURN
11515        ENDIF
11516        XC=CDABS(Z)
11517        LS=0
11518        IF (DIMAG(Z).EQ.0.0D0.OR.XC.LT.1.0D0) LS=1
11519        IF (XC.GT.1.0D0) LS=-1
11520        ZQ=CDSQRT(LS*(1.0D0-Z*Z))
11521        ZS=LS*(1.0D0-Z*Z)
11522        CQ0=0.5D0*CDLOG(LS*(1.0D0+Z)/(1.0D0-Z))
11523        IF (XC.LT.1.0001D0) THEN
11524           CQM(0,0)=CQ0
11525           CQM(0,1)=Z*CQ0-1.0D0
11526           CQM(1,0)=-1.0D0/ZQ
11527           CQM(1,1)=-ZQ*(CQ0+Z/(1.0D0-Z*Z))
11528           DO 15 I=0,1
11529           DO 15 J=2,N
11530              CQM(I,J)=((2.0D0*J-1.0D0)*Z*CQM(I,J-1)
11531     &                -(J+I-1.0D0)*CQM(I,J-2))/(J-I)
1153215         CONTINUE
11533           DO 20 J=0,N
11534           DO 20 I=2,M
11535              CQM(I,J)=-2.0D0*(I-1.0D0)*Z/ZQ*CQM(I-1,J)-LS*
11536     &                 (J+I-1.0D0)*(J-I+2.0D0)*CQM(I-2,J)
1153720         CONTINUE
11538        ELSE
11539           IF (XC.GT.1.1) THEN
11540              KM=40+M+N
11541           ELSE
11542              KM=(40+M+N)*INT(-1.0-1.8*LOG(XC-1.0))
11543           ENDIF
11544           CQF2=(0.0D0,0.0D0)
11545           CQF1=(1.0D0,0.0D0)
11546           DO 25 K=KM,0,-1
11547              CQF0=((2*K+3.0D0)*Z*CQF1-(K+2.0D0)*CQF2)/(K+1.0D0)
11548              IF (K.LE.N) CQM(0,K)=CQF0
11549              CQF2=CQF1
1155025            CQF1=CQF0
11551           DO 30 K=0,N
1155230            CQM(0,K)=CQ0*CQM(0,K)/CQF0
11553           CQF2=0.0D0
11554           CQF1=1.0D0
11555           DO 35 K=KM,0,-1
11556              CQF0=((2*K+3.0D0)*Z*CQF1-(K+1.0D0)*CQF2)/(K+2.0D0)
11557              IF (K.LE.N) CQM(1,K)=CQF0
11558              CQF2=CQF1
1155935            CQF1=CQF0
11560           CQ10=-1.0D0/ZQ
11561           DO 40 K=0,N
1156240            CQM(1,K)=CQ10*CQM(1,K)/CQF0
11563           DO 45 J=0,N
11564              CQ0=CQM(0,J)
11565              CQ1=CQM(1,J)
11566              DO 45 I=0,M-2
11567                 CQF=-2.0D0*(I+1)*Z/ZQ*CQ1+(J-I)*(J+I+1.0D0)*CQ0
11568                 CQM(I+2,J)=CQF
11569                 CQ0=CQ1
11570                 CQ1=CQF
1157145         CONTINUE
11572        ENDIF
11573        CQD(0,0)=LS/ZS
11574        DO 50 J=1,N
1157550         CQD(0,J)=LS*J*(CQM(0,J-1)-Z*CQM(0,J))/ZS
11576        DO 55 J=0,N
11577        DO 55 I=1,M
11578           CQD(I,J)=LS*I*Z/ZS*CQM(I,J)+(I+J)*(J-I+1.0D0)
11579     &              /ZQ*CQM(I-1,J)
1158055      CONTINUE
11581        RETURN
11582        END
11583
11584
11585C       **********************************
11586
11587        SUBROUTINE SEGV(M,N,C,KD,CV,EG)
11588C
11589C       =========================================================
11590C       Purpose: Compute the characteristic values of spheroidal
11591C                wave functions
11592C       Input :  m  --- Mode parameter
11593C                n  --- Mode parameter
11594C                c  --- Spheroidal parameter
11595C                KD --- Function code
11596C                       KD=1 for Prolate; KD=-1 for Oblate
11597C       Output:  CV --- Characteristic value for given m, n and c
11598C                EG(L) --- Characteristic value for mode m and n'
11599C                          ( L = n' - m + 1 )
11600C       =========================================================
11601C
11602        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11603        DIMENSION B(100),H(100),D(300),E(300),F(300),CV0(100),
11604     &            A(300),G(300),EG(200)
11605        IF (C.LT.1.0D-10) THEN
11606           DO 5 I=1,N-M+1
116075             EG(I)=(I+M)*(I+M-1.0D0)
11608           GO TO 70
11609        ENDIF
11610        ICM=(N-M+2)/2
11611        NM=10+INT(0.5*(N-M)+C)
11612        CS=C*C*KD
11613        K=0
11614        DO 60 L=0,1
11615           DO 10 I=1,NM
11616              IF (L.EQ.0) K=2*(I-1)
11617              IF (L.EQ.1) K=2*I-1
11618              DK0=M+K
11619              DK1=M+K+1
11620              DK2=2*(M+K)
11621              D2K=2*M+K
11622              A(I)=(D2K+2.0)*(D2K+1.0)/((DK2+3.0)*(DK2+5.0))*CS
11623              D(I)=DK0*DK1+(2.0*DK0*DK1-2.0*M*M-1.0)/((DK2-1.0)
11624     &             *(DK2+3.0))*CS
1162510            G(I)=K*(K-1.0)/((DK2-3.0)*(DK2-1.0))*CS
11626           DO 15 K=2,NM
11627              E(K)=DSQRT(A(K-1)*G(K))
1162815            F(K)=E(K)*E(K)
11629           F(1)=0.0D0
11630           E(1)=0.0D0
11631           XA=D(NM)+DABS(E(NM))
11632           XB=D(NM)-DABS(E(NM))
11633           NM1=NM-1
11634           DO 20 I=1,NM1
11635              T=DABS(E(I))+DABS(E(I+1))
11636              T1=D(I)+T
11637              IF (XA.LT.T1) XA=T1
11638              T1=D(I)-T
11639              IF (T1.LT.XB) XB=T1
1164020         CONTINUE
11641           DO 25 I=1,ICM
11642              B(I)=XA
1164325            H(I)=XB
11644           DO 55 K=1,ICM
11645              DO 30 K1=K,ICM
11646                 IF (B(K1).LT.B(K)) THEN
11647                    B(K)=B(K1)
11648                    GO TO 35
11649                 ENDIF
1165030            CONTINUE
1165135            IF (K.NE.1) THEN
11652                 IF(H(K).LT.H(K-1)) H(K)=H(K-1)
11653              ENDIF
1165440            X1=(B(K)+H(K))/2.0D0
11655              CV0(K)=X1
11656              IF (DABS((B(K)-H(K))/X1).LT.1.0D-14) GO TO 50
11657              J=0
11658              S=1.0D0
11659              DO 45 I=1,NM
11660                 IF (S.EQ.0.0D0) S=S+1.0D-30
11661                 T=F(I)/S
11662                 S=D(I)-T-X1
11663                 IF (S.LT.0.0D0) J=J+1
1166445            CONTINUE
11665              IF (J.LT.K) THEN
11666                 H(K)=X1
11667              ELSE
11668                 B(K)=X1
11669                 IF (J.GE.ICM) THEN
11670                    B(ICM)=X1
11671                 ELSE
11672                    IF (H(J+1).LT.X1) H(J+1)=X1
11673                    IF (X1.LT.B(J)) B(J)=X1
11674                 ENDIF
11675              ENDIF
11676              GO TO 40
1167750            CV0(K)=X1
11678              IF (L.EQ.0) EG(2*K-1)=CV0(K)
11679              IF (L.EQ.1) EG(2*K)=CV0(K)
1168055         CONTINUE
1168160      CONTINUE
1168270      CV=EG(N-M+1)
11683        RETURN
11684        END
11685
11686
11687C       **********************************
11688
11689        SUBROUTINE CIKNB(N,Z,NM,CBI,CDI,CBK,CDK)
11690C
11691C       ============================================================
11692C       Purpose: Compute modified Bessel functions In(z) and Kn(z),
11693C                and their derivatives for a complex argument
11694C       Input:   z --- Complex argument
11695C                n --- Order of In(z) and Kn(z)
11696C       Output:  CBI(n) --- In(z)
11697C                CDI(n) --- In'(z)
11698C                CBK(n) --- Kn(z)
11699C                CDK(n) --- Kn'(z)
11700C                NM --- Highest order computed
11701C       Routones called:
11702C                MSTA1 and MSTA2 to compute the starting point for
11703C                backward recurrence
11704C       ===========================================================
11705C
11706        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
11707        IMPLICIT COMPLEX*16 (C,Z)
11708        DIMENSION CBI(0:N),CDI(0:N),CBK(0:N),CDK(0:N)
11709        PI=3.141592653589793D0
11710        EL=0.57721566490153D0
11711        A0=CDABS(Z)
11712        NM=N
11713        IF (A0.LT.1.0D-100) THEN
11714           DO 10 K=0,N
11715              CBI(K)=(0.0D0,0.0D0)
11716              CBK(K)=(1.0D+300,0.0D0)
11717              CDI(K)=(0.0D0,0.0D0)
1171810            CDK(K)=-(1.0D+300,0.0D0)
11719           CBI(0)=(1.0D0,0.0D0)
11720           CDI(1)=(0.5D0,0.0D0)
11721           RETURN
11722        ENDIF
11723        Z1=Z
11724        CI=(0.0D0,1.0D0)
11725        IF (DBLE(Z).LT.0.0) Z1=-Z
11726        IF (N.EQ.0) NM=1
11727        M=MSTA1(A0,200)
11728        IF (M.LT.NM) THEN
11729           NM=M
11730        ELSE
11731           M=MSTA2(A0,NM,15)
11732        ENDIF
11733        CBS=0.0D0
11734        CSK0=0.0D0
11735        CF0=0.0D0
11736        CF1=1.0D-100
11737        DO 15 K=M,0,-1
11738           CF=2.0D0*(K+1.0D0)*CF1/Z1+CF0
11739           IF (K.LE.NM) CBI(K)=CF
11740           IF (K.NE.0.AND.K.EQ.2*INT(K/2)) CSK0=CSK0+4.0D0*CF/K
11741           CBS=CBS+2.0D0*CF
11742           CF0=CF1
1174315         CF1=CF
11744        CS0=CDEXP(Z1)/(CBS-CF)
11745        DO 20 K=0,NM
1174620         CBI(K)=CS0*CBI(K)
11747        IF (A0.LE.9.0) THEN
11748           CBK(0)=-(CDLOG(0.5D0*Z1)+EL)*CBI(0)+CS0*CSK0
11749           CBK(1)=(1.0D0/Z1-CBI(1)*CBK(0))/CBI(0)
11750        ELSE
11751           CA0=CDSQRT(PI/(2.0D0*Z1))*CDEXP(-Z1)
11752           K0=16
11753           IF (A0.GE.25.0) K0=10
11754           IF (A0.GE.80.0) K0=8
11755           IF (A0.GE.200.0) K0=6
11756           DO 30 L=0,1
11757              CBKL=1.0D0
11758              VT=4.0D0*L
11759              CR=(1.0D0,0.0D0)
11760              DO 25 K=1,K0
11761                 CR=0.125D0*CR*(VT-(2.0*K-1.0)**2)/(K*Z1)
1176225               CBKL=CBKL+CR
11763              CBK(L)=CA0*CBKL
1176430         CONTINUE
11765        ENDIF
11766        CG0=CBK(0)
11767        CG1=CBK(1)
11768        DO 35 K=2,NM
11769           CG=2.0D0*(K-1.0D0)/Z1*CG1+CG0
11770           CBK(K)=CG
11771           CG0=CG1
1177235         CG1=CG
11773        IF (DBLE(Z).LT.0.0) THEN
11774           FAC=1.0D0
11775           DO 45 K=0,NM
11776              IF (DIMAG(Z).LT.0.0) THEN
11777                 CBK(K)=FAC*CBK(K)+CI*PI*CBI(K)
11778              ELSE
11779                 CBK(K)=FAC*CBK(K)-CI*PI*CBI(K)
11780              ENDIF
11781              CBI(K)=FAC*CBI(K)
11782              FAC=-FAC
1178345         CONTINUE
11784        ENDIF
11785        CDI(0)=CBI(1)
11786        CDK(0)=-CBK(1)
11787        DO 50 K=1,NM
11788           CDI(K)=CBI(K-1)-K/Z*CBI(K)
1178950         CDK(K)=-CBK(K-1)-K/Z*CBK(K)
11790        RETURN
11791        END
11792
11793
11794C       **********************************
11795
11796        SUBROUTINE CIKNA(N,Z,NM,CBI,CDI,CBK,CDK)
11797C
11798C       ========================================================
11799C       Purpose: Compute modified Bessel functions In(z), Kn(x)
11800C                and their derivatives for a complex argument
11801C       Input :  z --- Complex argument of In(z) and Kn(z)
11802C                n --- Order of In(z) and Kn(z)
11803C       Output:  CBI(n) --- In(z)
11804C                CDI(n) --- In'(z)
11805C                CBK(n) --- Kn(z)
11806C                CDK(n) --- Kn'(z)
11807C                NM --- Highest order computed
11808C       Routines called:
11809C             (1) CIK01 to compute I0(z), I1(z) K0(z) & K1(z)
11810C             (2) MSTA1 and MSTA2 to compute the starting
11811C                 point for backward recurrence
11812C       ========================================================
11813C
11814        IMPLICIT DOUBLE PRECISION (A,B,P,W,X,Y)
11815        IMPLICIT COMPLEX*16 (C,Z)
11816        DIMENSION CBI(0:N),CDI(0:N),CBK(0:N),CDK(0:N)
11817        A0=CDABS(Z)
11818        NM=N
11819        IF (A0.LT.1.0D-100) THEN
11820           DO 10 K=0,N
11821              CBI(K)=(0.0D0,0.0D0)
11822              CDI(K)=(0.0D0,0.0D0)
11823              CBK(K)=-(1.0D+300,0.0D0)
1182410            CDK(K)=(1.0D+300,0.0D0)
11825           CBI(0)=(1.0D0,0.0D0)
11826           CDI(1)=(0.5D0,0.0D0)
11827           RETURN
11828        ENDIF
11829        CALL CIK01(Z,CBI0,CDI0,CBI1,CDI1,CBK0,CDK0,CBK1,CDK1)
11830        CBI(0)=CBI0
11831        CBI(1)=CBI1
11832        CBK(0)=CBK0
11833        CBK(1)=CBK1
11834        CDI(0)=CDI0
11835        CDI(1)=CDI1
11836        CDK(0)=CDK0
11837        CDK(1)=CDK1
11838        IF (N.LE.1) RETURN
11839        M=MSTA1(A0,200)
11840        IF (M.LT.N) THEN
11841           NM=M
11842        ELSE
11843           M=MSTA2(A0,N,15)
11844        ENDIF
11845        CF2=(0.0D0,0.0D0)
11846        CF1=(1.0D-100,0.0D0)
11847        DO 45 K=M,0,-1
11848           CF=2.0D0*(K+1.0D0)/Z*CF1+CF2
11849           IF (K.LE.NM) CBI(K)=CF
11850           CF2=CF1
1185145         CF1=CF
11852        CS=CBI0/CF
11853        DO 50 K=0,NM
1185450         CBI(K)=CS*CBI(K)
11855        DO 60 K=2,NM
11856           IF (CDABS(CBI(K-1)).GT.CDABS(CBI(K-2))) THEN
11857              CKK=(1.0D0/Z-CBI(K)*CBK(K-1))/CBI(K-1)
11858           ELSE
11859              CKK=(CBI(K)*CBK(K-2)+2.0D0*(K-1.0D0)/(Z*Z))/CBI(K-2)
11860           ENDIF
1186160         CBK(K)=CKK
11862        DO 70 K=2,NM
11863           CDI(K)=CBI(K-1)-K/Z*CBI(K)
1186470         CDK(K)=-CBK(K-1)-K/Z*CBK(K)
11865        RETURN
11866        END
11867
11868
11869
11870C       **********************************
11871
11872        SUBROUTINE MTU12(KF,KC,M,Q,X,F1R,D1R,F2R,D2R)
11873C
11874C       ==============================================================
11875C       Purpose: Compute modified Mathieu functions of the first and
11876C                second kinds, Mcm(1)(2)(x,q) and Msm(1)(2)(x,q),
11877C                and their derivatives
11878C       Input:   KF --- Function code
11879C                       KF=1 for computing Mcm(x,q)
11880C                       KF=2 for computing Msm(x,q)
11881C                KC --- Function Code
11882C                       KC=1 for computing the first kind
11883C                       KC=2 for computing the second kind
11884C                            or Msm(2)(x,q) and Msm(2)'(x,q)
11885C                       KC=3 for computing both the first
11886C                            and second kinds
11887C                m  --- Order of Mathieu functions
11888C                q  --- Parameter of Mathieu functions ( q ≥ 0 )
11889C                x  --- Argument of Mathieu functions
11890C       Output:  F1R --- Mcm(1)(x,q) or Msm(1)(x,q)
11891C                D1R --- Derivative of Mcm(1)(x,q) or Msm(1)(x,q)
11892C                F2R --- Mcm(2)(x,q) or Msm(2)(x,q)
11893C                D2R --- Derivative of Mcm(2)(x,q) or Msm(2)(x,q)
11894C       Routines called:
11895C            (1) CVA2 for computing the characteristic values
11896C            (2) FCOEF for computing expansion coefficients
11897C            (3) JYNB for computing Jn(x), Yn(x) and their
11898C                derivatives
11899C       ==============================================================
11900C
11901        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
11902        DIMENSION FG(251),BJ1(0:251),DJ1(0:251),BJ2(0:251),DJ2(0:251),
11903     &            BY1(0:251),DY1(0:251),BY2(0:251),DY2(0:251)
11904        EPS=1.0D-14
11905        IF (KF.EQ.1.AND.M.EQ.2*INT(M/2)) KD=1
11906        IF (KF.EQ.1.AND.M.NE.2*INT(M/2)) KD=2
11907        IF (KF.EQ.2.AND.M.NE.2*INT(M/2)) KD=3
11908        IF (KF.EQ.2.AND.M.EQ.2*INT(M/2)) KD=4
11909        CALL CVA2(KD,M,Q,A)
11910        IF (Q.LE.1.0D0) THEN
11911           QM=7.5+56.1*SQRT(Q)-134.7*Q+90.7*SQRT(Q)*Q
11912        ELSE
11913           QM=17.0+3.1*SQRT(Q)-.126*Q+.0037*SQRT(Q)*Q
11914        ENDIF
11915        KM=INT(QM+0.5*M)
11916        IF(KM.GE.251) THEN
11917           F1R=DNAN()
11918           D1R=DNAN()
11919           F2R=DNAN()
11920           D2R=DNAN()
11921           RETURN
11922        END IF
11923        CALL FCOEF(KD,M,Q,A,FG)
11924        IC=INT(M/2)+1
11925        IF (KD.EQ.4) IC=M/2
11926        C1=DEXP(-X)
11927        C2=DEXP(X)
11928        U1=DSQRT(Q)*C1
11929        U2=DSQRT(Q)*C2
11930        CALL JYNB(KM+1,U1,NM,BJ1,DJ1,BY1,DY1)
11931        CALL JYNB(KM+1,U2,NM,BJ2,DJ2,BY2,DY2)
11932        W1=0.0D0
11933        W2=0.0D0
11934        IF (KC.EQ.2) GO TO 50
11935        F1R=0.0D0
11936        DO 30 K=1,KM
11937           IF (KD.EQ.1) THEN
11938              F1R=F1R+(-1)**(IC+K)*FG(K)*BJ1(K-1)*BJ2(K-1)
11939           ELSE IF (KD.EQ.2.OR.KD.EQ.3) THEN
11940              F1R=F1R+(-1)**(IC+K)*FG(K)*(BJ1(K-1)*BJ2(K)
11941     &            +(-1)**KD*BJ1(K)*BJ2(K-1))
11942           ELSE
11943              F1R=F1R+(-1)**(IC+K)*FG(K)*(BJ1(K-1)*BJ2(K+1)
11944     &            -BJ1(K+1)*BJ2(K-1))
11945           ENDIF
11946           IF (K.GE.5.AND.DABS(F1R-W1).LT.DABS(F1R)*EPS) GO TO 35
1194730         W1=F1R
1194835      F1R=F1R/FG(1)
11949        D1R=0.0D0
11950        DO 40 K=1,KM
11951           IF (KD.EQ.1) THEN
11952              D1R=D1R+(-1)**(IC+K)*FG(K)*(C2*BJ1(K-1)*DJ2(K-1)
11953     &            -C1*DJ1(K-1)*BJ2(K-1))
11954           ELSE IF (KD.EQ.2.OR.KD.EQ.3) THEN
11955              D1R=D1R+(-1)**(IC+K)*FG(K)*(C2*(BJ1(K-1)*DJ2(K)
11956     &            +(-1)**KD*BJ1(K)*DJ2(K-1))-C1*(DJ1(K-1)*BJ2(K)
11957     &            +(-1)**KD*DJ1(K)*BJ2(K-1)))
11958           ELSE
11959              D1R=D1R+(-1)**(IC+K)*FG(K)*(C2*(BJ1(K-1)*DJ2(K+1)
11960     &            -BJ1(K+1)*DJ2(K-1))-C1*(DJ1(K-1)*BJ2(K+1)
11961     &            -DJ1(K+1)*BJ2(K-1)))
11962           ENDIF
11963           IF (K.GE.5.AND.DABS(D1R-W2).LT.DABS(D1R)*EPS) GO TO 45
1196440         W2=D1R
1196545      D1R=D1R*DSQRT(Q)/FG(1)
11966        IF (KC.EQ.1) RETURN
1196750      F2R=0.0D0
11968        DO 55 K=1,KM
11969           IF (KD.EQ.1) THEN
11970              F2R=F2R+(-1)**(IC+K)*FG(K)*BJ1(K-1)*BY2(K-1)
11971           ELSE IF (KD.EQ.2.OR.KD.EQ.3) THEN
11972              F2R=F2R+(-1)**(IC+K)*FG(K)*(BJ1(K-1)*BY2(K)
11973     &            +(-1)**KD*BJ1(K)*BY2(K-1))
11974           ELSE
11975              F2R=F2R+(-1)**(IC+K)*FG(K)*(BJ1(K-1)*BY2(K+1)
11976     &            -BJ1(K+1)*BY2(K-1))
11977           ENDIF
11978           IF (K.GE.5.AND.DABS(F2R-W1).LT.DABS(F2R)*EPS) GO TO 60
1197955         W1=F2R
1198060      F2R=F2R/FG(1)
11981        D2R=0.0D0
11982        DO 65 K=1,KM
11983           IF (KD.EQ.1) THEN
11984              D2R=D2R+(-1)**(IC+K)*FG(K)*(C2*BJ1(K-1)*DY2(K-1)
11985     &            -C1*DJ1(K-1)*BY2(K-1))
11986           ELSE IF (KD.EQ.2.OR.KD.EQ.3) THEN
11987              D2R=D2R+(-1)**(IC+K)*FG(K)*(C2*(BJ1(K-1)*DY2(K)
11988     &            +(-1)**KD*BJ1(K)*DY2(K-1))-C1*(DJ1(K-1)*BY2(K)
11989     &            +(-1)**KD*DJ1(K)*BY2(K-1)))
11990           ELSE
11991              D2R=D2R+(-1)**(IC+K)*FG(K)*(C2*(BJ1(K-1)*DY2(K+1)
11992     &            -BJ1(K+1)*DY2(K-1))-C1*(DJ1(K-1)*BY2(K+1)
11993     &            -DJ1(K+1)*BY2(K-1)))
11994           ENDIF
11995           IF (K.GE.5.AND.DABS(D2R-W2).LT.DABS(D2R)*EPS) GO TO 70
1199665         W2=D2R
1199770         D2R=D2R*DSQRT(Q)/FG(1)
11998        RETURN
11999        END
12000
12001
12002
12003C       **********************************
12004
12005        SUBROUTINE CIK01(Z,CBI0,CDI0,CBI1,CDI1,CBK0,CDK0,CBK1,CDK1)
12006C
12007C       ==========================================================
12008C       Purpose: Compute modified Bessel functions I0(z), I1(z),
12009C                K0(z), K1(z), and their derivatives for a
12010C                complex argument
12011C       Input :  z --- Complex argument
12012C       Output:  CBI0 --- I0(z)
12013C                CDI0 --- I0'(z)
12014C                CBI1 --- I1(z)
12015C                CDI1 --- I1'(z)
12016C                CBK0 --- K0(z)
12017C                CDK0 --- K0'(z)
12018C                CBK1 --- K1(z)
12019C                CDK1 --- K1'(z)
12020C       ==========================================================
12021C
12022        IMPLICIT DOUBLE PRECISION (A,B,D-H,O-Y)
12023        IMPLICIT COMPLEX*16 (C,Z)
12024        DIMENSION A(12),B(12),A1(10)
12025        PI=3.141592653589793D0
12026        CI=(0.0D0,1.0D0)
12027        A0=CDABS(Z)
12028        Z2=Z*Z
12029        Z1=Z
12030        IF (A0.EQ.0.0D0) THEN
12031           CBI0=(1.0D0,0.0D0)
12032           CBI1=(0.0D0,0.0D0)
12033           CDI0=(0.0D0,0.0D0)
12034           CDI1=(0.5D0,0.0D0)
12035           CBK0=(1.0D+300,0.0D0)
12036           CBK1=(1.0D+300,0.0D0)
12037           CDK0=-(1.0D+300,0.0D0)
12038           CDK1=-(1.0D+300,0.0D0)
12039           RETURN
12040        ENDIF
12041        IF (DBLE(Z).LT.0.0) Z1=-Z
12042        IF (A0.LE.18.0) THEN
12043           CBI0=(1.0D0,0.0D0)
12044           CR=(1.0D0,0.0D0)
12045           DO 10 K=1,50
12046              CR=0.25D0*CR*Z2/(K*K)
12047              CBI0=CBI0+CR
12048              IF (CDABS(CR/CBI0).LT.1.0D-15) GO TO 15
1204910         CONTINUE
1205015         CBI1=(1.0D0,0.0D0)
12051           CR=(1.0D0,0.0D0)
12052           DO 20 K=1,50
12053              CR=0.25D0*CR*Z2/(K*(K+1))
12054              CBI1=CBI1+CR
12055              IF (CDABS(CR/CBI1).LT.1.0D-15) GO TO 25
1205620         CONTINUE
1205725         CBI1=0.5D0*Z1*CBI1
12058        ELSE
12059           DATA A/0.125D0,7.03125D-2,
12060     &            7.32421875D-2,1.1215209960938D-1,
12061     &            2.2710800170898D-1,5.7250142097473D-1,
12062     &            1.7277275025845D0,6.0740420012735D0,
12063     &            2.4380529699556D01,1.1001714026925D02,
12064     &            5.5133589612202D02,3.0380905109224D03/
12065           DATA B/-0.375D0,-1.171875D-1,
12066     &            -1.025390625D-1,-1.4419555664063D-1,
12067     &            -2.7757644653320D-1,-6.7659258842468D-1,
12068     &            -1.9935317337513D0,-6.8839142681099D0,
12069     &            -2.7248827311269D01,-1.2159789187654D02,
12070     &            -6.0384407670507D02,-3.3022722944809D03/
12071           K0=12
12072           IF (A0.GE.35.0) K0=9
12073           IF (A0.GE.50.0) K0=7
12074           CA=CDEXP(Z1)/CDSQRT(2.0D0*PI*Z1)
12075           CBI0=(1.0D0,0.0D0)
12076           ZR=1.0D0/Z1
12077           DO 30 K=1,K0
1207830            CBI0=CBI0+A(K)*ZR**K
12079           CBI0=CA*CBI0
12080           CBI1=(1.0D0,0.0D0)
12081           DO 35 K=1,K0
1208235            CBI1=CBI1+B(K)*ZR**K
12083           CBI1=CA*CBI1
12084        ENDIF
12085        IF (A0.LE.9.0) THEN
12086           CS=(0.0D0,0.0D0)
12087           CT=-CDLOG(0.5D0*Z1)-0.5772156649015329D0
12088           W0=0.0D0
12089           CR=(1.0D0,0.0D0)
12090           DO 40 K=1,50
12091              W0=W0+1.0D0/K
12092              CR=0.25D0*CR/(K*K)*Z2
12093              CS=CS+CR*(W0+CT)
12094              IF (CDABS((CS-CW)/CS).LT.1.0D-15) GO TO 45
1209540            CW=CS
1209645         CBK0=CT+CS
12097        ELSE
12098           DATA A1/0.125D0,0.2109375D0,
12099     &             1.0986328125D0,1.1775970458984D01,
12100     &             2.1461706161499D02,5.9511522710323D03,
12101     &             2.3347645606175D05,1.2312234987631D07,
12102     &             8.401390346421D08,7.2031420482627D10/
12103           CB=0.5D0/Z1
12104           ZR2=1.0D0/Z2
12105           CBK0=(1.0D0,0.0D0)
12106           DO 50 K=1,10
1210750            CBK0=CBK0+A1(K)*ZR2**K
12108           CBK0=CB*CBK0/CBI0
12109        ENDIF
12110        CBK1=(1.0D0/Z1-CBI1*CBK0)/CBI0
12111        IF (DBLE(Z).LT.0.0) THEN
12112           IF (DIMAG(Z).LT.0.0) CBK0=CBK0+CI*PI*CBI0
12113           IF (DIMAG(Z).GT.0.0) CBK0=CBK0-CI*PI*CBI0
12114           IF (DIMAG(Z).LT.0.0) CBK1=-CBK1+CI*PI*CBI1
12115           IF (DIMAG(Z).GT.0.0) CBK1=-CBK1-CI*PI*CBI1
12116           CBI1=-CBI1
12117        ENDIF
12118        CDI0=CBI1
12119        CDI1=CBI0-1.0D0/Z*CBI1
12120        CDK0=-CBK1
12121        CDK1=-CBK0-1.0D0/Z*CBK1
12122        RETURN
12123        END
12124
12125C       **********************************
12126
12127        SUBROUTINE CPSI(X,Y,PSR,PSI)
12128C
12129C       =============================================
12130C       Purpose: Compute the psi function for a
12131C                complex argument
12132C       Input :  x   --- Real part of z
12133C                y   --- Imaginary part of z
12134C       Output:  PSR --- Real part of psi(z)
12135C                PSI --- Imaginary part of psi(z)
12136C       =============================================
12137C
12138        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
12139        DIMENSION A(8)
12140        DATA A/-.8333333333333D-01,.83333333333333333D-02,
12141     &       -.39682539682539683D-02,.41666666666666667D-02,
12142     &       -.75757575757575758D-02,.21092796092796093D-01,
12143     &       -.83333333333333333D-01,.4432598039215686D0/
12144        PI=3.141592653589793D0
12145        IF (Y.EQ.0.0D0.AND.X.EQ.INT(X).AND.X.LE.0.0D0) THEN
12146           PSR=1.0D+300
12147           PSI=0.0D0
12148        ELSE
12149           X1=X
12150           Y1=Y
12151           IF (X.LT.0.0D0) THEN
12152              X=-X
12153              Y=-Y
12154           ENDIF
12155           X0=X
12156           N=0
12157           IF (X.LT.8.0D0) THEN
12158              N=8-INT(X)
12159              X0=X+N
12160           ENDIF
12161           TH=0.0D0
12162           IF (X0.EQ.0.0D0.AND.Y.NE.0.0D0) TH=0.5D0*PI
12163           IF (X0.NE.0.0D0) TH=DATAN(Y/X0)
12164           Z2=X0*X0+Y*Y
12165           Z0=DSQRT(Z2)
12166           PSR=DLOG(Z0)-0.5D0*X0/Z2
12167           PSI=TH+0.5D0*Y/Z2
12168           DO 10 K=1,8
12169              PSR=PSR+A(K)*Z2**(-K)*DCOS(2.0D0*K*TH)
1217010            PSI=PSI-A(K)*Z2**(-K)*DSIN(2.0D0*K*TH)
12171           IF (X.LT.8.0D0) THEN
12172              RR=0.0D0
12173              RI=0.0D0
12174              DO 20 K=1,N
12175                 RR=RR+(X0-K)/((X0-K)**2.0D0+Y*Y)
1217620               RI=RI+Y/((X0-K)**2.0D0+Y*Y)
12177              PSR=PSR-RR
12178              PSI=PSI+RI
12179           ENDIF
12180           IF (X1.LT.0.0D0) THEN
12181              TN=DTAN(PI*X)
12182              TM=DTANH(PI*Y)
12183              CT2=TN*TN+TM*TM
12184              PSR=PSR+X/(X*X+Y*Y)+PI*(TN-TN*TM*TM)/CT2
12185              PSI=PSI-Y/(X*X+Y*Y)-PI*TM*(1.0D0+TN*TN)/CT2
12186              X=X1
12187              Y=Y1
12188           ENDIF
12189        ENDIF
12190        RETURN
12191        END
12192
12193C       **********************************
12194
12195        SUBROUTINE SPHY(N,X,NM,SY,DY)
12196C
12197C       ======================================================
12198C       Purpose: Compute spherical Bessel functions yn(x) and
12199C                their derivatives
12200C       Input :  x --- Argument of yn(x) ( x ≥ 0 )
12201C                n --- Order of yn(x) ( n = 0,1,… )
12202C       Output:  SY(n) --- yn(x)
12203C                DY(n) --- yn'(x)
12204C                NM --- Highest order computed
12205C       ======================================================
12206C
12207        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
12208        DIMENSION SY(0:N),DY(0:N)
12209        NM=N
12210        IF (X.LT.1.0D-60) THEN
12211           DO 10 K=0,N
12212              SY(K)=-1.0D+300
1221310            DY(K)=1.0D+300
12214           RETURN
12215        ENDIF
12216        SY(0)=-DCOS(X)/X
12217        F0=SY(0)
12218        DY(0)=(DSIN(X)+DCOS(X)/X)/X
12219        IF (N.LT.1) THEN
12220           RETURN
12221        ENDIF
12222        SY(1)=(SY(0)-DSIN(X))/X
12223        F1=SY(1)
12224        DO 15 K=2,N
12225           F=(2.0D0*K-1.0D0)*F1/X-F0
12226           SY(K)=F
12227           IF (DABS(F).GE.1.0D+300) GO TO 20
12228           F0=F1
1222915         F1=F
1223020      NM=K-1
12231        DO 25 K=1,NM
1223225         DY(K)=SY(K-1)-(K+1.0D0)*SY(K)/X
12233        RETURN
12234        END
12235
12236C       **********************************
12237
12238        SUBROUTINE JELP(U,HK,ESN,ECN,EDN,EPH)
12239C
12240C       ========================================================
12241C       Purpose: Compute Jacobian elliptic functions sn u, cn u
12242C                and dn u
12243C       Input  : u   --- Argument of Jacobian elliptic functions
12244C                Hk  --- Modulus k ( 0 ≤ k ≤ 1 )
12245C       Output : ESN --- sn u
12246C                ECN --- cn u
12247C                EDN --- dn u
12248C                EPH --- phi ( in degrees )
12249C       ========================================================
12250C
12251        IMPLICIT DOUBLE PRECISION (A-H,O-Z)
12252        DIMENSION R(40)
12253        PI=3.14159265358979D0
12254        A0=1.0D0
12255        B0=DSQRT(1.0D0-HK*HK)
12256        DO 10 N=1,40
12257           A=(A0+B0)/2.0D0
12258           B=DSQRT(A0*B0)
12259           C=(A0-B0)/2.0D0
12260           R(N)=C/A
12261           IF (C.LT.1.0D-7) GO TO 15
12262           A0=A
1226310         B0=B
1226415      DN=2.0D0**N*A*U
12265        D=0.0D0
12266        DO 20 J=N,1,-1
12267           T=R(J)*DSIN(DN)
12268           SA=DATAN(T/DSQRT(DABS(1.0D0-T*T)))
12269           D=.5D0*(DN+SA)
1227020         DN=D
12271        EPH=D*180.0D0/PI
12272        ESN=DSIN(D)
12273        ECN=DCOS(D)
12274        EDN=DSQRT(1.0D0-HK*HK*ESN*ESN)
12275        RETURN
12276        END
12277