compb.f 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. *DECK COMPB
  2. SUBROUTINE COMPB (N, IERROR, AN, BN, CN, B, AH, BH)
  3. C***BEGIN PROLOGUE COMPB
  4. C***SUBSIDIARY
  5. C***PURPOSE Subsidiary to BLKTRI
  6. C***LIBRARY SLATEC
  7. C***TYPE SINGLE PRECISION (COMPB-S, CCMPB-C)
  8. C***AUTHOR (UNKNOWN)
  9. C***DESCRIPTION
  10. C
  11. C COMPB computes the roots of the B polynomials using subroutine
  12. C TEVLS which is a modification the EISPACK program TQLRAT.
  13. C IERROR is set to 4 if either TEVLS fails or if A(J+1)*C(J) is
  14. C less than zero for some J. AH,BH are temporary work arrays.
  15. C
  16. C***SEE ALSO BLKTRI
  17. C***ROUTINES CALLED INDXB, PPADD, R1MACH, TEVLS
  18. C***COMMON BLOCKS CBLKT
  19. C***REVISION HISTORY (YYMMDD)
  20. C 801001 DATE WRITTEN
  21. C 890531 Changed all specific intrinsics to generic. (WRB)
  22. C 891214 Prologue converted to Version 4.0 format. (BAB)
  23. C 900402 Added TYPE section. (WRB)
  24. C***END PROLOGUE COMPB
  25. C
  26. DIMENSION AN(*) ,BN(*) ,CN(*) ,B(*) ,
  27. 1 AH(*) ,BH(*)
  28. COMMON /CBLKT/ NPP ,K ,EPS ,CNV ,
  29. 1 NM ,NCMPLX ,IK
  30. C***FIRST EXECUTABLE STATEMENT COMPB
  31. EPS = R1MACH(4)
  32. BNORM = ABS(BN(1))
  33. DO 102 J=2,NM
  34. BNORM = MAX(BNORM,ABS(BN(J)))
  35. ARG = AN(J)*CN(J-1)
  36. IF (ARG) 119,101,101
  37. 101 B(J) = SIGN(SQRT(ARG),AN(J))
  38. 102 CONTINUE
  39. CNV = EPS*BNORM
  40. IF = 2**K
  41. KDO = K-1
  42. DO 108 L=1,KDO
  43. IR = L-1
  44. I2 = 2**IR
  45. I4 = I2+I2
  46. IPL = I4-1
  47. IFD = IF-I4
  48. DO 107 I=I4,IFD,I4
  49. CALL INDXB (I,L,IB,NB)
  50. IF (NB) 108,108,103
  51. 103 JS = I-IPL
  52. JF = JS+NB-1
  53. LS = 0
  54. DO 104 J=JS,JF
  55. LS = LS+1
  56. BH(LS) = BN(J)
  57. AH(LS) = B(J)
  58. 104 CONTINUE
  59. CALL TEVLS (NB,BH,AH,IERROR)
  60. IF (IERROR) 118,105,118
  61. 105 LH = IB-1
  62. DO 106 J=1,NB
  63. LH = LH+1
  64. B(LH) = -BH(J)
  65. 106 CONTINUE
  66. 107 CONTINUE
  67. 108 CONTINUE
  68. DO 109 J=1,NM
  69. B(J) = -BN(J)
  70. 109 CONTINUE
  71. IF (NPP) 117,110,117
  72. 110 NMP = NM+1
  73. NB = NM+NMP
  74. DO 112 J=1,NB
  75. L1 = MOD(J-1,NMP)+1
  76. L2 = MOD(J+NM-1,NMP)+1
  77. ARG = AN(L1)*CN(L2)
  78. IF (ARG) 119,111,111
  79. 111 BH(J) = SIGN(SQRT(ARG),-AN(L1))
  80. AH(J) = -BN(L1)
  81. 112 CONTINUE
  82. CALL TEVLS (NB,AH,BH,IERROR)
  83. IF (IERROR) 118,113,118
  84. 113 CALL INDXB (IF,K-1,J2,LH)
  85. CALL INDXB (IF/2,K-1,J1,LH)
  86. J2 = J2+1
  87. LH = J2
  88. N2M2 = J2+NM+NM-2
  89. 114 D1 = ABS(B(J1)-B(J2-1))
  90. D2 = ABS(B(J1)-B(J2))
  91. D3 = ABS(B(J1)-B(J2+1))
  92. IF ((D2 .LT. D1) .AND. (D2 .LT. D3)) GO TO 115
  93. B(LH) = B(J2)
  94. J2 = J2+1
  95. LH = LH+1
  96. IF (J2-N2M2) 114,114,116
  97. 115 J2 = J2+1
  98. J1 = J1+1
  99. IF (J2-N2M2) 114,114,116
  100. 116 B(LH) = B(N2M2+1)
  101. CALL INDXB (IF,K-1,J1,J2)
  102. J2 = J1+NMP+NMP
  103. CALL PPADD (NM+1,IERROR,AN,CN,B(J1),B(J1),B(J2))
  104. 117 RETURN
  105. 118 IERROR = 4
  106. RETURN
  107. 119 IERROR = 5
  108. RETURN
  109. END