389 SUBROUTINE zporfsx( UPLO, EQUED, N, NRHS, A, LDA, AF, LDAF, S, B,
390 $ LDB, X, LDX, RCOND, BERR, N_ERR_BNDS,
391 $ ERR_BNDS_NORM, ERR_BNDS_COMP, NPARAMS, PARAMS,
392 $ WORK, RWORK, INFO )
399 CHARACTER UPLO, EQUED
400 INTEGER INFO, LDA, LDAF, LDB, LDX, N, NRHS, NPARAMS,
402 DOUBLE PRECISION RCOND
405 COMPLEX*16 A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
406 $ X( LDX, * ), WORK( * )
407 DOUBLE PRECISION RWORK( * ), S( * ), PARAMS(*), BERR( * ),
408 $ err_bnds_norm( nrhs, * ),
409 $ err_bnds_comp( nrhs, * )
415 DOUBLE PRECISION ZERO, ONE
416 PARAMETER ( ZERO = 0.0d+0, one = 1.0d+0 )
417 DOUBLE PRECISION ITREF_DEFAULT,
418 DOUBLE PRECISION COMPONENTWISE_DEFAULT, RTHRESH_DEFAULT
419 DOUBLE PRECISION DZTHRESH_DEFAULT
420 parameter( itref_default = 1.0d+0 )
421 parameter( ithresh_default = 10.0d+0 )
423 parameter( rthresh_default = 0.5d+0 )
424 parameter( dzthresh_default = 0.25d+0 )
425 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
427 parameter( la_linrx_itref_i = 1,
428 $ la_linrx_ithresh_i = 2 )
429 parameter( la_linrx_cwise_i = 3 )
430 INTEGER , LA_LINRX_ERR_I,
433 parameter( la_linrx_rcond_i = 3 )
438 INTEGER , PREC_TYPE, REF_TYPE
440 DOUBLE PRECISION ANORM, RCOND_TMP
441 DOUBLE PRECISION ILLRCOND_THRESH, ERR_LBND, CWISE_WRONG
444 DOUBLE PRECISION RTHRESH, UNSTABLE_THRESH
450 INTRINSIC max, sqrt, transfer
455 DOUBLE PRECISION DLAMCH, ZLANHE, ZLA_PORCOND_X,
464 ref_type = int( itref_default )
465 IF ( nparams .GE. la_linrx_itref_i )
THEN
466 IF ( params( la_linrx_itref_i ) .LT. 0.0d+0 )
THEN
467 params( la_linrx_itref_i ) = itref_default
469 ref_type = params( la_linrx_itref_i )
475 illrcond_thresh = dble( n ) * dlamch( 'epsilon
' )
476 ITHRESH = INT( ITHRESH_DEFAULT )
477 RTHRESH = RTHRESH_DEFAULT
478 UNSTABLE_THRESH = DZTHRESH_DEFAULT
479.EQ.
IGNORE_CWISE = COMPONENTWISE_DEFAULT 0.0D+0
481.GE.
IF ( NPARAMSLA_LINRX_ITHRESH_I ) THEN
482.LT.
IF ( PARAMS(LA_LINRX_ITHRESH_I )0.0D+0 ) THEN
483 PARAMS( LA_LINRX_ITHRESH_I ) = ITHRESH
485 ITHRESH = INT( PARAMS( LA_LINRX_ITHRESH_I ) )
488.GE.
IF ( NPARAMSLA_LINRX_CWISE_I ) THEN
489.LT.
IF ( PARAMS(LA_LINRX_CWISE_I )0.0D+0 ) THEN
490 IF ( IGNORE_CWISE ) THEN
491 PARAMS( LA_LINRX_CWISE_I ) = 0.0D+0
493 PARAMS( LA_LINRX_CWISE_I ) = 1.0D+0
496.EQ.
IGNORE_CWISE = PARAMS( LA_LINRX_CWISE_I ) 0.0D+0
499.EQ..OR..EQ.
IF ( REF_TYPE 0 N_ERR_BNDS 0 ) THEN
501 ELSE IF ( IGNORE_CWISE ) THEN
507 RCEQU = LSAME( EQUED, 'y
' )
511.NOT.
IF (LSAME( UPLO, 'u.AND..NOT.
' ) LSAME( UPLO, 'l
' ) ) THEN
513.NOT..AND..NOT.
ELSE IF( RCEQU LSAME( EQUED, 'n
' ) ) THEN
515.LT.
ELSE IF( N0 ) THEN
517.LT.
ELSE IF( NRHS0 ) THEN
519.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
521.LT.
ELSE IF( LDAFMAX( 1, N ) ) THEN
523.LT.
ELSE IF( LDBMAX( 1, N ) ) THEN
525.LT.
ELSE IF( LDXMAX( 1, N ) ) THEN
529 CALL XERBLA( 'zporfsx', -INFO )
535.EQ..OR..EQ.
IF( N0 NRHS0 ) THEN
539.GE.
IF ( N_ERR_BNDS 1 ) THEN
540 ERR_BNDS_NORM( J, LA_LINRX_TRUST_I ) = 1.0D+0
541 ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 1.0D+0
543.GE.
IF ( N_ERR_BNDS 2 ) THEN
544 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = 0.0D+0
545 ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 0.0D+0
547.GE.
IF ( N_ERR_BNDS 3 ) THEN
548 ERR_BNDS_NORM( J, LA_LINRX_RCOND_I ) = 1.0D+0
549 ERR_BNDS_COMP( J, LA_LINRX_RCOND_I ) = 1.0D+0
560.GE.
IF ( N_ERR_BNDS 1 ) THEN
561 ERR_BNDS_NORM( J, LA_LINRX_TRUST_I ) = 1.0D+0
562 ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 1.0D+0
564.GE.
IF ( N_ERR_BNDS 2 ) THEN
565 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = 1.0D+0
566 ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 1.0D+0
568.GE.
IF ( N_ERR_BNDS 3 ) THEN
569 ERR_BNDS_NORM( J, LA_LINRX_RCOND_I ) = 0.0D+0
570 ERR_BNDS_COMP( J, LA_LINRX_RCOND_I ) = 0.0D+0
578 ANORM = ZLANHE( NORM, UPLO, N, A, LDA, RWORK )
579 CALL ZPOCON( UPLO, N, AF, LDAF, ANORM, RCOND, WORK, RWORK,
584.NE.
IF ( REF_TYPE 0 ) THEN
586 PREC_TYPE = ILAPREC( 'e
' )
588 CALL ZLA_PORFSX_EXTENDED( PREC_TYPE, UPLO, N,
589 $ NRHS, A, LDA, AF, LDAF, RCEQU, S, B,
590 $ LDB, X, LDX, BERR, N_NORMS, ERR_BNDS_NORM, ERR_BNDS_COMP,
591 $ WORK, RWORK, WORK(N+1),
592 $ TRANSFER (RWORK(1:2*N), (/ (ZERO, ZERO) /), N), RCOND,
593 $ ITHRESH, RTHRESH, UNSTABLE_THRESH, IGNORE_CWISE,
597 ERR_LBND = MAX( 10.0D+0, SQRT( DBLE( N ) ) ) * DLAMCH( 'epsilon
' )
598.GE..AND..GE.
IF ( N_ERR_BNDS 1 N_NORMS 1 ) THEN
603 RCOND_TMP = ZLA_PORCOND_C( UPLO, N, A, LDA, AF, LDAF,
604 $ S, .TRUE., INFO, WORK, RWORK )
606 RCOND_TMP = ZLA_PORCOND_C( UPLO, N, A, LDA, AF, LDAF,
607 $ S, .FALSE., INFO, WORK, RWORK )
613.GE.
IF ( N_ERR_BNDS LA_LINRX_ERR_I
614.AND..GT.
$ ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) 1.0D+0 )
615 $ ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = 1.0D+0
619.LT.
IF ( RCOND_TMP ILLRCOND_THRESH ) THEN
620 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = 1.0D+0
621 ERR_BNDS_NORM( J, LA_LINRX_TRUST_I ) = 0.0D+0
622.LE.
IF ( INFO N ) INFO = N + J
623.LT.
ELSE IF ( ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) ERR_LBND )
625 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) = ERR_LBND
626 ERR_BNDS_NORM( J, LA_LINRX_TRUST_I ) = 1.0D+0
631.GE.
IF ( N_ERR_BNDS LA_LINRX_RCOND_I ) THEN
632 ERR_BNDS_NORM( J, LA_LINRX_RCOND_I ) = RCOND_TMP
638.GE..AND..GE.
IF (N_ERR_BNDS 1 N_NORMS 2) THEN
648 CWISE_WRONG = SQRT( DLAMCH( 'epsilon
' ) )
650.LT.
IF (ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) CWISE_WRONG )
652 RCOND_TMP = ZLA_PORCOND_X( UPLO, N, A, LDA, AF, LDAF,
653 $ X(1,J), INFO, WORK, RWORK )
660.GE.
IF ( N_ERR_BNDS LA_LINRX_ERR_I
661.AND..GT.
$ ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) 1.0D+0 )
662 $ ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 1.0D+0
666.LT.
IF (RCOND_TMP ILLRCOND_THRESH) THEN
667 ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = 1.0D+0
668 ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 0.0D+0
669.EQ.
IF ( PARAMS( LA_LINRX_CWISE_I ) 1.0D+0
670.AND..LT.
$ INFON + J ) INFO = N + J
671 ELSE IF ( ERR_BNDS_COMP( J, LA_LINRX_ERR_I )
672.LT.
$ ERR_LBND ) THEN
673 ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) = ERR_LBND
674 ERR_BNDS_COMP( J, LA_LINRX_TRUST_I ) = 1.0D+0
679.GE.
IF ( N_ERR_BNDS LA_LINRX_RCOND_I ) THEN
680 ERR_BNDS_COMP( J, LA_LINRX_RCOND_I ) = RCOND_TMP
integer function ilaprec(prec)
ILAPREC
subroutine xerbla(srname, info)
XERBLA
logical function lsame(ca, cb)
LSAME
double precision function zlanhe(norm, uplo, n, a, lda, work)
ZLANHE returns the value of the 1-norm, or the Frobenius norm, or the infinity norm,...
subroutine zporfsx(uplo, equed, n, nrhs, a, lda, af, ldaf, s, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info)
ZPORFSX
subroutine zla_porfsx_extended(prec_type, uplo, n, nrhs, a, lda, af, ldaf, colequ, c, b, ldb, y, ldy, berr_out, n_norms, err_bnds_norm, err_bnds_comp, res, ayb, dy, y_tail, rcond, ithresh, rthresh, dz_ub, ignore_cwise, info)
ZLA_PORFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric or H...
double precision function zla_porcond_c(uplo, n, a, lda, af, ldaf, c, capply, info, work, rwork)
ZLA_PORCOND_C computes the infinity norm condition number of op(A)*inv(diag(c)) for Hermitian positiv...
subroutine zpocon(uplo, n, a, lda, anorm, rcond, work, rwork, info)
ZPOCON
double precision function zla_porcond_x(uplo, n, a, lda, af, ldaf, x, info, work, rwork)
ZLA_PORCOND_X computes the infinity norm condition number of op(A)*diag(x) for Hermitian positive-def...
double precision function dlamch(cmach)
DLAMCH