106 SUBROUTINE csptri( UPLO, N, AP, IPIV, WORK, INFO )
118 COMPLEX AP( * ), WORK( * )
125 parameter( one = ( 1.0e+0, 0.0e+0 ),
126 $ zero = ( 0.0e+0, 0.0e+0 ) )
130 INTEGER J, K, KC, KCNEXT, KP, KPC, KSTEP, KX, NPP
131 COMPLEX AK, AKKP1, AKP1, D, T, TEMP
136 EXTERNAL lsame, cdotu
149 upper = lsame( uplo,
'U' )
150 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
152 ELSE IF( n.LT.0 )
THEN
156 CALL xerbla(
'CSPTRI', -info )
172 DO 10 info = n, 1, -1
173 IF( ipiv( info ).GT.0 .AND. ap( kp ).EQ.zero )
183 IF( ipiv( info ).GT.0 .AND. ap( kp ).EQ.zero )
185 kp = kp + n - info + 1
207 IF( ipiv( k ).GT.0 )
THEN
213 ap( kc+k-1 ) = one / ap( kc+k-1 )
218 CALL ccopy( k-1, ap( kc ), 1, work, 1 )
219 CALL cspmv( uplo, k-1, -one, ap, work, 1, zero,
222 ap( kc+k-1 ) = ap( kc+k-1 ) -
223 $ cdotu( k-1, work, 1, ap( kc ), 1 )
233 ak = ap( kc+k-1 ) / t
234 akp1 = ap( kcnext+k ) / t
235 akkp1 = ap( kcnext+k-1 ) / t
236 d = t*( ak*akp1-one )
237 ap( kc+k-1 ) = akp1 / d
238 ap( kcnext+k ) = ak / d
239 ap( kcnext+k-1 ) = -akkp1 / d
244 CALL ccopy( k-1, ap( kc ), 1, work, 1 )
245 CALL cspmv( uplo, k-1, -one, ap, work, 1, zero,
248 ap( kc+k-1 ) = ap( kc+k-1 ) -
249 $ cdotu( k-1, work, 1, ap( kc ), 1 )
250 ap( kcnext+k-1 ) = ap( kcnext+k-1 ) -
251 $ cdotu( k-1, ap( kc ), 1,
254 CALL ccopy( k-1, ap( kcnext ), 1, work, 1 )
255 CALL cspmv( uplo, k-1, -one, ap, work, 1, zero,
257 ap( kcnext+k ) = ap( kcnext+k ) -
258 $ cdotu( k-1, work, 1, ap( kcnext ),
262 kcnext = kcnext + k + 1
265 kp = abs( ipiv( k ) )
271 kpc = ( kp-1 )*kp / 2 + 1
272 CALL cswap( kp-1, ap( kc ), 1, ap( kpc ), 1 )
274 DO 40 j = kp + 1, k - 1
277 ap( kc+j-1 ) = ap( kx )
281 ap( kc+k-1 ) = ap( kpc+kp-1 )
282 ap( kpc+kp-1 ) = temp
283 IF( kstep.EQ.2 )
THEN
284 temp = ap( kc+k+k-1 )
285 ap( kc+k+k-1 ) = ap( kc+k+kp-1 )
286 ap( kc+k+kp-1 ) = temp
312 kcnext = kc - ( n-k+2 )
313 IF( ipiv( k ).GT.0 )
THEN
319 ap( kc ) = one / ap( kc )
324 CALL ccopy( n-k, ap( kc+1 ), 1, work, 1 )
325 CALL cspmv( uplo, n-k, -one, ap( kc+n-k+1 ), work, 1,
326 $ zero, ap( kc+1 ), 1 )
327 ap( kc ) = ap( kc ) - cdotu( n-k, work, 1, ap( kc+1 ),
338 ak = ap( kcnext ) / t
340 akkp1 = ap( kcnext+1 ) / t
341 d = t*( ak*akp1-one )
342 ap( kcnext ) = akp1 / d
344 ap( kcnext+1 ) = -akkp1 / d
349 CALL ccopy( n-k, ap( kc+1 ), 1, work, 1 )
350 CALL cspmv( uplo, n-k, -one, ap( kc+( n-k+1 ) ), work,
352 $ zero, ap( kc+1 ), 1 )
353 ap( kc ) = ap( kc ) - cdotu( n-k, work, 1, ap( kc+1 ),
355 ap( kcnext+1 ) = ap( kcnext+1 ) -
356 $ cdotu( n-k, ap( kc+1 ), 1,
357 $ ap( kcnext+2 ), 1 )
358 CALL ccopy( n-k, ap( kcnext+2 ), 1, work, 1 )
359 CALL cspmv( uplo, n-k, -one, ap( kc+( n-k+1 ) ), work,
361 $ zero, ap( kcnext+2 ), 1 )
362 ap( kcnext ) = ap( kcnext ) -
363 $ cdotu( n-k, work, 1, ap( kcnext+2 ),
367 kcnext = kcnext - ( n-k+3 )
370 kp = abs( ipiv( k ) )
376 kpc = npp - ( n-kp+1 )*( n-kp+2 ) / 2 + 1
378 $
CALL cswap( n-kp, ap( kc+kp-k+1 ), 1, ap( kpc+1 ), 1 )
380 DO 70 j = k + 1, kp - 1
383 ap( kc+j-k ) = ap( kx )
389 IF( kstep.EQ.2 )
THEN
390 temp = ap( kc-n+k-1 )
391 ap( kc-n+k-1 ) = ap( kc-n+kp-1 )
392 ap( kc-n+kp-1 ) = temp