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