cbal.f 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. *DECK CBAL
  2. SUBROUTINE CBAL (NM, N, AR, AI, LOW, IGH, SCALE)
  3. C***BEGIN PROLOGUE CBAL
  4. C***PURPOSE Balance a complex general matrix and isolate eigenvalues
  5. C whenever possible.
  6. C***LIBRARY SLATEC (EISPACK)
  7. C***CATEGORY D4C1A
  8. C***TYPE COMPLEX (BALANC-S, CBAL-C)
  9. C***KEYWORDS EIGENVECTORS, EISPACK
  10. C***AUTHOR Smith, B. T., et al.
  11. C***DESCRIPTION
  12. C
  13. C This subroutine is a translation of the ALGOL procedure
  14. C CBALANCE, which is a complex version of BALANCE,
  15. C NUM. MATH. 13, 293-304(1969) by Parlett and Reinsch.
  16. C HANDBOOK FOR AUTO. COMP., VOL.II-LINEAR ALGEBRA, 315-326(1971).
  17. C
  18. C This subroutine balances a COMPLEX matrix and isolates
  19. C eigenvalues whenever possible.
  20. C
  21. C On INPUT
  22. C
  23. C NM must be set to the row dimension of the two-dimensional
  24. C array parameters, AR and AI, as declared in the calling
  25. C program dimension statement. NM is an INTEGER variable.
  26. C
  27. C N is the order of the matrix A=(AR,AI). N is an INTEGER
  28. C variable. N must be less than or equal to NM.
  29. C
  30. C AR and AI contain the real and imaginary parts,
  31. C respectively, of the complex matrix to be balanced.
  32. C AR and AI are two-dimensional REAL arrays, dimensioned
  33. C AR(NM,N) and AI(NM,N).
  34. C
  35. C On OUTPUT
  36. C
  37. C AR and AI contain the real and imaginary parts,
  38. C respectively, of the balanced matrix.
  39. C
  40. C LOW and IGH are two INTEGER variables such that AR(I,J)
  41. C and AI(I,J) are equal to zero if
  42. C (1) I is greater than J and
  43. C (2) J=1,...,LOW-1 or I=IGH+1,...,N.
  44. C
  45. C SCALE contains information determining the permutations and
  46. C scaling factors used. SCALE is a one-dimensional REAL array,
  47. C dimensioned SCALE(N).
  48. C
  49. C Suppose that the principal submatrix in rows LOW through IGH
  50. C has been balanced, that P(J) denotes the index interchanged
  51. C with J during the permutation step, and that the elements
  52. C of the diagonal matrix used are denoted by D(I,J). Then
  53. C SCALE(J) = P(J), for J = 1,...,LOW-1
  54. C = D(J,J) J = LOW,...,IGH
  55. C = P(J) J = IGH+1,...,N.
  56. C The order in which the interchanges are made is N to IGH+1,
  57. C then 1 to LOW-1.
  58. C
  59. C Note that 1 is returned for IGH if IGH is zero formally.
  60. C
  61. C The ALGOL procedure EXC contained in CBALANCE appears in
  62. C CBAL in line. (Note that the ALGOL roles of identifiers
  63. C K,L have been reversed.)
  64. C
  65. C Questions and comments should be directed to B. S. Garbow,
  66. C APPLIED MATHEMATICS DIVISION, ARGONNE NATIONAL LABORATORY
  67. C ------------------------------------------------------------------
  68. C
  69. C***REFERENCES B. T. Smith, J. M. Boyle, J. J. Dongarra, B. S. Garbow,
  70. C Y. Ikebe, V. C. Klema and C. B. Moler, Matrix Eigen-
  71. C system Routines - EISPACK Guide, Springer-Verlag,
  72. C 1976.
  73. C***ROUTINES CALLED (NONE)
  74. C***REVISION HISTORY (YYMMDD)
  75. C 760101 DATE WRITTEN
  76. C 890831 Modified array declarations. (WRB)
  77. C 890831 REVISION DATE from Version 3.2
  78. C 891214 Prologue converted to Version 4.0 format. (BAB)
  79. C 920501 Reformatted the REFERENCES section. (WRB)
  80. C***END PROLOGUE CBAL
  81. C
  82. INTEGER I,J,K,L,M,N,JJ,NM,IGH,LOW,IEXC
  83. REAL AR(NM,*),AI(NM,*),SCALE(*)
  84. REAL C,F,G,R,S,B2,RADIX
  85. LOGICAL NOCONV
  86. C
  87. C THE FOLLOWING PORTABLE VALUE OF RADIX WORKS WELL ENOUGH
  88. C FOR ALL MACHINES WHOSE BASE IS A POWER OF TWO.
  89. C
  90. C***FIRST EXECUTABLE STATEMENT CBAL
  91. RADIX = 16
  92. C
  93. B2 = RADIX * RADIX
  94. K = 1
  95. L = N
  96. GO TO 100
  97. C .......... IN-LINE PROCEDURE FOR ROW AND
  98. C COLUMN EXCHANGE ..........
  99. 20 SCALE(M) = J
  100. IF (J .EQ. M) GO TO 50
  101. C
  102. DO 30 I = 1, L
  103. F = AR(I,J)
  104. AR(I,J) = AR(I,M)
  105. AR(I,M) = F
  106. F = AI(I,J)
  107. AI(I,J) = AI(I,M)
  108. AI(I,M) = F
  109. 30 CONTINUE
  110. C
  111. DO 40 I = K, N
  112. F = AR(J,I)
  113. AR(J,I) = AR(M,I)
  114. AR(M,I) = F
  115. F = AI(J,I)
  116. AI(J,I) = AI(M,I)
  117. AI(M,I) = F
  118. 40 CONTINUE
  119. C
  120. 50 GO TO (80,130), IEXC
  121. C .......... SEARCH FOR ROWS ISOLATING AN EIGENVALUE
  122. C AND PUSH THEM DOWN ..........
  123. 80 IF (L .EQ. 1) GO TO 280
  124. L = L - 1
  125. C .......... FOR J=L STEP -1 UNTIL 1 DO -- ..........
  126. 100 DO 120 JJ = 1, L
  127. J = L + 1 - JJ
  128. C
  129. DO 110 I = 1, L
  130. IF (I .EQ. J) GO TO 110
  131. IF (AR(J,I) .NE. 0.0E0 .OR. AI(J,I) .NE. 0.0E0) GO TO 120
  132. 110 CONTINUE
  133. C
  134. M = L
  135. IEXC = 1
  136. GO TO 20
  137. 120 CONTINUE
  138. C
  139. GO TO 140
  140. C .......... SEARCH FOR COLUMNS ISOLATING AN EIGENVALUE
  141. C AND PUSH THEM LEFT ..........
  142. 130 K = K + 1
  143. C
  144. 140 DO 170 J = K, L
  145. C
  146. DO 150 I = K, L
  147. IF (I .EQ. J) GO TO 150
  148. IF (AR(I,J) .NE. 0.0E0 .OR. AI(I,J) .NE. 0.0E0) GO TO 170
  149. 150 CONTINUE
  150. C
  151. M = K
  152. IEXC = 2
  153. GO TO 20
  154. 170 CONTINUE
  155. C .......... NOW BALANCE THE SUBMATRIX IN ROWS K TO L ..........
  156. DO 180 I = K, L
  157. 180 SCALE(I) = 1.0E0
  158. C .......... ITERATIVE LOOP FOR NORM REDUCTION ..........
  159. 190 NOCONV = .FALSE.
  160. C
  161. DO 270 I = K, L
  162. C = 0.0E0
  163. R = 0.0E0
  164. C
  165. DO 200 J = K, L
  166. IF (J .EQ. I) GO TO 200
  167. C = C + ABS(AR(J,I)) + ABS(AI(J,I))
  168. R = R + ABS(AR(I,J)) + ABS(AI(I,J))
  169. 200 CONTINUE
  170. C .......... GUARD AGAINST ZERO C OR R DUE TO UNDERFLOW ..........
  171. IF (C .EQ. 0.0E0 .OR. R .EQ. 0.0E0) GO TO 270
  172. G = R / RADIX
  173. F = 1.0E0
  174. S = C + R
  175. 210 IF (C .GE. G) GO TO 220
  176. F = F * RADIX
  177. C = C * B2
  178. GO TO 210
  179. 220 G = R * RADIX
  180. 230 IF (C .LT. G) GO TO 240
  181. F = F / RADIX
  182. C = C / B2
  183. GO TO 230
  184. C .......... NOW BALANCE ..........
  185. 240 IF ((C + R) / F .GE. 0.95E0 * S) GO TO 270
  186. G = 1.0E0 / F
  187. SCALE(I) = SCALE(I) * F
  188. NOCONV = .TRUE.
  189. C
  190. DO 250 J = K, N
  191. AR(I,J) = AR(I,J) * G
  192. AI(I,J) = AI(I,J) * G
  193. 250 CONTINUE
  194. C
  195. DO 260 J = 1, L
  196. AR(J,I) = AR(J,I) * F
  197. AI(J,I) = AI(J,I) * F
  198. 260 CONTINUE
  199. C
  200. 270 CONTINUE
  201. C
  202. IF (NOCONV) GO TO 190
  203. C
  204. 280 LOW = K
  205. IGH = L
  206. RETURN
  207. END