cacon.f 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. *DECK CACON
  2. SUBROUTINE CACON (Z, FNU, KODE, MR, N, Y, NZ, RL, FNUL, TOL, ELIM,
  3. + ALIM)
  4. C***BEGIN PROLOGUE CACON
  5. C***SUBSIDIARY
  6. C***PURPOSE Subsidiary to CBESH and CBESK
  7. C***LIBRARY SLATEC
  8. C***TYPE ALL (CACON-A, ZACON-A)
  9. C***AUTHOR Amos, D. E., (SNL)
  10. C***DESCRIPTION
  11. C
  12. C CACON APPLIES THE ANALYTIC CONTINUATION FORMULA
  13. C
  14. C K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
  15. C MP=PI*MR*CMPLX(0.0,1.0)
  16. C
  17. C TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
  18. C HALF Z PLANE
  19. C
  20. C***SEE ALSO CBESH, CBESK
  21. C***ROUTINES CALLED CBINU, CBKNU, CS1S2, R1MACH
  22. C***REVISION HISTORY (YYMMDD)
  23. C 830501 DATE WRITTEN
  24. C 910415 Prologue converted to Version 4.0 format. (BAB)
  25. C***END PROLOGUE CACON
  26. COMPLEX CK, CONE, CS, CSCL, CSCR, CSGN, CSPN, CSS, CSR, C1, C2,
  27. * RZ, SC1, SC2, ST, S1, S2, Y, Z, ZN, CY
  28. REAL ALIM, ARG, ASCLE, AS2, BSCLE, BRY, CPN, C1I, C1M, C1R, ELIM,
  29. * FMR, FNU, FNUL, PI, RL, SGN, SPN, TOL, YY, R1MACH
  30. INTEGER I, INU, IUF, KFLAG, KODE, MR, N, NN, NW, NZ
  31. DIMENSION Y(N), CY(2), CSS(3), CSR(3), BRY(3)
  32. DATA PI / 3.14159265358979324E0 /
  33. DATA CONE / (1.0E0,0.0E0) /
  34. C***FIRST EXECUTABLE STATEMENT CACON
  35. NZ = 0
  36. ZN = -Z
  37. NN = N
  38. CALL CBINU(ZN, FNU, KODE, NN, Y, NW, RL, FNUL, TOL, ELIM, ALIM)
  39. IF (NW.LT.0) GO TO 80
  40. C-----------------------------------------------------------------------
  41. C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
  42. C-----------------------------------------------------------------------
  43. NN = MIN(2,N)
  44. CALL CBKNU(ZN, FNU, KODE, NN, CY, NW, TOL, ELIM, ALIM)
  45. IF (NW.NE.0) GO TO 80
  46. S1 = CY(1)
  47. FMR = MR
  48. SGN = -SIGN(PI,FMR)
  49. CSGN = CMPLX(0.0E0,SGN)
  50. IF (KODE.EQ.1) GO TO 10
  51. YY = -AIMAG(ZN)
  52. CPN = COS(YY)
  53. SPN = SIN(YY)
  54. CSGN = CSGN*CMPLX(CPN,SPN)
  55. 10 CONTINUE
  56. C-----------------------------------------------------------------------
  57. C CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
  58. C WHEN FNU IS LARGE
  59. C-----------------------------------------------------------------------
  60. INU = FNU
  61. ARG = (FNU-INU)*SGN
  62. CPN = COS(ARG)
  63. SPN = SIN(ARG)
  64. CSPN = CMPLX(CPN,SPN)
  65. IF (MOD(INU,2).EQ.1) CSPN = -CSPN
  66. IUF = 0
  67. C1 = S1
  68. C2 = Y(1)
  69. ASCLE = 1.0E+3*R1MACH(1)/TOL
  70. IF (KODE.EQ.1) GO TO 20
  71. CALL CS1S2(ZN, C1, C2, NW, ASCLE, ALIM, IUF)
  72. NZ = NZ + NW
  73. SC1 = C1
  74. 20 CONTINUE
  75. Y(1) = CSPN*C1 + CSGN*C2
  76. IF (N.EQ.1) RETURN
  77. CSPN = -CSPN
  78. S2 = CY(2)
  79. C1 = S2
  80. C2 = Y(2)
  81. IF (KODE.EQ.1) GO TO 30
  82. CALL CS1S2(ZN, C1, C2, NW, ASCLE, ALIM, IUF)
  83. NZ = NZ + NW
  84. SC2 = C1
  85. 30 CONTINUE
  86. Y(2) = CSPN*C1 + CSGN*C2
  87. IF (N.EQ.2) RETURN
  88. CSPN = -CSPN
  89. RZ = CMPLX(2.0E0,0.0E0)/ZN
  90. CK = CMPLX(FNU+1.0E0,0.0E0)*RZ
  91. C-----------------------------------------------------------------------
  92. C SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS
  93. C-----------------------------------------------------------------------
  94. CSCL = CMPLX(1.0E0/TOL,0.0E0)
  95. CSCR = CMPLX(TOL,0.0E0)
  96. CSS(1) = CSCL
  97. CSS(2) = CONE
  98. CSS(3) = CSCR
  99. CSR(1) = CSCR
  100. CSR(2) = CONE
  101. CSR(3) = CSCL
  102. BRY(1) = ASCLE
  103. BRY(2) = 1.0E0/ASCLE
  104. BRY(3) = R1MACH(2)
  105. AS2 = ABS(S2)
  106. KFLAG = 2
  107. IF (AS2.GT.BRY(1)) GO TO 40
  108. KFLAG = 1
  109. GO TO 50
  110. 40 CONTINUE
  111. IF (AS2.LT.BRY(2)) GO TO 50
  112. KFLAG = 3
  113. 50 CONTINUE
  114. BSCLE = BRY(KFLAG)
  115. S1 = S1*CSS(KFLAG)
  116. S2 = S2*CSS(KFLAG)
  117. CS = CSR(KFLAG)
  118. DO 70 I=3,N
  119. ST = S2
  120. S2 = CK*S2 + S1
  121. S1 = ST
  122. C1 = S2*CS
  123. ST = C1
  124. C2 = Y(I)
  125. IF (KODE.EQ.1) GO TO 60
  126. IF (IUF.LT.0) GO TO 60
  127. CALL CS1S2(ZN, C1, C2, NW, ASCLE, ALIM, IUF)
  128. NZ = NZ + NW
  129. SC1 = SC2
  130. SC2 = C1
  131. IF (IUF.NE.3) GO TO 60
  132. IUF = -4
  133. S1 = SC1*CSS(KFLAG)
  134. S2 = SC2*CSS(KFLAG)
  135. ST = SC2
  136. 60 CONTINUE
  137. Y(I) = CSPN*C1 + CSGN*C2
  138. CK = CK + RZ
  139. CSPN = -CSPN
  140. IF (KFLAG.GE.3) GO TO 70
  141. C1R = REAL(C1)
  142. C1I = AIMAG(C1)
  143. C1R = ABS(C1R)
  144. C1I = ABS(C1I)
  145. C1M = MAX(C1R,C1I)
  146. IF (C1M.LE.BSCLE) GO TO 70
  147. KFLAG = KFLAG + 1
  148. BSCLE = BRY(KFLAG)
  149. S1 = S1*CS
  150. S2 = ST
  151. S1 = S1*CSS(KFLAG)
  152. S2 = S2*CSS(KFLAG)
  153. CS = CSR(KFLAG)
  154. 70 CONTINUE
  155. RETURN
  156. 80 CONTINUE
  157. NZ = -1
  158. IF(NW.EQ.(-2)) NZ=-2
  159. RETURN
  160. END