131
132
133
134
135
136 IMPLICIT NONE
137
138
139 CHARACTER UPLO
140 INTEGER N, NRHS, LDA, LDB, LWORK, INFO
141
142
143 INTEGER IPIV( * )
144 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
145
146
147
148
149 COMPLEX ONE
150 parameter( one = 1.0e+0 )
151
152
153 LOGICAL LQUERY, UPPER
154 INTEGER K, KP, LWKOPT
155
156
157 LOGICAL LSAME
159
160
162
163
164 INTRINSIC max
165
166
167
168 info = 0
169 upper =
lsame( uplo,
'U' )
170 lquery = ( lwork.EQ.-1 )
171 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
172 info = -1
173 ELSE IF( n.LT.0 ) THEN
174 info = -2
175 ELSE IF( nrhs.LT.0 ) THEN
176 info = -3
177 ELSE IF( lda.LT.max( 1, n ) ) THEN
178 info = -5
179 ELSE IF( ldb.LT.max( 1, n ) ) THEN
180 info = -8
181 ELSE IF( lwork.LT.max( 1, 3*n-2 ) .AND. .NOT.lquery ) THEN
182 info = -10
183 END IF
184 IF( info.NE.0 ) THEN
185 CALL xerbla(
'CHETRS_AA', -info )
186 RETURN
187 ELSE IF( lquery ) THEN
188 lwkopt = (3*n-2)
189 work( 1 ) = lwkopt
190 RETURN
191 END IF
192
193
194
195 IF( n.EQ.0 .OR. nrhs.EQ.0 )
196 $ RETURN
197
198 IF( upper ) THEN
199
200
201
202
203
204 IF( n.GT.1 ) THEN
205
206
207
208 k = 1
209 DO WHILE ( k.LE.n )
210 kp = ipiv( k )
211 IF( kp.NE.k )
212 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
213 k = k + 1
214 END DO
215
216
217
218 CALL ctrsm(
'L',
'U',
'C',
'U', n-1, nrhs, one, a( 1, 2 ),
219 $ lda, b( 2, 1 ), ldb)
220 END IF
221
222
223
224
225
226 CALL clacpy(
'F', 1, n, a(1, 1), lda+1, work(n), 1)
227 IF( n.GT.1 ) THEN
228 CALL clacpy(
'F', 1, n-1, a( 1, 2 ), lda+1, work( 2*n ), 1)
229 CALL clacpy(
'F', 1, n-1, a( 1, 2 ), lda+1, work( 1 ), 1)
230 CALL clacgv( n-1, work( 1 ), 1 )
231 END IF
232 CALL cgtsv(n, nrhs, work(1), work(n), work(2*n), b, ldb,
233 $ info)
234
235
236
237 IF( n.GT.1 ) THEN
238
239
240
241 CALL ctrsm(
'L',
'U',
'N',
'U', n-1, nrhs, one, a( 1, 2 ),
242 $ lda, b(2, 1), ldb)
243
244
245
246 k = n
247 DO WHILE ( k.GE.1 )
248 kp = ipiv( k )
249 IF( kp.NE.k )
250 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
251 k = k - 1
252 END DO
253 END IF
254
255 ELSE
256
257
258
259
260
261 IF( n.GT.1 ) THEN
262
263
264
265 k = 1
266 DO WHILE ( k.LE.n )
267 kp = ipiv( k )
268 IF( kp.NE.k )
269 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
270 k = k + 1
271 END DO
272
273
274
275 CALL ctrsm(
'L',
'L',
'N',
'U', n-1, nrhs, one, a( 2, 1),
276 $ lda, b(2, 1), ldb )
277 END IF
278
279
280
281
282
283 CALL clacpy(
'F', 1, n, a(1, 1), lda+1, work(n), 1)
284 IF( n.GT.1 ) THEN
285 CALL clacpy(
'F', 1, n-1, a( 2, 1 ), lda+1, work( 1 ), 1 )
286 CALL clacpy(
'F', 1, n-1, a( 2, 1 ), lda+1, work( 2*n ), 1)
287 CALL clacgv( n-1, work( 2*n ), 1 )
288 END IF
289 CALL cgtsv(n, nrhs, work(1), work(n), work(2*n), b, ldb,
290 $ info)
291
292
293
294 IF( n.GT.1 ) THEN
295
296
297
298 CALL ctrsm(
'L',
'L',
'C',
'U', n-1, nrhs, one, a( 2, 1 ),
299 $ lda, b( 2, 1 ), ldb )
300
301
302
303 k = n
304 DO WHILE ( k.GE.1 )
305 kp = ipiv( k )
306 IF( kp.NE.k )
307 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
308 k = k - 1
309 END DO
310 END IF
311
312 END IF
313
314 RETURN
315
316
317
subroutine xerbla(SRNAME, INFO)
XERBLA
logical function lsame(CA, CB)
LSAME
subroutine cswap(N, CX, INCX, CY, INCY)
CSWAP
subroutine ctrsm(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CTRSM
subroutine cgtsv(N, NRHS, DL, D, DU, B, LDB, INFO)
CGTSV computes the solution to system of linear equations A * X = B for GT matrices
subroutine clacgv(N, X, INCX)
CLACGV conjugates a complex vector.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.