zacon.f 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. SUBROUTINE ZACON(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, FNUL,
  2. * TOL, ELIM, ALIM)
  3. C***BEGIN PROLOGUE ZACON
  4. C***REFER TO ZBESK,ZBESH
  5. C
  6. C ZACON 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
  13. C
  14. C***ROUTINES CALLED ZBINU,ZBKNU,ZS1S2,D1MACH,ZABS,ZMLT
  15. C***END PROLOGUE ZACON
  16. C COMPLEX CK,CONE,CSCL,CSCR,CSGN,CSPN,CY,CZERO,C1,C2,RZ,SC1,SC2,ST,
  17. C *S1,S2,Y,Z,ZN
  18. DOUBLE PRECISION ALIM, ARG, ASCLE, AS2, AZN, BRY, BSCLE, CKI,
  19. * CKR, CONER, CPN, CSCL, CSCR, CSGNI, CSGNR, CSPNI, CSPNR,
  20. * CSR, CSRR, CSSR, CYI, CYR, C1I, C1M, C1R, C2I, C2R, ELIM, FMR,
  21. * FN, FNU, FNUL, PI, PTI, PTR, RAZN, RL, RZI, RZR, SC1I, SC1R,
  22. * SC2I, SC2R, SGN, SPN, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR,
  23. * YY, ZEROR, ZI, ZNI, ZNR, ZR, D1MACH, ZABS
  24. INTEGER I, INU, IUF, KFLAG, KODE, MR, N, NN, NW, NZ
  25. DIMENSION YR(N), YI(N), CYR(2), CYI(2), CSSR(3), CSRR(3), BRY(3)
  26. DATA PI / 3.14159265358979324D0 /
  27. DATA ZEROR,CONER / 0.0D0,1.0D0 /
  28. NZ = 0
  29. ZNR = -ZR
  30. ZNI = -ZI
  31. NN = N
  32. CALL ZBINU(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, FNUL, TOL,
  33. * ELIM, ALIM)
  34. IF (NW.LT.0) GO TO 90
  35. C-----------------------------------------------------------------------
  36. C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
  37. C-----------------------------------------------------------------------
  38. NN = MIN0(2,N)
  39. CALL ZBKNU(ZNR, ZNI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
  40. IF (NW.NE.0) GO TO 90
  41. S1R = CYR(1)
  42. S1I = CYI(1)
  43. FMR = DBLE(FLOAT(MR))
  44. SGN = -DSIGN(PI,FMR)
  45. CSGNR = ZEROR
  46. CSGNI = SGN
  47. IF (KODE.EQ.1) GO TO 10
  48. YY = -ZNI
  49. CPN = DCOS(YY)
  50. SPN = DSIN(YY)
  51. CALL ZMLT(CSGNR, CSGNI, CPN, SPN, CSGNR, CSGNI)
  52. 10 CONTINUE
  53. C-----------------------------------------------------------------------
  54. C CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
  55. C WHEN FNU IS LARGE
  56. C-----------------------------------------------------------------------
  57. INU = INT(SNGL(FNU))
  58. ARG = (FNU-DBLE(FLOAT(INU)))*SGN
  59. CPN = DCOS(ARG)
  60. SPN = DSIN(ARG)
  61. CSPNR = CPN
  62. CSPNI = SPN
  63. IF (MOD(INU,2).EQ.0) GO TO 20
  64. CSPNR = -CSPNR
  65. CSPNI = -CSPNI
  66. 20 CONTINUE
  67. IUF = 0
  68. C1R = S1R
  69. C1I = S1I
  70. C2R = YR(1)
  71. C2I = YI(1)
  72. ASCLE = 1.0D+3*D1MACH(1)/TOL
  73. IF (KODE.EQ.1) GO TO 30
  74. CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
  75. NZ = NZ + NW
  76. SC1R = C1R
  77. SC1I = C1I
  78. 30 CONTINUE
  79. CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
  80. CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
  81. YR(1) = STR + PTR
  82. YI(1) = STI + PTI
  83. IF (N.EQ.1) RETURN
  84. CSPNR = -CSPNR
  85. CSPNI = -CSPNI
  86. S2R = CYR(2)
  87. S2I = CYI(2)
  88. C1R = S2R
  89. C1I = S2I
  90. C2R = YR(2)
  91. C2I = YI(2)
  92. IF (KODE.EQ.1) GO TO 40
  93. CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
  94. NZ = NZ + NW
  95. SC2R = C1R
  96. SC2I = C1I
  97. 40 CONTINUE
  98. CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
  99. CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
  100. YR(2) = STR + PTR
  101. YI(2) = STI + PTI
  102. IF (N.EQ.2) RETURN
  103. CSPNR = -CSPNR
  104. CSPNI = -CSPNI
  105. AZN = ZABS(COMPLEX(ZNR,ZNI))
  106. RAZN = 1.0D0/AZN
  107. STR = ZNR*RAZN
  108. STI = -ZNI*RAZN
  109. RZR = (STR+STR)*RAZN
  110. RZI = (STI+STI)*RAZN
  111. FN = FNU + 1.0D0
  112. CKR = FN*RZR
  113. CKI = FN*RZI
  114. C-----------------------------------------------------------------------
  115. C SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS
  116. C-----------------------------------------------------------------------
  117. CSCL = 1.0D0/TOL
  118. CSCR = TOL
  119. CSSR(1) = CSCL
  120. CSSR(2) = CONER
  121. CSSR(3) = CSCR
  122. CSRR(1) = CSCR
  123. CSRR(2) = CONER
  124. CSRR(3) = CSCL
  125. BRY(1) = ASCLE
  126. BRY(2) = 1.0D0/ASCLE
  127. BRY(3) = D1MACH(2)
  128. AS2 = ZABS(COMPLEX(S2R,S2I))
  129. KFLAG = 2
  130. IF (AS2.GT.BRY(1)) GO TO 50
  131. KFLAG = 1
  132. GO TO 60
  133. 50 CONTINUE
  134. IF (AS2.LT.BRY(2)) GO TO 60
  135. KFLAG = 3
  136. 60 CONTINUE
  137. BSCLE = BRY(KFLAG)
  138. S1R = S1R*CSSR(KFLAG)
  139. S1I = S1I*CSSR(KFLAG)
  140. S2R = S2R*CSSR(KFLAG)
  141. S2I = S2I*CSSR(KFLAG)
  142. CSR = CSRR(KFLAG)
  143. DO 80 I=3,N
  144. STR = S2R
  145. STI = S2I
  146. S2R = CKR*STR - CKI*STI + S1R
  147. S2I = CKR*STI + CKI*STR + S1I
  148. S1R = STR
  149. S1I = STI
  150. C1R = S2R*CSR
  151. C1I = S2I*CSR
  152. STR = C1R
  153. STI = C1I
  154. C2R = YR(I)
  155. C2I = YI(I)
  156. IF (KODE.EQ.1) GO TO 70
  157. IF (IUF.LT.0) GO TO 70
  158. CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
  159. NZ = NZ + NW
  160. SC1R = SC2R
  161. SC1I = SC2I
  162. SC2R = C1R
  163. SC2I = C1I
  164. IF (IUF.NE.3) GO TO 70
  165. IUF = -4
  166. S1R = SC1R*CSSR(KFLAG)
  167. S1I = SC1I*CSSR(KFLAG)
  168. S2R = SC2R*CSSR(KFLAG)
  169. S2I = SC2I*CSSR(KFLAG)
  170. STR = SC2R
  171. STI = SC2I
  172. 70 CONTINUE
  173. PTR = CSPNR*C1R - CSPNI*C1I
  174. PTI = CSPNR*C1I + CSPNI*C1R
  175. YR(I) = PTR + CSGNR*C2R - CSGNI*C2I
  176. YI(I) = PTI + CSGNR*C2I + CSGNI*C2R
  177. CKR = CKR + RZR
  178. CKI = CKI + RZI
  179. CSPNR = -CSPNR
  180. CSPNI = -CSPNI
  181. IF (KFLAG.GE.3) GO TO 80
  182. PTR = DABS(C1R)
  183. PTI = DABS(C1I)
  184. C1M = DMAX1(PTR,PTI)
  185. IF (C1M.LE.BSCLE) GO TO 80
  186. KFLAG = KFLAG + 1
  187. BSCLE = BRY(KFLAG)
  188. S1R = S1R*CSR
  189. S1I = S1I*CSR
  190. S2R = STR
  191. S2I = STI
  192. S1R = S1R*CSSR(KFLAG)
  193. S1I = S1I*CSSR(KFLAG)
  194. S2R = S2R*CSSR(KFLAG)
  195. S2I = S2I*CSSR(KFLAG)
  196. CSR = CSRR(KFLAG)
  197. 80 CONTINUE
  198. RETURN
  199. 90 CONTINUE
  200. NZ = -1
  201. IF(NW.EQ.(-2)) NZ=-2
  202. RETURN
  203. END