197 SUBROUTINE dsposv( UPLO, N, NRHS, A, LDA, B, LDB, X, LDX, WORK,
198 $ SWORK, ITER, INFO )
206 INTEGER INFO, ITER, LDA, LDB, LDX, N, NRHS
210 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), ( N, * ),
218 parameter( doitref = .true. )
221 parameter( itermax = 30 )
223 DOUBLE PRECISION BWDMAX
224 parameter( bwdmax = 1.0e+00 )
226 DOUBLE PRECISION NEGONE, ONE
227 PARAMETER ( negone = -1.0d+0, one = 1.0d+0 )
230 INTEGER I, IITER, PTSA, PTSX
231 DOUBLE PRECISION , CTE, EPS, RNRM, XNRM
239 DOUBLE PRECISION DLAMCH, DLANSY
241 EXTERNAL idamax, dlamch, dlansy, lsame
244 INTRINSIC abs, dble,
max, sqrt
253 IF( .NOT.lsame( uplo,
'U' ) .AND. .NOT.lsame( uplo,
'L' ) )
THEN
255 ELSE IF( n.LT.0 )
THEN
257 ELSE IF( nrhs.LT.0 )
THEN
259 ELSE IF( lda.LT.
max( 1, n ) )
THEN
261 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
263 ELSE IF( ldx.LT.
max( 1, n ) )
THEN
267 CALL xerbla(
'DSPOSV', -info )
279 IF( .NOT.doitref )
THEN
286 anrm = dlansy(
'I', uplo, n, a, lda, work )
287 eps = dlamch(
'Epsilon' )
288 cte = anrm*eps*sqrt( dble( n ) )*bwdmax
298 CALL dlag2s( n, nrhs, b, ldb, swork( ptsx ), n, info )
308 CALL dlat2s( uplo, n, a, lda, swork( ptsa ), n, info )
317 CALL spotrf( uplo, n, swork( ptsa ), n, info )
326 CALL spotrs( uplo, n, nrhs, swork( ptsa ), n, swork( ptsx ), n,
331 CALL slag2d( n, nrhs, swork( ptsx ), n, x, ldx, info )
335 CALL dlacpy(
'All', n, nrhs, b, ldb, work, n )
337 CALL dsymm(
'Left', uplo, n, nrhs, negone, a, lda, x, ldx, one,
344 xnrm = abs( x( idamax( n, x( 1, i ), 1 ), i ) )
345 rnrm = abs( work( idamax( n, work( 1, i ), 1 ), i ) )
346 IF( rnrm.GT.xnrm*cte )
358 DO 30 iiter = 1, itermax
363 CALL dlag2s( n, nrhs, work, n, swork( ptsx ), n, info )
372 CALL spotrs( uplo, n, nrhs, swork( ptsa ), n, swork( ptsx ), n,
378 CALL slag2d( n, nrhs, swork( ptsx ), n, work, n, info )
381 CALL daxpy( n, one, work( 1, i ), 1, x( 1, i ), 1 )
386 CALL dlacpy(
'All', n, nrhs, b, ldb, work, n )
388 CALL dsymm(
'L', uplo, n, nrhs, negone, a, lda, x, ldx, one,
395 xnrm = abs( x( idamax( n, x( 1, i ), 1 ), i ) )
396 rnrm = abs( work( idamax( n, work( 1, i ), 1 ), i ) )
397 IF( rnrm.GT.xnrm*cte )
424 CALL dpotrf( uplo, n, a, lda, info )
429 CALL dlacpy(
'All', n, nrhs, b, ldb, x, ldx )
430 CALL dpotrs( uplo, n, nrhs, a, lda, x, ldx, info )