197 SUBROUTINE zcgesv( N, NRHS, A, LDA, IPIV, B, LDB, X, LDX, WORK,
198 $ SWORK, RWORK, ITER, INFO )
205 INTEGER INFO, ITER, LDA, LDB, LDX, N, NRHS
209 DOUBLE PRECISION RWORK( * )
211 COMPLEX*16 A( LDA, * ), B( LDB, * ), WORK( N, * ),
219 parameter( doitref = .true. )
222 parameter( itermax = 30 )
224 DOUBLE PRECISION BWDMAX
225 parameter( bwdmax = 1.0e+00 )
227 COMPLEX*16 NEGONE, ONE
228 parameter( negone = ( -1.0d+00, 0.0d+00 ),
229 $ one = ( 1.0d+00, 0.0d+00 ) )
232 INTEGER I, IITER, PTSA, PTSX
233 DOUBLE PRECISION ANRM, CTE, EPS, RNRM, XNRM
243 DOUBLE PRECISION DLAMCH, ZLANGE
244 EXTERNAL izamax, dlamch, zlange
247 INTRINSIC abs, dble, max, sqrt
250 DOUBLE PRECISION CABS1
253 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
264 ELSE IF( nrhs.LT.0 )
THEN
266 ELSE IF( lda.LT.max( 1, n ) )
THEN
268 ELSE IF( ldb.LT.max( 1, n ) )
THEN
270 ELSE IF( ldx.LT.max( 1, n ) )
THEN
274 CALL xerbla(
'ZCGESV', -info )
286 IF( .NOT.doitref )
THEN
293 anrm = zlange(
'I', n, n, a, lda, rwork )
294 eps = dlamch(
'Epsilon' )
295 cte = anrm*eps*sqrt( dble( n ) )*bwdmax
305 CALL zlag2c( n, nrhs, b, ldb, swork( ptsx ), n, info )
315 CALL zlag2c( n, n, a, lda, swork( ptsa ), n, info )
324 CALL cgetrf( n, n, swork( ptsa ), n, ipiv, info )
333 CALL cgetrs(
'No transpose', n, nrhs, swork( ptsa ), n, ipiv,
334 $ swork( ptsx ), n, info )
338 CALL clag2z( n, nrhs, swork( ptsx ), n, x, ldx, info )
342 CALL zlacpy(
'All', n, nrhs, b, ldb, work, n )
344 CALL zgemm(
'No Transpose',
'No Transpose', n, nrhs, n, negone,
346 $ lda, x, ldx, one, work, n )
352 xnrm = cabs1( x( izamax( n, x( 1, i ), 1 ), i ) )
353 rnrm = cabs1( work( izamax( n, work( 1, i ), 1 ), i ) )
354 IF( rnrm.GT.xnrm*cte )
366 DO 30 iiter = 1, itermax
371 CALL zlag2c( n, nrhs, work, n, swork( ptsx ), n, info )
380 CALL cgetrs(
'No transpose', n, nrhs, swork( ptsa ), n,
382 $ swork( ptsx ), n, info )
387 CALL clag2z( n, nrhs, swork( ptsx ), n, work, n, info )
390 CALL zaxpy( n, one, work( 1, i ), 1, x( 1, i ), 1 )
395 CALL zlacpy(
'All', n, nrhs, b, ldb, work, n )
397 CALL zgemm(
'No Transpose',
'No Transpose', n, nrhs, n,
399 $ a, lda, x, ldx, one, work, n )
405 xnrm = cabs1( x( izamax( n, x( 1, i ), 1 ), i ) )
406 rnrm = cabs1( work( izamax( n, work( 1, i ), 1 ), i ) )
407 IF( rnrm.GT.xnrm*cte )
434 CALL zgetrf( n, n, a, lda, ipiv, info )
439 CALL zlacpy(
'All', n, nrhs, b, ldb, x, ldx )
440 CALL zgetrs(
'No transpose', n, nrhs, a, lda, ipiv, x, ldx,