Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ElmerCSC
GitHub Repository: ElmerCSC/elmerfem
Path: blob/devel/mathlibs/src/lapack/cgbcon.f
5195 views
1
SUBROUTINE CGBCON( NORM, N, KL, KU, AB, LDAB, IPIV, ANORM, RCOND,
2
$ WORK, RWORK, INFO )
3
*
4
* -- LAPACK routine (version 3.0) --
5
* Univ. of Tennessee, Univ. of California Berkeley, NAG Ltd.,
6
* Courant Institute, Argonne National Lab, and Rice University
7
* September 30, 1994
8
*
9
* .. Scalar Arguments ..
10
CHARACTER NORM
11
INTEGER INFO, KL, KU, LDAB, N
12
REAL ANORM, RCOND
13
* ..
14
* .. Array Arguments ..
15
INTEGER IPIV( * )
16
REAL RWORK( * )
17
COMPLEX AB( LDAB, * ), WORK( * )
18
* ..
19
*
20
* Purpose
21
* =======
22
*
23
* CGBCON estimates the reciprocal of the condition number of a complex
24
* general band matrix A, in either the 1-norm or the infinity-norm,
25
* using the LU factorization computed by CGBTRF.
26
*
27
* An estimate is obtained for norm(inv(A)), and the reciprocal of the
28
* condition number is computed as
29
* RCOND = 1 / ( norm(A) * norm(inv(A)) ).
30
*
31
* Arguments
32
* =========
33
*
34
* NORM (input) CHARACTER*1
35
* Specifies whether the 1-norm condition number or the
36
* infinity-norm condition number is required:
37
* = '1' or 'O': 1-norm;
38
* = 'I': Infinity-norm.
39
*
40
* N (input) INTEGER
41
* The order of the matrix A. N >= 0.
42
*
43
* KL (input) INTEGER
44
* The number of subdiagonals within the band of A. KL >= 0.
45
*
46
* KU (input) INTEGER
47
* The number of superdiagonals within the band of A. KU >= 0.
48
*
49
* AB (input) COMPLEX array, dimension (LDAB,N)
50
* Details of the LU factorization of the band matrix A, as
51
* computed by CGBTRF. U is stored as an upper triangular band
52
* matrix with KL+KU superdiagonals in rows 1 to KL+KU+1, and
53
* the multipliers used during the factorization are stored in
54
* rows KL+KU+2 to 2*KL+KU+1.
55
*
56
* LDAB (input) INTEGER
57
* The leading dimension of the array AB. LDAB >= 2*KL+KU+1.
58
*
59
* IPIV (input) INTEGER array, dimension (N)
60
* The pivot indices; for 1 <= i <= N, row i of the matrix was
61
* interchanged with row IPIV(i).
62
*
63
* ANORM (input) REAL
64
* If NORM = '1' or 'O', the 1-norm of the original matrix A.
65
* If NORM = 'I', the infinity-norm of the original matrix A.
66
*
67
* RCOND (output) REAL
68
* The reciprocal of the condition number of the matrix A,
69
* computed as RCOND = 1/(norm(A) * norm(inv(A))).
70
*
71
* WORK (workspace) COMPLEX array, dimension (2*N)
72
*
73
* RWORK (workspace) REAL array, dimension (N)
74
*
75
* INFO (output) INTEGER
76
* = 0: successful exit
77
* < 0: if INFO = -i, the i-th argument had an illegal value
78
*
79
* =====================================================================
80
*
81
* .. Parameters ..
82
REAL ONE, ZERO
83
PARAMETER ( ONE = 1.0E+0, ZERO = 0.0E+0 )
84
* ..
85
* .. Local Scalars ..
86
LOGICAL LNOTI, ONENRM
87
CHARACTER NORMIN
88
INTEGER IX, J, JP, KASE, KASE1, KD, LM
89
REAL AINVNM, SCALE, SMLNUM
90
COMPLEX T, ZDUM
91
* ..
92
* .. External Functions ..
93
LOGICAL LSAME
94
INTEGER ICAMAX
95
REAL SLAMCH
96
COMPLEX CDOTC
97
EXTERNAL LSAME, ICAMAX, SLAMCH, CDOTC
98
* ..
99
* .. External Subroutines ..
100
EXTERNAL CAXPY, CLACON, CLATBS, CSRSCL, XERBLA
101
* ..
102
* .. Intrinsic Functions ..
103
INTRINSIC ABS, AIMAG, MIN, REAL
104
* ..
105
* .. Statement Functions ..
106
REAL CABS1
107
* ..
108
* .. Statement Function definitions ..
109
CABS1( ZDUM ) = ABS( REAL( ZDUM ) ) + ABS( AIMAG( ZDUM ) )
110
* ..
111
* .. Executable Statements ..
112
*
113
* Test the input parameters.
114
*
115
INFO = 0
116
ONENRM = NORM.EQ.'1' .OR. LSAME( NORM, 'O' )
117
IF( .NOT.ONENRM .AND. .NOT.LSAME( NORM, 'I' ) ) THEN
118
INFO = -1
119
ELSE IF( N.LT.0 ) THEN
120
INFO = -2
121
ELSE IF( KL.LT.0 ) THEN
122
INFO = -3
123
ELSE IF( KU.LT.0 ) THEN
124
INFO = -4
125
ELSE IF( LDAB.LT.2*KL+KU+1 ) THEN
126
INFO = -6
127
ELSE IF( ANORM.LT.ZERO ) THEN
128
INFO = -8
129
END IF
130
IF( INFO.NE.0 ) THEN
131
CALL XERBLA( 'CGBCON', -INFO )
132
RETURN
133
END IF
134
*
135
* Quick return if possible
136
*
137
RCOND = ZERO
138
IF( N.EQ.0 ) THEN
139
RCOND = ONE
140
RETURN
141
ELSE IF( ANORM.EQ.ZERO ) THEN
142
RETURN
143
END IF
144
*
145
SMLNUM = SLAMCH( 'Safe minimum' )
146
*
147
* Estimate the norm of inv(A).
148
*
149
AINVNM = ZERO
150
NORMIN = 'N'
151
IF( ONENRM ) THEN
152
KASE1 = 1
153
ELSE
154
KASE1 = 2
155
END IF
156
KD = KL + KU + 1
157
LNOTI = KL.GT.0
158
KASE = 0
159
10 CONTINUE
160
CALL CLACON( N, WORK( N+1 ), WORK, AINVNM, KASE )
161
IF( KASE.NE.0 ) THEN
162
IF( KASE.EQ.KASE1 ) THEN
163
*
164
* Multiply by inv(L).
165
*
166
IF( LNOTI ) THEN
167
DO 20 J = 1, N - 1
168
LM = MIN( KL, N-J )
169
JP = IPIV( J )
170
T = WORK( JP )
171
IF( JP.NE.J ) THEN
172
WORK( JP ) = WORK( J )
173
WORK( J ) = T
174
END IF
175
CALL CAXPY( LM, -T, AB( KD+1, J ), 1, WORK( J+1 ), 1 )
176
20 CONTINUE
177
END IF
178
*
179
* Multiply by inv(U).
180
*
181
CALL CLATBS( 'Upper', 'No transpose', 'Non-unit', NORMIN, N,
182
$ KL+KU, AB, LDAB, WORK, SCALE, RWORK, INFO )
183
ELSE
184
*
185
* Multiply by inv(U').
186
*
187
CALL CLATBS( 'Upper', 'Conjugate transpose', 'Non-unit',
188
$ NORMIN, N, KL+KU, AB, LDAB, WORK, SCALE, RWORK,
189
$ INFO )
190
*
191
* Multiply by inv(L').
192
*
193
IF( LNOTI ) THEN
194
DO 30 J = N - 1, 1, -1
195
LM = MIN( KL, N-J )
196
WORK( J ) = WORK( J ) - CDOTC( LM, AB( KD+1, J ), 1,
197
$ WORK( J+1 ), 1 )
198
JP = IPIV( J )
199
IF( JP.NE.J ) THEN
200
T = WORK( JP )
201
WORK( JP ) = WORK( J )
202
WORK( J ) = T
203
END IF
204
30 CONTINUE
205
END IF
206
END IF
207
*
208
* Divide X by 1/SCALE if doing so will not cause overflow.
209
*
210
NORMIN = 'Y'
211
IF( SCALE.NE.ONE ) THEN
212
IX = ICAMAX( N, WORK, 1 )
213
IF( SCALE.LT.CABS1( WORK( IX ) )*SMLNUM .OR. SCALE.EQ.ZERO )
214
$ GO TO 40
215
CALL CSRSCL( N, SCALE, WORK, 1 )
216
END IF
217
GO TO 10
218
END IF
219
*
220
* Compute the estimate of the reciprocal condition number.
221
*
222
IF( AINVNM.NE.ZERO )
223
$ RCOND = ( ONE / AINVNM ) / ANORM
224
*
225
40 CONTINUE
226
RETURN
227
*
228
* End of CGBCON
229
*
230
END
231
232