ckscl.f 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. *DECK CKSCL
  2. SUBROUTINE CKSCL (ZR, FNU, N, Y, NZ, RZ, ASCLE, TOL, ELIM)
  3. C***BEGIN PROLOGUE CKSCL
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to CBKNU, CUNK1 and CUNK2
  6. C***LIBRARY SLATEC
  7. C***TYPE ALL (CKSCL-A, ZKSCL-A)
  8. C***AUTHOR Amos, D. E., (SNL)
  9. C***DESCRIPTION
  10. C
  11. C SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
  12. C ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
  13. C RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
  14. C
  15. C***SEE ALSO CBKNU, CUNK1, CUNK2
  16. C***ROUTINES CALLED CUCHK
  17. C***REVISION HISTORY (YYMMDD)
  18. C ?????? DATE WRITTEN
  19. C 910415 Prologue converted to Version 4.0 format. (BAB)
  20. C***END PROLOGUE CKSCL
  21. COMPLEX CK, CS, CY, CZERO, RZ, S1, S2, Y, ZR, ZD, CELM
  22. REAL AA, ASCLE, ACS, AS, CSI, CSR, ELIM, FN, FNU, TOL, XX, ZRI,
  23. * ELM, ALAS, HELIM
  24. INTEGER I, IC, K, KK, N, NN, NW, NZ
  25. DIMENSION Y(N), CY(2)
  26. DATA CZERO / (0.0E0,0.0E0) /
  27. C***FIRST EXECUTABLE STATEMENT CUCHK
  28. NZ = 0
  29. IC = 0
  30. XX = REAL(ZR)
  31. NN = MIN(2,N)
  32. DO 10 I=1,NN
  33. S1 = Y(I)
  34. CY(I) = S1
  35. AS = ABS(S1)
  36. ACS = -XX + ALOG(AS)
  37. NZ = NZ + 1
  38. Y(I) = CZERO
  39. IF (ACS.LT.(-ELIM)) GO TO 10
  40. CS = -ZR + CLOG(S1)
  41. CSR = REAL(CS)
  42. CSI = AIMAG(CS)
  43. AA = EXP(CSR)/TOL
  44. CS = CMPLX(AA,0.0E0)*CMPLX(COS(CSI),SIN(CSI))
  45. CALL CUCHK(CS, NW, ASCLE, TOL)
  46. IF (NW.NE.0) GO TO 10
  47. Y(I) = CS
  48. NZ = NZ - 1
  49. IC = I
  50. 10 CONTINUE
  51. IF (N.EQ.1) RETURN
  52. IF (IC.GT.1) GO TO 20
  53. Y(1) = CZERO
  54. NZ = 2
  55. 20 CONTINUE
  56. IF (N.EQ.2) RETURN
  57. IF (NZ.EQ.0) RETURN
  58. FN = FNU + 1.0E0
  59. CK = CMPLX(FN,0.0E0)*RZ
  60. S1 = CY(1)
  61. S2 = CY(2)
  62. HELIM = 0.5E0*ELIM
  63. ELM = EXP(-ELIM)
  64. CELM = CMPLX(ELM,0.0E0)
  65. ZRI =AIMAG(ZR)
  66. ZD = ZR
  67. C
  68. C FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
  69. C S2 GETS LARGER THAN EXP(ELIM/2)
  70. C
  71. DO 30 I=3,N
  72. KK = I
  73. CS = S2
  74. S2 = CK*S2 + S1
  75. S1 = CS
  76. CK = CK + RZ
  77. AS = ABS(S2)
  78. ALAS = ALOG(AS)
  79. ACS = -XX + ALAS
  80. NZ = NZ + 1
  81. Y(I) = CZERO
  82. IF (ACS.LT.(-ELIM)) GO TO 25
  83. CS = -ZD + CLOG(S2)
  84. CSR = REAL(CS)
  85. CSI = AIMAG(CS)
  86. AA = EXP(CSR)/TOL
  87. CS = CMPLX(AA,0.0E0)*CMPLX(COS(CSI),SIN(CSI))
  88. CALL CUCHK(CS, NW, ASCLE, TOL)
  89. IF (NW.NE.0) GO TO 25
  90. Y(I) = CS
  91. NZ = NZ - 1
  92. IF (IC.EQ.(KK-1)) GO TO 40
  93. IC = KK
  94. GO TO 30
  95. 25 CONTINUE
  96. IF(ALAS.LT.HELIM) GO TO 30
  97. XX = XX-ELIM
  98. S1 = S1*CELM
  99. S2 = S2*CELM
  100. ZD = CMPLX(XX,ZRI)
  101. 30 CONTINUE
  102. NZ = N
  103. IF(IC.EQ.N) NZ=N-1
  104. GO TO 45
  105. 40 CONTINUE
  106. NZ = KK - 2
  107. 45 CONTINUE
  108. DO 50 K=1,NZ
  109. Y(K) = CZERO
  110. 50 CONTINUE
  111. RETURN
  112. END