C ALGORITHM 484 COLLECTED ALGORITHMS FROM ACM. C ALGORITHM APPEARED IN COMM. ACM, VOL. 17, NO. 09, C P. 524. SUBROUTINE KZEONE(X, Y, RE0, IM0, RE1, IM1) KZE 10 C THE VARIABLES X AND Y ARE THE REAL AND IMAGINARY PARTS OF C THE ARGUMENT OF THE FIRST TWO MODIFIED BESSEL FUNCTIONS C OF THE SECOND KIND,K0 AND K1. RE0,IM0,RE1 AND IM1 GIVE C THE REAL AND IMAGINARY PARTS OF EXP(X)*K0 AND EXP(X)*K1, C RESPECTIVELY. ALTHOUGH THE REAL NOTATION USED IN THIS C SUBROUTINE MAY SEEM INELEGANT WHEN COMPARED WITH THE C COMPLEX NOTATION THAT FORTRAN ALLOWS, THIS VERSION RUNS C ABOUT 30 PERCENT FASTER THAN ONE WRITTEN USING COMPLEX C VARIABLES. DOUBLE PRECISION X, Y, X2, Y2, RE0, IM0, RE1, IM1, * R1, R2, T1, T2, P1, P2, RTERM, ITERM, EXSQ(8), TSQ(8) DATA TSQ(1) /0.0D0/, TSQ(2) /3.19303633920635D-1/, * TSQ(3) /1.29075862295915D0/, TSQ(4) * /2.95837445869665D0/, TSQ(5) /5.40903159724444D0/, * TSQ(6) /8.80407957805676D0/, TSQ(7) * /1.34685357432515D1/, TSQ(8) /2.02499163658709D1/, * EXSQ(1) /0.5641003087264D0/, EXSQ(2) * /0.4120286874989D0/, EXSQ(3) /0.1584889157959D0/, * EXSQ(4) /0.3078003387255D-1/, EXSQ(5) * /0.2778068842913D-2/, EXSQ(6) /0.1000044412325D-3/, * EXSQ(7) /0.1059115547711D-5/, EXSQ(8) * /0.1522475804254D-8/ C THE ARRAYS TSQ AND EXSQ CONTAIN THE SQUARE OF THE C ABSCISSAS AND THE WEIGHT FACTORS USED IN THE GAUSS- C HERMITE QUADRATURE. R2 = X*X + Y*Y IF (X.GT.0.0D0 .OR. R2.NE.0.0D0) GO TO 10 WRITE (6,99999) RETURN 10 IF (R2.GE.1.96D2) GO TO 50 IF (R2.GE.1.849D1) GO TO 30 C THIS SECTION CALCULATES THE FUNCTIONS USING THE SERIES C EXPANSIONS X2 = X/2.0D0 Y2 = Y/2.0D0 P1 = X2*X2 P2 = Y2*Y2 T1 = -(DLOG(P1+P2)/2.0D0+0.5772156649015329D0) C THE CONSTANT IN THE PRECEDING STATEMENT IS EULER*S C CONSTANT T2 = -DATAN2(Y,X) X2 = P1 - P2 Y2 = X*Y2 RTERM = 1.0D0 ITERM = 0.0D0 RE0 = T1 IM0 = T2 T1 = T1 + 0.5D0 RE1 = T1 IM1 = T2 P2 = DSQRT(R2) L = 2.106D0*P2 + 4.4D0 IF (P2.LT.8.0D-1) L = 2.129D0*P2 + 4.0D0 DO 20 N=1,L P1 = N P2 = N*N R1 = RTERM RTERM = (R1*X2-ITERM*Y2)/P2 ITERM = (R1*Y2+ITERM*X2)/P2 T1 = T1 + 0.5D0/P1 RE0 = RE0 + T1*RTERM - T2*ITERM IM0 = IM0 + T1*ITERM + T2*RTERM P1 = P1 + 1.0D0 T1 = T1 + 0.5D0/P1 RE1 = RE1 + (T1*RTERM-T2*ITERM)/P1 IM1 = IM1 + (T1*ITERM+T2*RTERM)/P1 20 CONTINUE R1 = X/R2 - 0.5D0*(X*RE1-Y*IM1) R2 = -Y/R2 - 0.5D0*(X*IM1+Y*RE1) P1 = DEXP(X) RE0 = P1*RE0 IM0 = P1*IM0 RE1 = P1*R1 IM1 = P1*R2 RETURN C THIS SECTION CALCULATES THE FUNCTIONS USING THE INTEGRAL C REPRESENTATION, EQN 3, EVALUATED WITH 15 POINT GAUSS- C HERMITE QUADRATURE 30 X2 = 2.0D0*X Y2 = 2.0D0*Y R1 = Y2*Y2 P1 = DSQRT(X2*X2+R1) P2 = DSQRT(P1+X2) T1 = EXSQ(1)/(2.0D0*P1) RE0 = T1*P2 IM0 = T1/P2 RE1 = 0.0D0 IM1 = 0.0D0 DO 40 N=2,8 T2 = X2 + TSQ(N) P1 = DSQRT(T2*T2+R1) P2 = DSQRT(P1+T2) T1 = EXSQ(N)/P1 RE0 = RE0 + T1*P2 IM0 = IM0 + T1/P2 T1 = EXSQ(N)*TSQ(N) RE1 = RE1 + T1*P2 IM1 = IM1 + T1/P2 40 CONTINUE T2 = -Y2*IM0 RE1 = RE1/R2 R2 = Y2*IM1/R2 RTERM = 1.41421356237309D0*DCOS(Y) ITERM = -1.41421356237309D0*DSIN(Y) C THE CONSTANT IN THE PREVIOUS STATEMENTS IS,OF COURSE, C SQRT(2.0). IM0 = RE0*ITERM + T2*RTERM RE0 = RE0*RTERM - T2*ITERM T1 = RE1*RTERM - R2*ITERM T2 = RE1*ITERM + R2*RTERM RE1 = T1*X + T2*Y IM1 = -T1*Y + T2*X RETURN C THIS SECTION CALCULATES THE FUNCTIONS USING THE C ASYMPTOTIC EXPANSIONS 50 RTERM = 1.0D0 ITERM = 0.0D0 RE0 = 1.0D0 IM0 = 0.0D0 RE1 = 1.0D0 IM1 = 0.0D0 P1 = 8.0D0*R2 P2 = DSQRT(R2) L = 3.91D0+8.12D1/P2 R1 = 1.0D0 R2 = 1.0D0 M = -8 K = 3 DO 60 N=1,L M = M + 8 K = K - M R1 = FLOAT(K-4)*R1 R2 = FLOAT(K)*R2 T1 = FLOAT(N)*P1 T2 = RTERM RTERM = (T2*X+ITERM*Y)/T1 ITERM = (-T2*Y+ITERM*X)/T1 RE0 = RE0 + R1*RTERM IM0 = IM0 + R1*ITERM RE1 = RE1 + R2*RTERM IM1 = IM1 + R2*ITERM 60 CONTINUE T1 = DSQRT(P2+X) T2 = -Y/T1 P1 = 8.86226925452758D-1/P2 C THIS CONSTANT IS SQRT(PI)/2.0, WITH PI=3.14159... RTERM = P1*DCOS(Y) ITERM = -P1*DSIN(Y) R1 = RE0*RTERM - IM0*ITERM R2 = RE0*ITERM + IM0*RTERM RE0 = T1*R1 - T2*R2 IM0 = T1*R2 + T2*R1 R1 = RE1*RTERM - IM1*ITERM R2 = RE1*ITERM + IM1*RTERM RE1 = T1*R1 - T2*R2 IM1 = T1*R2 + T2*R1 RETURN 99999 FORMAT (42H ARGUMENT OF THE BESSEL FUNCTIONS IS ZERO, * 35H OR LIES IN LEFT HALF COMPLEX PLANE) END