balanc.f 5.5 KB

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