389 $ AF, LDAF, IPIV, COLEQU, C, B, LDB,
390 $ Y, LDY, BERR_OUT, N_NORMS,
391 $ ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
392 $ AYB, DY, Y_TAIL, RCOND, ITHRESH,
393 $ RTHRESH, DZ_UB, IGNORE_CWISE,
401 INTEGER INFO, LDA, LDAF, LDB, LDY, N, NRHS, PREC_TYPE,
404 LOGICAL COLEQU, IGNORE_CWISE
405 DOUBLE PRECISION RTHRESH, DZ_UB
409 COMPLEX*16 A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
410 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
411 DOUBLE PRECISION C( * ), AYB( * ), RCOND, BERR_OUT( * ),
412 $ ERR_BNDS_NORM( NRHS, * ),
413 $ ERR_BNDS_COMP( NRHS, * )
419 INTEGER UPLO2, CNT, I, J, X_STATE, Z_STATE,
421 DOUBLE PRECISION YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
422 $ DZRAT, PREVNORMDX, PREV_DZ_Z, DXRATMAX,
423 $ DZRATMAX, DX_X, DZ_Z, FINAL_DX_X, FINAL_DZ_Z,
424 $ EPS, HUGEVAL, INCR_THRESH
425 LOGICAL INCR_PREC, UPPER
429 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
430 $ NOPROG_STATE, BASE_RESIDUAL, EXTRA_RESIDUAL,
432 parameter( unstable_state = 0, working_state = 1,
433 $ conv_state = 2, noprog_state = 3 )
434 parameter( base_residual = 0, extra_residual = 1,
436 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
437 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
438 INTEGER CMP_ERR_I, PIV_GROWTH_I
439 PARAMETER ( FINAL_NRM_ERR_I = 1, final_cmp_err_i = 2,
441 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
442 parameter( cmp_rcond_i = 7
444 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
446 parameter( la_linrx_itref_i = 1,
447 $ la_linrx_ithresh_i = 2 )
448 parameter( la_linrx_cwise_i = 3 )
449 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
451 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
452 parameter( la_linrx_rcond_i = 3 )
463 DOUBLE PRECISION DLAMCH
466 INTRINSIC abs, dble, dimag,
max,
min
469 DOUBLE PRECISION CABS1
472 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
477 upper = lsame( uplo,
'U' )
478 IF( .NOT.upper .AND. .NOT.lsame( uplo, 'l
' ) ) THEN
480.LT.
ELSE IF( N0 ) THEN
482.LT.
ELSE IF( NRHS0 ) THEN
484.LT.
ELSE IF( LDAMAX( 1, N ) ) THEN
486.LT.
ELSE IF( LDAFMAX( 1, N ) ) THEN
488.LT.
ELSE IF( LDBMAX( 1, N ) ) THEN
490.LT.
ELSE IF( LDYMAX( 1, N ) ) THEN
497 EPS = DLAMCH( 'epsilon
' )
498 HUGEVAL = DLAMCH( 'overflow
' )
500 HUGEVAL = HUGEVAL * HUGEVAL
502 INCR_THRESH = DBLE( N ) * EPS
504 IF ( LSAME ( UPLO, 'l
' ) ) THEN
505 UPLO2 = ILAUPLO( 'l
' )
507 UPLO2 = ILAUPLO( 'u
' )
511 Y_PREC_STATE = EXTRA_RESIDUAL
512.EQ.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
529 X_STATE = WORKING_STATE
530 Z_STATE = UNSTABLE_STATE
538 CALL ZCOPY( N, B( 1, J ), 1, RES, 1 )
539.EQ.
IF ( Y_PREC_STATE BASE_RESIDUAL ) THEN
540 CALL ZHEMV( UPLO, N, DCMPLX(-1.0D+0), A, LDA, Y( 1, J ),
541 $ 1, DCMPLX(1.0D+0), RES, 1 )
542.EQ.
ELSE IF ( Y_PREC_STATE EXTRA_RESIDUAL ) THEN
543 CALL BLAS_ZHEMV_X( UPLO2, N, DCMPLX(-1.0D+0), A, LDA,
544 $ Y( 1, J ), 1, DCMPLX(1.0D+0), RES, 1, PREC_TYPE)
546 CALL BLAS_ZHEMV2_X(UPLO2, N, DCMPLX(-1.0D+0), A, LDA,
547 $ Y(1, J), Y_TAIL, 1, DCMPLX(1.0D+0), RES, 1,
551! XXX: RES is no longer needed.
552 CALL ZCOPY( N, RES, 1, DY, 1 )
553 CALL ZHETRS( UPLO, N, 1, AF, LDAF, IPIV, DY, N, INFO )
564 YK = CABS1( Y( I, J ) )
565 DYK = CABS1( DY( I ) )
567.NE.
IF (YK 0.0D+0) THEN
568 DZ_Z = MAX( DZ_Z, DYK / YK )
569.NE.
ELSE IF ( DYK 0.0D+0 ) THEN
573 YMIN = MIN( YMIN, YK )
575 NORMY = MAX( NORMY, YK )
578 NORMX = MAX( NORMX, YK * C( I ) )
579 NORMDX = MAX( NORMDX, DYK * C( I ) )
582 NORMDX = MAX( NORMDX, DYK )
586.NE.
IF ( NORMX 0.0D+0 ) THEN
587 DX_X = NORMDX / NORMX
588.EQ.
ELSE IF ( NORMDX 0.0D+0 ) THEN
594 DXRAT = NORMDX / PREVNORMDX
595 DZRAT = DZ_Z / PREV_DZ_Z
599.LT.
IF ( YMIN*RCOND INCR_THRESH*NORMY
600.AND..LT.
$ Y_PREC_STATE EXTRA_Y )
603.EQ..AND..LE.
IF ( X_STATE NOPROG_STATE DXRAT RTHRESH )
604 $ X_STATE = WORKING_STATE
605.EQ.
IF ( X_STATE WORKING_STATE ) THEN
606.LE.
IF ( DX_X EPS ) THEN
608.GT.
ELSE IF ( DXRAT RTHRESH ) THEN
609.NE.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
612 X_STATE = NOPROG_STATE
615.GT.
IF (DXRAT DXRATMAX) DXRATMAX = DXRAT
617.GT.
IF ( X_STATE WORKING_STATE ) FINAL_DX_X = DX_X
620.EQ..AND..LE.
IF ( Z_STATE UNSTABLE_STATE DZ_Z DZ_UB )
621 $ Z_STATE = WORKING_STATE
622.EQ..AND..LE.
IF ( Z_STATE NOPROG_STATE DZRAT RTHRESH )
623 $ Z_STATE = WORKING_STATE
624.EQ.
IF ( Z_STATE WORKING_STATE ) THEN
625.LE.
IF ( DZ_Z EPS ) THEN
627.GT.
ELSE IF ( DZ_Z DZ_UB ) THEN
628 Z_STATE = UNSTABLE_STATE
631.GT.
ELSE IF ( DZRAT RTHRESH ) THEN
632.NE.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
635 Z_STATE = NOPROG_STATE
638.GT.
IF ( DZRAT DZRATMAX ) DZRATMAX = DZRAT
640.GT.
IF ( Z_STATE WORKING_STATE ) FINAL_DZ_Z = DZ_Z
643.NE..AND.
IF ( X_STATEWORKING_STATE
644.OR..NE.
$ ( IGNORE_CWISEZ_STATEWORKING_STATE ) )
647 IF ( INCR_PREC ) THEN
649 Y_PREC_STATE = Y_PREC_STATE + 1
660.LT.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
661 CALL ZAXPY( N, DCMPLX(1.0D+0), DY, 1, Y(1,J), 1 )
663 CALL ZLA_WWADDW( N, Y(1,J), Y_TAIL, DY )
672.EQ.
IF ( X_STATE WORKING_STATE ) FINAL_DX_X = DX_X
673.EQ.
IF ( Z_STATE WORKING_STATE ) FINAL_DZ_Z = DZ_Z
677.GE.
IF ( N_NORMS 1 ) THEN
678 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
679 $ FINAL_DX_X / (1 - DXRATMAX)
681.GE.
IF (N_NORMS 2) THEN
682 ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
683 $ FINAL_DZ_Z / (1 - DZRATMAX)
694 CALL ZCOPY( N, B( 1, J ), 1, RES, 1 )
695 CALL ZHEMV( UPLO, N, DCMPLX(-1.0D+0), A, LDA, Y(1,J), 1,
696 $ DCMPLX(1.0D+0), RES, 1 )
699 AYB( I ) = CABS1( B( I, J ) )
704 CALL ZLA_HEAMV( UPLO2, N, 1.0D+0,
705 $ A, LDA, Y(1, J), 1, 1.0D+0, AYB, 1 )
707 CALL ZLA_LIN_BERR( N, N, 1, RES, AYB, BERR_OUT( J ) )
subroutine zla_herfsx_extended(prec_type, uplo, n, nrhs, a, lda, af, ldaf, ipiv, 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_HERFSX_EXTENDED improves the computed solution to a system of linear equations for Hermitian inde...