1: *> \brief \b DGBEQUB
2: *
3: * =========== DOCUMENTATION ===========
4: *
5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
7: *
8: *> \htmlonly
9: *> Download DGBEQUB + dependencies
10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgbequb.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgbequb.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgbequb.f">
15: *> [TXT]</a>
16: *> \endhtmlonly
17: *
18: * Definition:
19: * ===========
20: *
21: * SUBROUTINE DGBEQUB( M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
22: * AMAX, INFO )
23: *
24: * .. Scalar Arguments ..
25: * INTEGER INFO, KL, KU, LDAB, M, N
26: * DOUBLE PRECISION AMAX, COLCND, ROWCND
27: * ..
28: * .. Array Arguments ..
29: * DOUBLE PRECISION AB( LDAB, * ), C( * ), R( * )
30: * ..
31: *
32: *
33: *> \par Purpose:
34: * =============
35: *>
36: *> \verbatim
37: *>
38: *> DGBEQUB computes row and column scalings intended to equilibrate an
39: *> M-by-N matrix A and reduce its condition number. R returns the row
40: *> scale factors and C the column scale factors, chosen to try to make
41: *> the largest element in each row and column of the matrix B with
42: *> elements B(i,j)=R(i)*A(i,j)*C(j) have an absolute value of at most
43: *> the radix.
44: *>
45: *> R(i) and C(j) are restricted to be a power of the radix between
46: *> SMLNUM = smallest safe number and BIGNUM = largest safe number. Use
47: *> of these scaling factors is not guaranteed to reduce the condition
48: *> number of A but works well in practice.
49: *>
50: *> This routine differs from DGEEQU by restricting the scaling factors
51: *> to a power of the radix. Baring over- and underflow, scaling by
52: *> these factors introduces no additional rounding errors. However, the
53: *> scaled entries' magnitured are no longer approximately 1 but lie
54: *> between sqrt(radix) and 1/sqrt(radix).
55: *> \endverbatim
56: *
57: * Arguments:
58: * ==========
59: *
60: *> \param[in] M
61: *> \verbatim
62: *> M is INTEGER
63: *> The number of rows of the matrix A. M >= 0.
64: *> \endverbatim
65: *>
66: *> \param[in] N
67: *> \verbatim
68: *> N is INTEGER
69: *> The number of columns of the matrix A. N >= 0.
70: *> \endverbatim
71: *>
72: *> \param[in] KL
73: *> \verbatim
74: *> KL is INTEGER
75: *> The number of subdiagonals within the band of A. KL >= 0.
76: *> \endverbatim
77: *>
78: *> \param[in] KU
79: *> \verbatim
80: *> KU is INTEGER
81: *> The number of superdiagonals within the band of A. KU >= 0.
82: *> \endverbatim
83: *>
84: *> \param[in] AB
85: *> \verbatim
86: *> AB is DOUBLE PRECISION array, dimension (LDAB,N)
87: *> On entry, the matrix A in band storage, in rows 1 to KL+KU+1.
88: *> The j-th column of A is stored in the j-th column of the
89: *> array AB as follows:
90: *> AB(KU+1+i-j,j) = A(i,j) for max(1,j-KU)<=i<=min(N,j+kl)
91: *> \endverbatim
92: *>
93: *> \param[in] LDAB
94: *> \verbatim
95: *> LDAB is INTEGER
96: *> The leading dimension of the array A. LDAB >= max(1,M).
97: *> \endverbatim
98: *>
99: *> \param[out] R
100: *> \verbatim
101: *> R is DOUBLE PRECISION array, dimension (M)
102: *> If INFO = 0 or INFO > M, R contains the row scale factors
103: *> for A.
104: *> \endverbatim
105: *>
106: *> \param[out] C
107: *> \verbatim
108: *> C is DOUBLE PRECISION array, dimension (N)
109: *> If INFO = 0, C contains the column scale factors for A.
110: *> \endverbatim
111: *>
112: *> \param[out] ROWCND
113: *> \verbatim
114: *> ROWCND is DOUBLE PRECISION
115: *> If INFO = 0 or INFO > M, ROWCND contains the ratio of the
116: *> smallest R(i) to the largest R(i). If ROWCND >= 0.1 and
117: *> AMAX is neither too large nor too small, it is not worth
118: *> scaling by R.
119: *> \endverbatim
120: *>
121: *> \param[out] COLCND
122: *> \verbatim
123: *> COLCND is DOUBLE PRECISION
124: *> If INFO = 0, COLCND contains the ratio of the smallest
125: *> C(i) to the largest C(i). If COLCND >= 0.1, it is not
126: *> worth scaling by C.
127: *> \endverbatim
128: *>
129: *> \param[out] AMAX
130: *> \verbatim
131: *> AMAX is DOUBLE PRECISION
132: *> Absolute value of largest matrix element. If AMAX is very
133: *> close to overflow or very close to underflow, the matrix
134: *> should be scaled.
135: *> \endverbatim
136: *>
137: *> \param[out] INFO
138: *> \verbatim
139: *> INFO is INTEGER
140: *> = 0: successful exit
141: *> < 0: if INFO = -i, the i-th argument had an illegal value
142: *> > 0: if INFO = i, and i is
143: *> <= M: the i-th row of A is exactly zero
144: *> > M: the (i-M)-th column of A is exactly zero
145: *> \endverbatim
146: *
147: * Authors:
148: * ========
149: *
150: *> \author Univ. of Tennessee
151: *> \author Univ. of California Berkeley
152: *> \author Univ. of Colorado Denver
153: *> \author NAG Ltd.
154: *
155: *> \date November 2011
156: *
157: *> \ingroup doubleGBcomputational
158: *
159: * =====================================================================
160: SUBROUTINE DGBEQUB( M, N, KL, KU, AB, LDAB, R, C, ROWCND, COLCND,
161: $ AMAX, INFO )
162: *
163: * -- LAPACK computational routine (version 3.4.0) --
164: * -- LAPACK is a software package provided by Univ. of Tennessee, --
165: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
166: * November 2011
167: *
168: * .. Scalar Arguments ..
169: INTEGER INFO, KL, KU, LDAB, M, N
170: DOUBLE PRECISION AMAX, COLCND, ROWCND
171: * ..
172: * .. Array Arguments ..
173: DOUBLE PRECISION AB( LDAB, * ), C( * ), R( * )
174: * ..
175: *
176: * =====================================================================
177: *
178: * .. Parameters ..
179: DOUBLE PRECISION ONE, ZERO
180: PARAMETER ( ONE = 1.0D+0, ZERO = 0.0D+0 )
181: * ..
182: * .. Local Scalars ..
183: INTEGER I, J, KD
184: DOUBLE PRECISION BIGNUM, RCMAX, RCMIN, SMLNUM, RADIX, LOGRDX
185: * ..
186: * .. External Functions ..
187: DOUBLE PRECISION DLAMCH
188: EXTERNAL DLAMCH
189: * ..
190: * .. External Subroutines ..
191: EXTERNAL XERBLA
192: * ..
193: * .. Intrinsic Functions ..
194: INTRINSIC ABS, MAX, MIN, LOG
195: * ..
196: * .. Executable Statements ..
197: *
198: * Test the input parameters.
199: *
200: INFO = 0
201: IF( M.LT.0 ) THEN
202: INFO = -1
203: ELSE IF( N.LT.0 ) THEN
204: INFO = -2
205: ELSE IF( KL.LT.0 ) THEN
206: INFO = -3
207: ELSE IF( KU.LT.0 ) THEN
208: INFO = -4
209: ELSE IF( LDAB.LT.KL+KU+1 ) THEN
210: INFO = -6
211: END IF
212: IF( INFO.NE.0 ) THEN
213: CALL XERBLA( 'DGBEQUB', -INFO )
214: RETURN
215: END IF
216: *
217: * Quick return if possible.
218: *
219: IF( M.EQ.0 .OR. N.EQ.0 ) THEN
220: ROWCND = ONE
221: COLCND = ONE
222: AMAX = ZERO
223: RETURN
224: END IF
225: *
226: * Get machine constants. Assume SMLNUM is a power of the radix.
227: *
228: SMLNUM = DLAMCH( 'S' )
229: BIGNUM = ONE / SMLNUM
230: RADIX = DLAMCH( 'B' )
231: LOGRDX = LOG(RADIX)
232: *
233: * Compute row scale factors.
234: *
235: DO 10 I = 1, M
236: R( I ) = ZERO
237: 10 CONTINUE
238: *
239: * Find the maximum element in each row.
240: *
241: KD = KU + 1
242: DO 30 J = 1, N
243: DO 20 I = MAX( J-KU, 1 ), MIN( J+KL, M )
244: R( I ) = MAX( R( I ), ABS( AB( KD+I-J, J ) ) )
245: 20 CONTINUE
246: 30 CONTINUE
247: DO I = 1, M
248: IF( R( I ).GT.ZERO ) THEN
249: R( I ) = RADIX**INT( LOG( R( I ) ) / LOGRDX )
250: END IF
251: END DO
252: *
253: * Find the maximum and minimum scale factors.
254: *
255: RCMIN = BIGNUM
256: RCMAX = ZERO
257: DO 40 I = 1, M
258: RCMAX = MAX( RCMAX, R( I ) )
259: RCMIN = MIN( RCMIN, R( I ) )
260: 40 CONTINUE
261: AMAX = RCMAX
262: *
263: IF( RCMIN.EQ.ZERO ) THEN
264: *
265: * Find the first zero scale factor and return an error code.
266: *
267: DO 50 I = 1, M
268: IF( R( I ).EQ.ZERO ) THEN
269: INFO = I
270: RETURN
271: END IF
272: 50 CONTINUE
273: ELSE
274: *
275: * Invert the scale factors.
276: *
277: DO 60 I = 1, M
278: R( I ) = ONE / MIN( MAX( R( I ), SMLNUM ), BIGNUM )
279: 60 CONTINUE
280: *
281: * Compute ROWCND = min(R(I)) / max(R(I)).
282: *
283: ROWCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
284: END IF
285: *
286: * Compute column scale factors.
287: *
288: DO 70 J = 1, N
289: C( J ) = ZERO
290: 70 CONTINUE
291: *
292: * Find the maximum element in each column,
293: * assuming the row scaling computed above.
294: *
295: DO 90 J = 1, N
296: DO 80 I = MAX( J-KU, 1 ), MIN( J+KL, M )
297: C( J ) = MAX( C( J ), ABS( AB( KD+I-J, J ) )*R( I ) )
298: 80 CONTINUE
299: IF( C( J ).GT.ZERO ) THEN
300: C( J ) = RADIX**INT( LOG( C( J ) ) / LOGRDX )
301: END IF
302: 90 CONTINUE
303: *
304: * Find the maximum and minimum scale factors.
305: *
306: RCMIN = BIGNUM
307: RCMAX = ZERO
308: DO 100 J = 1, N
309: RCMIN = MIN( RCMIN, C( J ) )
310: RCMAX = MAX( RCMAX, C( J ) )
311: 100 CONTINUE
312: *
313: IF( RCMIN.EQ.ZERO ) THEN
314: *
315: * Find the first zero scale factor and return an error code.
316: *
317: DO 110 J = 1, N
318: IF( C( J ).EQ.ZERO ) THEN
319: INFO = M + J
320: RETURN
321: END IF
322: 110 CONTINUE
323: ELSE
324: *
325: * Invert the scale factors.
326: *
327: DO 120 J = 1, N
328: C( J ) = ONE / MIN( MAX( C( J ), SMLNUM ), BIGNUM )
329: 120 CONTINUE
330: *
331: * Compute COLCND = min(C(J)) / max(C(J)).
332: *
333: COLCND = MAX( RCMIN, SMLNUM ) / MIN( RCMAX, BIGNUM )
334: END IF
335: *
336: RETURN
337: *
338: * End of DGBEQUB
339: *
340: END
CVSweb interface <joel.bertrand@systella.fr>