205 SUBROUTINE zcposv( UPLO, N, NRHS, A, LDA, B, LDB, X, LDX, WORK,
206 $ SWORK, RWORK, ITER, INFO )
214 INTEGER INFO, ITER, LDA, LDB, LDX, N, NRHS
217 DOUBLE PRECISION RWORK( * )
219 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( N, * ),
227 parameter( doitref = .true. )
230 parameter( itermax = 30 )
232 DOUBLE PRECISION BWDMAX
233 parameter( bwdmax = 1.0e+00 )
235 COMPLEX*16 NEGONE, ONE
236 parameter( negone = ( -1.0d+00, 0.0d+00 ),
237 $ one = ( 1.0d+00, 0.0d+00 ) )
240 INTEGER I, IITER, PTSA, PTSX
241 DOUBLE PRECISION ANRM, CTE, EPS, RNRM, XNRM
251 DOUBLE PRECISION DLAMCH, ZLANHE
253 EXTERNAL izamax, dlamch, zlanhe, lsame
256 INTRINSIC abs, dble, max, sqrt
258 DOUBLE PRECISION CABS1
261 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
270 IF( .NOT.lsame( uplo,
'U' ) .AND.
271 $ .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 ),
397 CALL clag2z( n, nrhs, swork( ptsx ), n, work, n, info )
400 CALL zaxpy( n, one, work( 1, i ), 1, x( 1, i ), 1 )
405 CALL zlacpy(
'All', n, nrhs, b, ldb, work, n )
407 CALL zhemm(
'L', uplo, n, nrhs, negone, a, lda, x, ldx, one,
414 xnrm = cabs1( x( izamax( n, x( 1, i ), 1 ), i ) )
415 rnrm = cabs1( work( izamax( n, work( 1, i ), 1 ), i ) )
416 IF( rnrm.GT.xnrm*cte )
443 CALL zpotrf( uplo, n, a, lda, info )
448 CALL zlacpy(
'All', n, nrhs, b, ldb, x, ldx )
449 CALL zpotrs( uplo, n, nrhs, a, lda, x, ldx, info )