Annotation of rpl/lapack/lapack/dgebal.f, revision 1.1.1.1
1.1 bertrand 1: SUBROUTINE DGEBAL( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
2: *
3: * -- LAPACK routine (version 3.2) --
4: * -- LAPACK is a software package provided by Univ. of Tennessee, --
5: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
6: * November 2006
7: *
8: * .. Scalar Arguments ..
9: CHARACTER JOB
10: INTEGER IHI, ILO, INFO, LDA, N
11: * ..
12: * .. Array Arguments ..
13: DOUBLE PRECISION A( LDA, * ), SCALE( * )
14: * ..
15: *
16: * Purpose
17: * =======
18: *
19: * DGEBAL balances a general real matrix A. This involves, first,
20: * permuting A by a similarity transformation to isolate eigenvalues
21: * in the first 1 to ILO-1 and last IHI+1 to N elements on the
22: * diagonal; and second, applying a diagonal similarity transformation
23: * to rows and columns ILO to IHI to make the rows and columns as
24: * close in norm as possible. Both steps are optional.
25: *
26: * Balancing may reduce the 1-norm of the matrix, and improve the
27: * accuracy of the computed eigenvalues and/or eigenvectors.
28: *
29: * Arguments
30: * =========
31: *
32: * JOB (input) CHARACTER*1
33: * Specifies the operations to be performed on A:
34: * = 'N': none: simply set ILO = 1, IHI = N, SCALE(I) = 1.0
35: * for i = 1,...,N;
36: * = 'P': permute only;
37: * = 'S': scale only;
38: * = 'B': both permute and scale.
39: *
40: * N (input) INTEGER
41: * The order of the matrix A. N >= 0.
42: *
43: * A (input/output) DOUBLE PRECISION array, dimension (LDA,N)
44: * On entry, the input matrix A.
45: * On exit, A is overwritten by the balanced matrix.
46: * If JOB = 'N', A is not referenced.
47: * See Further Details.
48: *
49: * LDA (input) INTEGER
50: * The leading dimension of the array A. LDA >= max(1,N).
51: *
52: * ILO (output) INTEGER
53: * IHI (output) INTEGER
54: * ILO and IHI are set to integers such that on exit
55: * A(i,j) = 0 if i > j and j = 1,...,ILO-1 or I = IHI+1,...,N.
56: * If JOB = 'N' or 'S', ILO = 1 and IHI = N.
57: *
58: * SCALE (output) DOUBLE PRECISION array, dimension (N)
59: * Details of the permutations and scaling factors applied to
60: * A. If P(j) is the index of the row and column interchanged
61: * with row and column j and D(j) is the scaling factor
62: * applied to row and column j, then
63: * SCALE(j) = P(j) for j = 1,...,ILO-1
64: * = D(j) for j = ILO,...,IHI
65: * = P(j) for j = IHI+1,...,N.
66: * The order in which the interchanges are made is N to IHI+1,
67: * then 1 to ILO-1.
68: *
69: * INFO (output) INTEGER
70: * = 0: successful exit.
71: * < 0: if INFO = -i, the i-th argument had an illegal value.
72: *
73: * Further Details
74: * ===============
75: *
76: * The permutations consist of row and column interchanges which put
77: * the matrix in the form
78: *
79: * ( T1 X Y )
80: * P A P = ( 0 B Z )
81: * ( 0 0 T2 )
82: *
83: * where T1 and T2 are upper triangular matrices whose eigenvalues lie
84: * along the diagonal. The column indices ILO and IHI mark the starting
85: * and ending columns of the submatrix B. Balancing consists of applying
86: * a diagonal similarity transformation inv(D) * B * D to make the
87: * 1-norms of each row of B and its corresponding column nearly equal.
88: * The output matrix is
89: *
90: * ( T1 X*D Y )
91: * ( 0 inv(D)*B*D inv(D)*Z ).
92: * ( 0 0 T2 )
93: *
94: * Information about the permutations P and the diagonal matrix D is
95: * returned in the vector SCALE.
96: *
97: * This subroutine is based on the EISPACK routine BALANC.
98: *
99: * Modified by Tzu-Yi Chen, Computer Science Division, University of
100: * California at Berkeley, USA
101: *
102: * =====================================================================
103: *
104: * .. Parameters ..
105: DOUBLE PRECISION ZERO, ONE
106: PARAMETER ( ZERO = 0.0D+0, ONE = 1.0D+0 )
107: DOUBLE PRECISION SCLFAC
108: PARAMETER ( SCLFAC = 2.0D+0 )
109: DOUBLE PRECISION FACTOR
110: PARAMETER ( FACTOR = 0.95D+0 )
111: * ..
112: * .. Local Scalars ..
113: LOGICAL NOCONV
114: INTEGER I, ICA, IEXC, IRA, J, K, L, M
115: DOUBLE PRECISION C, CA, F, G, R, RA, S, SFMAX1, SFMAX2, SFMIN1,
116: $ SFMIN2
117: * ..
118: * .. External Functions ..
119: LOGICAL LSAME
120: INTEGER IDAMAX
121: DOUBLE PRECISION DLAMCH
122: EXTERNAL LSAME, IDAMAX, DLAMCH
123: * ..
124: * .. External Subroutines ..
125: EXTERNAL DSCAL, DSWAP, XERBLA
126: * ..
127: * .. Intrinsic Functions ..
128: INTRINSIC ABS, MAX, MIN
129: * ..
130: * .. Executable Statements ..
131: *
132: * Test the input parameters
133: *
134: INFO = 0
135: IF( .NOT.LSAME( JOB, 'N' ) .AND. .NOT.LSAME( JOB, 'P' ) .AND.
136: $ .NOT.LSAME( JOB, 'S' ) .AND. .NOT.LSAME( JOB, 'B' ) ) THEN
137: INFO = -1
138: ELSE IF( N.LT.0 ) THEN
139: INFO = -2
140: ELSE IF( LDA.LT.MAX( 1, N ) ) THEN
141: INFO = -4
142: END IF
143: IF( INFO.NE.0 ) THEN
144: CALL XERBLA( 'DGEBAL', -INFO )
145: RETURN
146: END IF
147: *
148: K = 1
149: L = N
150: *
151: IF( N.EQ.0 )
152: $ GO TO 210
153: *
154: IF( LSAME( JOB, 'N' ) ) THEN
155: DO 10 I = 1, N
156: SCALE( I ) = ONE
157: 10 CONTINUE
158: GO TO 210
159: END IF
160: *
161: IF( LSAME( JOB, 'S' ) )
162: $ GO TO 120
163: *
164: * Permutation to isolate eigenvalues if possible
165: *
166: GO TO 50
167: *
168: * Row and column exchange.
169: *
170: 20 CONTINUE
171: SCALE( M ) = J
172: IF( J.EQ.M )
173: $ GO TO 30
174: *
175: CALL DSWAP( L, A( 1, J ), 1, A( 1, M ), 1 )
176: CALL DSWAP( N-K+1, A( J, K ), LDA, A( M, K ), LDA )
177: *
178: 30 CONTINUE
179: GO TO ( 40, 80 )IEXC
180: *
181: * Search for rows isolating an eigenvalue and push them down.
182: *
183: 40 CONTINUE
184: IF( L.EQ.1 )
185: $ GO TO 210
186: L = L - 1
187: *
188: 50 CONTINUE
189: DO 70 J = L, 1, -1
190: *
191: DO 60 I = 1, L
192: IF( I.EQ.J )
193: $ GO TO 60
194: IF( A( J, I ).NE.ZERO )
195: $ GO TO 70
196: 60 CONTINUE
197: *
198: M = L
199: IEXC = 1
200: GO TO 20
201: 70 CONTINUE
202: *
203: GO TO 90
204: *
205: * Search for columns isolating an eigenvalue and push them left.
206: *
207: 80 CONTINUE
208: K = K + 1
209: *
210: 90 CONTINUE
211: DO 110 J = K, L
212: *
213: DO 100 I = K, L
214: IF( I.EQ.J )
215: $ GO TO 100
216: IF( A( I, J ).NE.ZERO )
217: $ GO TO 110
218: 100 CONTINUE
219: *
220: M = K
221: IEXC = 2
222: GO TO 20
223: 110 CONTINUE
224: *
225: 120 CONTINUE
226: DO 130 I = K, L
227: SCALE( I ) = ONE
228: 130 CONTINUE
229: *
230: IF( LSAME( JOB, 'P' ) )
231: $ GO TO 210
232: *
233: * Balance the submatrix in rows K to L.
234: *
235: * Iterative loop for norm reduction
236: *
237: SFMIN1 = DLAMCH( 'S' ) / DLAMCH( 'P' )
238: SFMAX1 = ONE / SFMIN1
239: SFMIN2 = SFMIN1*SCLFAC
240: SFMAX2 = ONE / SFMIN2
241: 140 CONTINUE
242: NOCONV = .FALSE.
243: *
244: DO 200 I = K, L
245: C = ZERO
246: R = ZERO
247: *
248: DO 150 J = K, L
249: IF( J.EQ.I )
250: $ GO TO 150
251: C = C + ABS( A( J, I ) )
252: R = R + ABS( A( I, J ) )
253: 150 CONTINUE
254: ICA = IDAMAX( L, A( 1, I ), 1 )
255: CA = ABS( A( ICA, I ) )
256: IRA = IDAMAX( N-K+1, A( I, K ), LDA )
257: RA = ABS( A( I, IRA+K-1 ) )
258: *
259: * Guard against zero C or R due to underflow.
260: *
261: IF( C.EQ.ZERO .OR. R.EQ.ZERO )
262: $ GO TO 200
263: G = R / SCLFAC
264: F = ONE
265: S = C + R
266: 160 CONTINUE
267: IF( C.GE.G .OR. MAX( F, C, CA ).GE.SFMAX2 .OR.
268: $ MIN( R, G, RA ).LE.SFMIN2 )GO TO 170
269: F = F*SCLFAC
270: C = C*SCLFAC
271: CA = CA*SCLFAC
272: R = R / SCLFAC
273: G = G / SCLFAC
274: RA = RA / SCLFAC
275: GO TO 160
276: *
277: 170 CONTINUE
278: G = C / SCLFAC
279: 180 CONTINUE
280: IF( G.LT.R .OR. MAX( R, RA ).GE.SFMAX2 .OR.
281: $ MIN( F, C, G, CA ).LE.SFMIN2 )GO TO 190
282: F = F / SCLFAC
283: C = C / SCLFAC
284: G = G / SCLFAC
285: CA = CA / SCLFAC
286: R = R*SCLFAC
287: RA = RA*SCLFAC
288: GO TO 180
289: *
290: * Now balance.
291: *
292: 190 CONTINUE
293: IF( ( C+R ).GE.FACTOR*S )
294: $ GO TO 200
295: IF( F.LT.ONE .AND. SCALE( I ).LT.ONE ) THEN
296: IF( F*SCALE( I ).LE.SFMIN1 )
297: $ GO TO 200
298: END IF
299: IF( F.GT.ONE .AND. SCALE( I ).GT.ONE ) THEN
300: IF( SCALE( I ).GE.SFMAX1 / F )
301: $ GO TO 200
302: END IF
303: G = ONE / F
304: SCALE( I ) = SCALE( I )*F
305: NOCONV = .TRUE.
306: *
307: CALL DSCAL( N-K+1, G, A( I, K ), LDA )
308: CALL DSCAL( L, F, A( 1, I ), 1 )
309: *
310: 200 CONTINUE
311: *
312: IF( NOCONV )
313: $ GO TO 140
314: *
315: 210 CONTINUE
316: ILO = K
317: IHI = L
318: *
319: RETURN
320: *
321: * End of DGEBAL
322: *
323: END
CVSweb interface <joel.bertrand@systella.fr>