125
126
127
128
129
130
131 CHARACTER UPLO
132 INTEGER INFO, LDA, LDB, N, NRHS
133
134
135 INTEGER IPIV( * )
136 COMPLEX A( LDA, * ), B( LDB, * ), WORK( * )
137
138
139
140
141
142 COMPLEX ONE
143 parameter( one = (1.0e+0,0.0e+0) )
144
145
146 LOGICAL UPPER
147 INTEGER I, IINFO, J, K, KP
148 REAL S
149 COMPLEX AK, AKM1, AKM1K, BK, BKM1, DENOM
150
151
152 LOGICAL LSAME
154
155
158
159
160 INTRINSIC conjg, max, real
161
162
163
164 info = 0
165 upper =
lsame( uplo,
'U' )
166 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
167 info = -1
168 ELSE IF( n.LT.0 ) THEN
169 info = -2
170 ELSE IF( nrhs.LT.0 ) THEN
171 info = -3
172 ELSE IF( lda.LT.max( 1, n ) ) THEN
173 info = -5
174 ELSE IF( ldb.LT.max( 1, n ) ) THEN
175 info = -8
176 END IF
177 IF( info.NE.0 ) THEN
178 CALL xerbla(
'CHETRS2', -info )
179 RETURN
180 END IF
181
182
183
184 IF( n.EQ.0 .OR. nrhs.EQ.0 )
185 $ RETURN
186
187
188
189 CALL csyconv( uplo,
'C', n, a, lda, ipiv, work, iinfo )
190
191 IF( upper ) THEN
192
193
194
195
196 k=n
197 DO WHILE ( k .GE. 1 )
198 IF( ipiv( k ).GT.0 ) THEN
199
200
201 kp = ipiv( k )
202 IF( kp.NE.k )
203 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
204 k=k-1
205 ELSE
206
207
208 kp = -ipiv( k )
209 IF( kp.EQ.-ipiv( k-1 ) )
210 $
CALL cswap( nrhs, b( k-1, 1 ), ldb, b( kp, 1 ), ldb )
211 k=k-2
212 END IF
213 END DO
214
215
216
217 CALL ctrsm(
'L',
'U',
'N',
'U',n,nrhs,one,a,lda,b,ldb)
218
219
220
221 i=n
222 DO WHILE ( i .GE. 1 )
223 IF( ipiv(i) .GT. 0 ) THEN
224 s = real( one ) / real( a( i, i ) )
225 CALL csscal( nrhs, s, b( i, 1 ), ldb )
226 ELSEIF ( i .GT. 1) THEN
227 IF ( ipiv(i-1) .EQ. ipiv(i) ) THEN
228 akm1k = work(i)
229 akm1 = a( i-1, i-1 ) / akm1k
230 ak = a( i, i ) / conjg( akm1k )
231 denom = akm1*ak - one
232 DO 15 j = 1, nrhs
233 bkm1 = b( i-1, j ) / akm1k
234 bk = b( i, j ) / conjg( akm1k )
235 b( i-1, j ) = ( ak*bkm1-bk ) / denom
236 b( i, j ) = ( akm1*bk-bkm1 ) / denom
237 15 CONTINUE
238 i = i - 1
239 ENDIF
240 ENDIF
241 i = i - 1
242 END DO
243
244
245
246 CALL ctrsm(
'L',
'U',
'C',
'U',n,nrhs,one,a,lda,b,ldb)
247
248
249
250 k=1
251 DO WHILE ( k .LE. n )
252 IF( ipiv( k ).GT.0 ) THEN
253
254
255 kp = ipiv( k )
256 IF( kp.NE.k )
257 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
258 k=k+1
259 ELSE
260
261
262 kp = -ipiv( k )
263 IF( k .LT. n .AND. kp.EQ.-ipiv( k+1 ) )
264 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
265 k=k+2
266 ENDIF
267 END DO
268
269 ELSE
270
271
272
273
274 k=1
275 DO WHILE ( k .LE. n )
276 IF( ipiv( k ).GT.0 ) THEN
277
278
279 kp = ipiv( k )
280 IF( kp.NE.k )
281 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
282 k=k+1
283 ELSE
284
285
286 kp = -ipiv( k+1 )
287 IF( kp.EQ.-ipiv( k ) )
288 $
CALL cswap( nrhs, b( k+1, 1 ), ldb, b( kp, 1 ), ldb )
289 k=k+2
290 ENDIF
291 END DO
292
293
294
295 CALL ctrsm(
'L',
'L',
'N',
'U',n,nrhs,one,a,lda,b,ldb)
296
297
298
299 i=1
300 DO WHILE ( i .LE. n )
301 IF( ipiv(i) .GT. 0 ) THEN
302 s = real( one ) / real( a( i, i ) )
303 CALL csscal( nrhs, s, b( i, 1 ), ldb )
304 ELSE
305 akm1k = work(i)
306 akm1 = a( i, i ) / conjg( akm1k )
307 ak = a( i+1, i+1 ) / akm1k
308 denom = akm1*ak - one
309 DO 25 j = 1, nrhs
310 bkm1 = b( i, j ) / conjg( akm1k )
311 bk = b( i+1, j ) / akm1k
312 b( i, j ) = ( ak*bkm1-bk ) / denom
313 b( i+1, j ) = ( akm1*bk-bkm1 ) / denom
314 25 CONTINUE
315 i = i + 1
316 ENDIF
317 i = i + 1
318 END DO
319
320
321
322 CALL ctrsm(
'L',
'L',
'C',
'U',n,nrhs,one,a,lda,b,ldb)
323
324
325
326 k=n
327 DO WHILE ( k .GE. 1 )
328 IF( ipiv( k ).GT.0 ) THEN
329
330
331 kp = ipiv( k )
332 IF( kp.NE.k )
333 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
334 k=k-1
335 ELSE
336
337
338 kp = -ipiv( k )
339 IF( k.GT.1 .AND. kp.EQ.-ipiv( k-1 ) )
340 $
CALL cswap( nrhs, b( k, 1 ), ldb, b( kp, 1 ), ldb )
341 k=k-2
342 ENDIF
343 END DO
344
345 END IF
346
347
348
349 CALL csyconv( uplo,
'R', n, a, lda, ipiv, work, iinfo )
350
351 RETURN
352
353
354
subroutine xerbla(srname, info)
logical function lsame(ca, cb)
LSAME
subroutine csscal(n, sa, cx, incx)
CSSCAL
subroutine cswap(n, cx, incx, cy, incy)
CSWAP
subroutine csyconv(uplo, way, n, a, lda, ipiv, e, info)
CSYCONV
subroutine ctrsm(side, uplo, transa, diag, m, n, alpha, a, lda, b, ldb)
CTRSM