gonum.org/v1/gonum@v0.14.0/mathext/internal/amos/amoslib/zacai.f (about) 1 SUBROUTINE ZACAI(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, TOL, 2 * ELIM, ALIM) 3 C***BEGIN PROLOGUE ZACAI 4 C***REFER TO ZAIRY 5 C 6 C ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA 7 C 8 C K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN) 9 C MP=PI*MR*CMPLX(0.0,1.0) 10 C 11 C TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT 12 C HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1. 13 C ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND 14 C RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON 15 C IS CALLED FROM ZAIRY. 16 C 17 C***ROUTINES CALLED ZASYI,ZBKNU,ZMLRI,ZSERI,ZS1S2,D1MACH,ZABS 18 C***END PROLOGUE ZACAI 19 C COMPLEX CSGN,CSPN,C1,C2,Y,Z,ZN,CY 20 DOUBLE PRECISION ALIM, ARG, ASCLE, AZ, CSGNR, CSGNI, CSPNR, 21 * CSPNI, C1R, C1I, C2R, C2I, CYR, CYI, DFNU, ELIM, FMR, FNU, PI, 22 * RL, SGN, TOL, YY, YR, YI, ZR, ZI, ZNR, ZNI, D1MACH, ZABS 23 INTEGER INU, IUF, KODE, MR, N, NN, NW, NZ 24 DIMENSION YR(N), YI(N), CYR(2), CYI(2) 25 DATA PI / 3.14159265358979324D0 / 26 NZ = 0 27 ZNR = -ZR 28 ZNI = -ZI 29 AZ = ZABS(CMPLX(ZR,ZI,kind=KIND(1.0D0))) 30 NN = N 31 DFNU = FNU + DBLE(FLOAT(N-1)) 32 IF (AZ.LE.2.0D0) GO TO 10 33 IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20 34 10 CONTINUE 35 C----------------------------------------------------------------------- 36 C POWER SERIES FOR THE I FUNCTION 37 C----------------------------------------------------------------------- 38 CALL ZSERI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL, ELIM, ALIM) 39 GO TO 40 40 20 CONTINUE 41 IF (AZ.LT.RL) GO TO 30 42 C----------------------------------------------------------------------- 43 C ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION 44 C----------------------------------------------------------------------- 45 CALL ZASYI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, TOL, ELIM, 46 * ALIM) 47 IF (NW.LT.0) GO TO 80 48 GO TO 40 49 30 CONTINUE 50 C----------------------------------------------------------------------- 51 C MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION 52 C----------------------------------------------------------------------- 53 CALL ZMLRI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL) 54 IF(NW.LT.0) GO TO 80 55 40 CONTINUE 56 C----------------------------------------------------------------------- 57 C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION 58 C----------------------------------------------------------------------- 59 CALL ZBKNU(ZNR, ZNI, FNU, KODE, 1, CYR, CYI, NW, TOL, ELIM, ALIM) 60 IF (NW.NE.0) GO TO 80 61 FMR = DBLE(FLOAT(MR)) 62 SGN = -DSIGN(PI,FMR) 63 CSGNR = 0.0D0 64 CSGNI = SGN 65 IF (KODE.EQ.1) GO TO 50 66 YY = -ZNI 67 CSGNR = -CSGNI*DSIN(YY) 68 CSGNI = CSGNI*DCOS(YY) 69 50 CONTINUE 70 C----------------------------------------------------------------------- 71 C CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE 72 C WHEN FNU IS LARGE 73 C----------------------------------------------------------------------- 74 INU = INT(SNGL(FNU)) 75 ARG = (FNU-DBLE(FLOAT(INU)))*SGN 76 CSPNR = DCOS(ARG) 77 CSPNI = DSIN(ARG) 78 IF (MOD(INU,2).EQ.0) GO TO 60 79 CSPNR = -CSPNR 80 CSPNI = -CSPNI 81 60 CONTINUE 82 C1R = CYR(1) 83 C1I = CYI(1) 84 C2R = YR(1) 85 C2I = YI(1) 86 IF (KODE.EQ.1) GO TO 70 87 IUF = 0 88 ASCLE = 1.0D+3*D1MACH(1)/TOL 89 CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF) 90 NZ = NZ + NW 91 70 CONTINUE 92 YR(1) = CSPNR*C1R - CSPNI*C1I + CSGNR*C2R - CSGNI*C2I 93 YI(1) = CSPNR*C1I + CSPNI*C1R + CSGNR*C2I + CSGNI*C2R 94 RETURN 95 80 CONTINUE 96 NZ = -1 97 IF(NW.EQ.(-2)) NZ=-2 98 RETURN 99 END