112
113
114
115
116
117
118 CHARACTER UPLO
119 INTEGER INFO, LDA, N
120
121
122 INTEGER IPIV( * )
123 COMPLEX*16 A( LDA, * ), WORK( * )
124
125
126
127
128
129 COMPLEX*16 ONE, ZERO
130 parameter( one = ( 1.0d+0, 0.0d+0 ),
131 $ zero = ( 0.0d+0, 0.0d+0 ) )
132
133
134 LOGICAL UPPER
135 INTEGER K, KP, KSTEP
136 COMPLEX*16 AK, AKKP1, AKP1, D, T, TEMP
137
138
139 LOGICAL LSAME
140 COMPLEX*16 ZDOTU
142
143
145
146
147 INTRINSIC abs, max
148
149
150
151
152
153 info = 0
154 upper =
lsame( uplo,
'U' )
155 IF( .NOT.upper .AND. .NOT.
lsame( uplo,
'L' ) )
THEN
156 info = -1
157 ELSE IF( n.LT.0 ) THEN
158 info = -2
159 ELSE IF( lda.LT.max( 1, n ) ) THEN
160 info = -4
161 END IF
162 IF( info.NE.0 ) THEN
163 CALL xerbla(
'ZSYTRI', -info )
164 RETURN
165 END IF
166
167
168
169 IF( n.EQ.0 )
170 $ RETURN
171
172
173
174 IF( upper ) THEN
175
176
177
178 DO 10 info = n, 1, -1
179 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
180 $ RETURN
181 10 CONTINUE
182 ELSE
183
184
185
186 DO 20 info = 1, n
187 IF( ipiv( info ).GT.0 .AND. a( info, info ).EQ.zero )
188 $ RETURN
189 20 CONTINUE
190 END IF
191 info = 0
192
193 IF( upper ) THEN
194
195
196
197
198
199
200 k = 1
201 30 CONTINUE
202
203
204
205 IF( k.GT.n )
206 $ GO TO 40
207
208 IF( ipiv( k ).GT.0 ) THEN
209
210
211
212
213
214 a( k, k ) = one / a( k, k )
215
216
217
218 IF( k.GT.1 ) THEN
219 CALL zcopy( k-1, a( 1, k ), 1, work, 1 )
220 CALL zsymv( uplo, k-1, -one, a, lda, work, 1, zero,
221 $ a( 1, k ), 1 )
222 a( k, k ) = a( k, k ) -
zdotu( k-1, work, 1, a( 1,
223 $ k ),
224 $ 1 )
225 END IF
226 kstep = 1
227 ELSE
228
229
230
231
232
233 t = a( k, k+1 )
234 ak = a( k, k ) / t
235 akp1 = a( k+1, k+1 ) / t
236 akkp1 = a( k, k+1 ) / t
237 d = t*( ak*akp1-one )
238 a( k, k ) = akp1 / d
239 a( k+1, k+1 ) = ak / d
240 a( k, k+1 ) = -akkp1 / d
241
242
243
244 IF( k.GT.1 ) THEN
245 CALL zcopy( k-1, a( 1, k ), 1, work, 1 )
246 CALL zsymv( uplo, k-1, -one, a, lda, work, 1, zero,
247 $ a( 1, k ), 1 )
248 a( k, k ) = a( k, k ) -
zdotu( k-1, work, 1, a( 1,
249 $ k ),
250 $ 1 )
251 a( k, k+1 ) = a( k, k+1 ) -
252 $
zdotu( k-1, a( 1, k ), 1, a( 1, k+1 ),
253 $ 1 )
254 CALL zcopy( k-1, a( 1, k+1 ), 1, work, 1 )
255 CALL zsymv( uplo, k-1, -one, a, lda, work, 1, zero,
256 $ a( 1, k+1 ), 1 )
257 a( k+1, k+1 ) = a( k+1, k+1 ) -
258 $
zdotu( k-1, work, 1, a( 1, k+1 ), 1 )
259 END IF
260 kstep = 2
261 END IF
262
263 kp = abs( ipiv( k ) )
264 IF( kp.NE.k ) THEN
265
266
267
268
269 CALL zswap( kp-1, a( 1, k ), 1, a( 1, kp ), 1 )
270 CALL zswap( k-kp-1, a( kp+1, k ), 1, a( kp, kp+1 ), lda )
271 temp = a( k, k )
272 a( k, k ) = a( kp, kp )
273 a( kp, kp ) = temp
274 IF( kstep.EQ.2 ) THEN
275 temp = a( k, k+1 )
276 a( k, k+1 ) = a( kp, k+1 )
277 a( kp, k+1 ) = temp
278 END IF
279 END IF
280
281 k = k + kstep
282 GO TO 30
283 40 CONTINUE
284
285 ELSE
286
287
288
289
290
291
292 k = n
293 50 CONTINUE
294
295
296
297 IF( k.LT.1 )
298 $ GO TO 60
299
300 IF( ipiv( k ).GT.0 ) THEN
301
302
303
304
305
306 a( k, k ) = one / a( k, k )
307
308
309
310 IF( k.LT.n ) THEN
311 CALL zcopy( n-k, a( k+1, k ), 1, work, 1 )
312 CALL zsymv( uplo, n-k, -one, a( k+1, k+1 ), lda, work,
313 $ 1,
314 $ zero, a( k+1, k ), 1 )
315 a( k, k ) = a( k, k ) -
zdotu( n-k, work, 1, a( k+1,
316 $ k ),
317 $ 1 )
318 END IF
319 kstep = 1
320 ELSE
321
322
323
324
325
326 t = a( k, k-1 )
327 ak = a( k-1, k-1 ) / t
328 akp1 = a( k, k ) / t
329 akkp1 = a( k, k-1 ) / t
330 d = t*( ak*akp1-one )
331 a( k-1, k-1 ) = akp1 / d
332 a( k, k ) = ak / d
333 a( k, k-1 ) = -akkp1 / d
334
335
336
337 IF( k.LT.n ) THEN
338 CALL zcopy( n-k, a( k+1, k ), 1, work, 1 )
339 CALL zsymv( uplo, n-k, -one, a( k+1, k+1 ), lda, work,
340 $ 1,
341 $ zero, a( k+1, k ), 1 )
342 a( k, k ) = a( k, k ) -
zdotu( n-k, work, 1, a( k+1,
343 $ k ),
344 $ 1 )
345 a( k, k-1 ) = a( k, k-1 ) -
346 $
zdotu( n-k, a( k+1, k ), 1, a( k+1,
347 $ k-1 ),
348 $ 1 )
349 CALL zcopy( n-k, a( k+1, k-1 ), 1, work, 1 )
350 CALL zsymv( uplo, n-k, -one, a( k+1, k+1 ), lda, work,
351 $ 1,
352 $ zero, a( k+1, k-1 ), 1 )
353 a( k-1, k-1 ) = a( k-1, k-1 ) -
354 $
zdotu( n-k, work, 1, a( k+1, k-1 ),
355 $ 1 )
356 END IF
357 kstep = 2
358 END IF
359
360 kp = abs( ipiv( k ) )
361 IF( kp.NE.k ) THEN
362
363
364
365
366 IF( kp.LT.n )
367 $
CALL zswap( n-kp, a( kp+1, k ), 1, a( kp+1, kp ), 1 )
368 CALL zswap( kp-k-1, a( k+1, k ), 1, a( kp, k+1 ), lda )
369 temp = a( k, k )
370 a( k, k ) = a( kp, kp )
371 a( kp, kp ) = temp
372 IF( kstep.EQ.2 ) THEN
373 temp = a( k, k-1 )
374 a( k, k-1 ) = a( kp, k-1 )
375 a( kp, k-1 ) = temp
376 END IF
377 END IF
378
379 k = k - kstep
380 GO TO 50
381 60 CONTINUE
382 END IF
383
384 RETURN
385
386
387
subroutine xerbla(srname, info)
subroutine zcopy(n, zx, incx, zy, incy)
ZCOPY
complex *16 function zdotu(n, zx, incx, zy, incy)
ZDOTU
subroutine zsymv(uplo, n, alpha, a, lda, x, incx, beta, y, incy)
ZSYMV computes a matrix-vector product for a complex symmetric matrix.
logical function lsame(ca, cb)
LSAME
subroutine zswap(n, zx, incx, zy, incy)
ZSWAP