1 SUBROUTINE DLAQSB( UPLO, N, KD, AB, LDAB, S, SCOND, AMAX, EQUED )
2 *
3 * -- LAPACK auxiliary routine (version 3.3.1) --
4 * -- LAPACK is a software package provided by Univ. of Tennessee, --
5 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
6 * -- April 2011 --
7 *
8 * .. Scalar Arguments ..
9 CHARACTER EQUED, UPLO
10 INTEGER KD, LDAB, N
11 DOUBLE PRECISION AMAX, SCOND
12 * ..
13 * .. Array Arguments ..
14 DOUBLE PRECISION AB( LDAB, * ), S( * )
15 * ..
16 *
17 * Purpose
18 * =======
19 *
20 * DLAQSB equilibrates a symmetric band matrix A using the scaling
21 * factors in the vector S.
22 *
23 * Arguments
24 * =========
25 *
26 * UPLO (input) CHARACTER*1
27 * Specifies whether the upper or lower triangular part of the
28 * symmetric matrix A is stored.
29 * = 'U': Upper triangular
30 * = 'L': Lower triangular
31 *
32 * N (input) INTEGER
33 * The order of the matrix A. N >= 0.
34 *
35 * KD (input) INTEGER
36 * The number of super-diagonals of the matrix A if UPLO = 'U',
37 * or the number of sub-diagonals if UPLO = 'L'. KD >= 0.
38 *
39 * AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
40 * On entry, the upper or lower triangle of the symmetric band
41 * matrix A, stored in the first KD+1 rows of the array. The
42 * j-th column of A is stored in the j-th column of the array AB
43 * as follows:
44 * if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
45 * if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd).
46 *
47 * On exit, if INFO = 0, the triangular factor U or L from the
48 * Cholesky factorization A = U**T*U or A = L*L**T of the band
49 * matrix A, in the same storage format as A.
50 *
51 * LDAB (input) INTEGER
52 * The leading dimension of the array AB. LDAB >= KD+1.
53 *
54 * S (input) DOUBLE PRECISION array, dimension (N)
55 * The scale factors for A.
56 *
57 * SCOND (input) DOUBLE PRECISION
58 * Ratio of the smallest S(i) to the largest S(i).
59 *
60 * AMAX (input) DOUBLE PRECISION
61 * Absolute value of largest matrix entry.
62 *
63 * EQUED (output) CHARACTER*1
64 * Specifies whether or not equilibration was done.
65 * = 'N': No equilibration.
66 * = 'Y': Equilibration was done, i.e., A has been replaced by
67 * diag(S) * A * diag(S).
68 *
69 * Internal Parameters
70 * ===================
71 *
72 * THRESH is a threshold value used to decide if scaling should be done
73 * based on the ratio of the scaling factors. If SCOND < THRESH,
74 * scaling is done.
75 *
76 * LARGE and SMALL are threshold values used to decide if scaling should
77 * be done based on the absolute size of the largest matrix element.
78 * If AMAX > LARGE or AMAX < SMALL, scaling is done.
79 *
80 * =====================================================================
81 *
82 * .. Parameters ..
83 DOUBLE PRECISION ONE, THRESH
84 PARAMETER ( ONE = 1.0D+0, THRESH = 0.1D+0 )
85 * ..
86 * .. Local Scalars ..
87 INTEGER I, J
88 DOUBLE PRECISION CJ, LARGE, SMALL
89 * ..
90 * .. External Functions ..
91 LOGICAL LSAME
92 DOUBLE PRECISION DLAMCH
93 EXTERNAL LSAME, DLAMCH
94 * ..
95 * .. Intrinsic Functions ..
96 INTRINSIC MAX, MIN
97 * ..
98 * .. Executable Statements ..
99 *
100 * Quick return if possible
101 *
102 IF( N.LE.0 ) THEN
103 EQUED = 'N'
104 RETURN
105 END IF
106 *
107 * Initialize LARGE and SMALL.
108 *
109 SMALL = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
110 LARGE = ONE / SMALL
111 *
112 IF( SCOND.GE.THRESH .AND. AMAX.GE.SMALL .AND. AMAX.LE.LARGE ) THEN
113 *
114 * No equilibration
115 *
116 EQUED = 'N'
117 ELSE
118 *
119 * Replace A by diag(S) * A * diag(S).
120 *
121 IF( LSAME( UPLO, 'U' ) ) THEN
122 *
123 * Upper triangle of A is stored in band format.
124 *
125 DO 20 J = 1, N
126 CJ = S( J )
127 DO 10 I = MAX( 1, J-KD ), J
128 AB( KD+1+I-J, J ) = CJ*S( I )*AB( KD+1+I-J, J )
129 10 CONTINUE
130 20 CONTINUE
131 ELSE
132 *
133 * Lower triangle of A is stored.
134 *
135 DO 40 J = 1, N
136 CJ = S( J )
137 DO 30 I = J, MIN( N, J+KD )
138 AB( 1+I-J, J ) = CJ*S( I )*AB( 1+I-J, J )
139 30 CONTINUE
140 40 CONTINUE
141 END IF
142 EQUED = 'Y'
143 END IF
144 *
145 RETURN
146 *
147 * End of DLAQSB
148 *
149 END
2 *
3 * -- LAPACK auxiliary routine (version 3.3.1) --
4 * -- LAPACK is a software package provided by Univ. of Tennessee, --
5 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
6 * -- April 2011 --
7 *
8 * .. Scalar Arguments ..
9 CHARACTER EQUED, UPLO
10 INTEGER KD, LDAB, N
11 DOUBLE PRECISION AMAX, SCOND
12 * ..
13 * .. Array Arguments ..
14 DOUBLE PRECISION AB( LDAB, * ), S( * )
15 * ..
16 *
17 * Purpose
18 * =======
19 *
20 * DLAQSB equilibrates a symmetric band matrix A using the scaling
21 * factors in the vector S.
22 *
23 * Arguments
24 * =========
25 *
26 * UPLO (input) CHARACTER*1
27 * Specifies whether the upper or lower triangular part of the
28 * symmetric matrix A is stored.
29 * = 'U': Upper triangular
30 * = 'L': Lower triangular
31 *
32 * N (input) INTEGER
33 * The order of the matrix A. N >= 0.
34 *
35 * KD (input) INTEGER
36 * The number of super-diagonals of the matrix A if UPLO = 'U',
37 * or the number of sub-diagonals if UPLO = 'L'. KD >= 0.
38 *
39 * AB (input/output) DOUBLE PRECISION array, dimension (LDAB,N)
40 * On entry, the upper or lower triangle of the symmetric band
41 * matrix A, stored in the first KD+1 rows of the array. The
42 * j-th column of A is stored in the j-th column of the array AB
43 * as follows:
44 * if UPLO = 'U', AB(kd+1+i-j,j) = A(i,j) for max(1,j-kd)<=i<=j;
45 * if UPLO = 'L', AB(1+i-j,j) = A(i,j) for j<=i<=min(n,j+kd).
46 *
47 * On exit, if INFO = 0, the triangular factor U or L from the
48 * Cholesky factorization A = U**T*U or A = L*L**T of the band
49 * matrix A, in the same storage format as A.
50 *
51 * LDAB (input) INTEGER
52 * The leading dimension of the array AB. LDAB >= KD+1.
53 *
54 * S (input) DOUBLE PRECISION array, dimension (N)
55 * The scale factors for A.
56 *
57 * SCOND (input) DOUBLE PRECISION
58 * Ratio of the smallest S(i) to the largest S(i).
59 *
60 * AMAX (input) DOUBLE PRECISION
61 * Absolute value of largest matrix entry.
62 *
63 * EQUED (output) CHARACTER*1
64 * Specifies whether or not equilibration was done.
65 * = 'N': No equilibration.
66 * = 'Y': Equilibration was done, i.e., A has been replaced by
67 * diag(S) * A * diag(S).
68 *
69 * Internal Parameters
70 * ===================
71 *
72 * THRESH is a threshold value used to decide if scaling should be done
73 * based on the ratio of the scaling factors. If SCOND < THRESH,
74 * scaling is done.
75 *
76 * LARGE and SMALL are threshold values used to decide if scaling should
77 * be done based on the absolute size of the largest matrix element.
78 * If AMAX > LARGE or AMAX < SMALL, scaling is done.
79 *
80 * =====================================================================
81 *
82 * .. Parameters ..
83 DOUBLE PRECISION ONE, THRESH
84 PARAMETER ( ONE = 1.0D+0, THRESH = 0.1D+0 )
85 * ..
86 * .. Local Scalars ..
87 INTEGER I, J
88 DOUBLE PRECISION CJ, LARGE, SMALL
89 * ..
90 * .. External Functions ..
91 LOGICAL LSAME
92 DOUBLE PRECISION DLAMCH
93 EXTERNAL LSAME, DLAMCH
94 * ..
95 * .. Intrinsic Functions ..
96 INTRINSIC MAX, MIN
97 * ..
98 * .. Executable Statements ..
99 *
100 * Quick return if possible
101 *
102 IF( N.LE.0 ) THEN
103 EQUED = 'N'
104 RETURN
105 END IF
106 *
107 * Initialize LARGE and SMALL.
108 *
109 SMALL = DLAMCH( 'Safe minimum' ) / DLAMCH( 'Precision' )
110 LARGE = ONE / SMALL
111 *
112 IF( SCOND.GE.THRESH .AND. AMAX.GE.SMALL .AND. AMAX.LE.LARGE ) THEN
113 *
114 * No equilibration
115 *
116 EQUED = 'N'
117 ELSE
118 *
119 * Replace A by diag(S) * A * diag(S).
120 *
121 IF( LSAME( UPLO, 'U' ) ) THEN
122 *
123 * Upper triangle of A is stored in band format.
124 *
125 DO 20 J = 1, N
126 CJ = S( J )
127 DO 10 I = MAX( 1, J-KD ), J
128 AB( KD+1+I-J, J ) = CJ*S( I )*AB( KD+1+I-J, J )
129 10 CONTINUE
130 20 CONTINUE
131 ELSE
132 *
133 * Lower triangle of A is stored.
134 *
135 DO 40 J = 1, N
136 CJ = S( J )
137 DO 30 I = J, MIN( N, J+KD )
138 AB( 1+I-J, J ) = CJ*S( I )*AB( 1+I-J, J )
139 30 CONTINUE
140 40 CONTINUE
141 END IF
142 EQUED = 'Y'
143 END IF
144 *
145 RETURN
146 *
147 * End of DLAQSB
148 *
149 END