191 SUBROUTINE dsgesv( N, NRHS, A, LDA, IPIV, B, LDB, X, LDX, WORK,
192 $ SWORK, ITER, INFO )
199 INTEGER INFO, ITER, LDA, LDB, LDX, N, NRHS
204 DOUBLE PRECISION A( LDA, * ), B( LDB, * ), WORK( N, * ),
212 parameter( doitref = .true. )
215 parameter( itermax = 30 )
217 DOUBLE PRECISION BWDMAX
218 parameter( bwdmax = 1.0e+00 )
220 DOUBLE PRECISION NEGONE, ONE
221 parameter( negone = -1.0d+0, one = 1.0d+0 )
224 INTEGER I, IITER, PTSA, PTSX
225 DOUBLE PRECISION ANRM, CTE, EPS, RNRM, XNRM
234 DOUBLE PRECISION DLAMCH, DLANGE
235 EXTERNAL idamax, dlamch, dlange
238 INTRINSIC abs, dble, max, sqrt
249 ELSE IF( nrhs.LT.0 )
THEN
251 ELSE IF( lda.LT.max( 1, n ) )
THEN
253 ELSE IF( ldb.LT.max( 1, n ) )
THEN
255 ELSE IF( ldx.LT.max( 1, n ) )
THEN
259 CALL xerbla(
'DSGESV', -info )
271 IF( .NOT.doitref )
THEN
278 anrm = dlange(
'I', n, n, a, lda, work )
279 eps = dlamch(
'Epsilon' )
280 cte = anrm*eps*sqrt( dble( n ) )*bwdmax
290 CALL dlag2s( n, nrhs, b, ldb, swork( ptsx ), n, info )
300 CALL dlag2s( n, n, a, lda, swork( ptsa ), n, info )
309 CALL sgetrf( n, n, swork( ptsa ), n, ipiv, info )
318 CALL sgetrs(
'No transpose', n, nrhs, swork( ptsa ), n, ipiv,
319 $ swork( ptsx ), n, info )
323 CALL slag2d( n, nrhs, swork( ptsx ), n, x, ldx, info )
327 CALL dlacpy(
'All', n, nrhs, b, ldb, work, n )
329 CALL dgemm(
'No Transpose',
'No Transpose', n, nrhs, n, negone,
331 $ lda, x, ldx, one, work, n )
337 xnrm = abs( x( idamax( n, x( 1, i ), 1 ), i ) )
338 rnrm = abs( work( idamax( n, work( 1, i ), 1 ), i ) )
339 IF( rnrm.GT.xnrm*cte )
351 DO 30 iiter = 1, itermax
356 CALL dlag2s( n, nrhs, work, n, swork( ptsx ), n, info )
365 CALL sgetrs(
'No transpose', n, nrhs, swork( ptsa ), n,
367 $ swork( ptsx ), n, info )
372 CALL slag2d( n, nrhs, swork( ptsx ), n, work, n, info )
375 CALL daxpy( n, one, work( 1, i ), 1, x( 1, i ), 1 )
380 CALL dlacpy(
'All', n, nrhs, b, ldb, work, n )
382 CALL dgemm(
'No Transpose',
'No Transpose', n, nrhs, n,
384 $ a, lda, x, ldx, one, work, n )
390 xnrm = abs( x( idamax( n, x( 1, i ), 1 ), i ) )
391 rnrm = abs( work( idamax( n, work( 1, i ), 1 ), i ) )
392 IF( rnrm.GT.xnrm*cte )
419 CALL dgetrf( n, n, a, lda, ipiv, info )
424 CALL dlacpy(
'All', n, nrhs, b, ldb, x, ldx )
425 CALL dgetrs(
'No transpose', n, nrhs, a, lda, ipiv, x, ldx,