207 SUBROUTINE zcposv( UPLO, N, NRHS, A, LDA, B, LDB, X, LDX, WORK,
208 $ SWORK, RWORK, ITER, INFO )
216 INTEGER INFO, ITER, , LDB, LDX, N, NRHS
219 DOUBLE PRECISION RWORK( * )
221 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( N, * ),
229 parameter( doitref = .true. )
232 parameter( itermax = 30 )
234 DOUBLE PRECISION BWDMAX
235 parameter( bwdmax = 1.0e+00 )
237 COMPLEX*16 NEGONE, ONE
239 $ one = ( 1.0d+00, 0.0d+00 ) )
242 INTEGER I, IITER, PTSA, PTSX
243 DOUBLE PRECISION ANRM, CTE, , RNRM, XNRM
252 DOUBLE PRECISION DLAMCH, ZLANHE
254 EXTERNAL izamax, dlamch, zlanhe
257 INTRINSIC abs, dble,
max, sqrt
259 DOUBLE PRECISION CABS1
262 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
271 IF( .NOT.lsame( uplo,
'U' ) .AND. .NOT.lsame( uplo,
'L' ) )
THEN
273 ELSE IF( n.LT.0 )
THEN
275 ELSE IF( nrhs.LT.0 )
THEN
277 ELSE IF( lda.LT.
max( 1, n ) )
THEN
279 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
281 ELSE IF( ldx.LT.
max( 1, n ) )
THEN
285 CALL xerbla(
'ZCPOSV', -info )
297 IF( .NOT.doitref )
THEN
304 anrm = zlanhe(
'I', uplo, n, a, lda, rwork )
305 eps = dlamch(
'Epsilon' )
306 cte = anrm*eps*sqrt( dble( n ) )*bwdmax
316 CALL zlag2c( n, nrhs, b, ldb, swork( ptsx ), n, info )
326 CALL zlat2c( uplo, n, a, lda, swork( ptsa ), n, info )
335 CALL cpotrf( uplo, n, swork( ptsa ), n, info )
344 CALL cpotrs( uplo, n, nrhs, swork( ptsa ), n, swork( ptsx ), n,
349 CALL clag2z( n, nrhs, swork( ptsx ), n, x, ldx, info )
353 CALL zlacpy(
'All', n, nrhs, b, ldb, work, n )
355 CALL zhemm(
'Left', uplo, n, nrhs, negone, a, lda, x, ldx, one,
362 xnrm = cabs1( x(
izamax( n, x( 1, i ), 1 ), i ) )
363 rnrm = cabs1( work(
izamax( n, work( 1, i ), 1 ), i ) )
364 IF( rnrm.GT.xnrm*cte )
376 DO 30 iiter = 1, itermax
381 CALL zlag2c( n, nrhs, work, n, swork( ptsx ), n, info )
390 CALL cpotrs( uplo, n, nrhs, swork( ptsa ), n, swork( ptsx ), n,
396 CALL clag2z( n, nrhs, swork( ptsx ), n, work, n, info )
399 CALL zaxpy( n, one, work( 1, i ), 1, x( 1, i ), 1 )
404 CALL zlacpy(
'All', n, nrhs, b, ldb, work, n )
406 CALL zhemm(
'L', uplo, n, nrhs, negone, a, lda, x, ldx, one,
413 xnrm = cabs1( x(
izamax( n, x( 1, i ), 1 ), i ) )
414 rnrm = cabs1( work(
izamax( n, work( 1, i ), 1 ), i ) )
415 IF( rnrm.GT.xnrm*cte )
442 CALL zpotrf( uplo, n, a, lda, info )
447 CALL zlacpy(
'All', n, nrhs, b, ldb, x, ldx )
448 CALL zpotrs( uplo, n, nrhs, a, lda, x, ldx, info )