391 $ AF, LDAF, IPIV, COLEQU, C, B, LDB,
392 $ Y, LDY, BERR_OUT, N_NORMS,
393 $ ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
394 $ AYB, DY, Y_TAIL, RCOND, ITHRESH,
395 $ RTHRESH, DZ_UB, IGNORE_CWISE,
404 INTEGER INFO, LDA, LDAF, LDB, LDY, N, NRHS, PREC_TYPE,
407 LOGICAL COLEQU, IGNORE_CWISE
412 COMPLEX A( lda, * ), AF( ldaf, * ), B( ldb, * ),
413 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
414 REAL C( * ), AYB( * ), RCOND, BERR_OUT( * ),
415 $ err_bnds_norm( nrhs, * ),
416 $ err_bnds_comp( nrhs, * )
422 INTEGER UPLO2, CNT, I, J, X_STATE, Z_STATE,
424 REAL YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
425 $ dzrat, prevnormdx, prev_dz_z, dxratmax,
426 $ dzratmax, dx_x, dz_z, final_dx_x, final_dz_z,
427 $ eps, hugeval, incr_thresh
428 LOGICAL INCR_PREC, UPPER
432 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
433 $ noprog_state, base_residual, extra_residual,
435 parameter( unstable_state = 0, working_state = 1,
436 $ conv_state = 2, noprog_state = 3 )
437 parameter( base_residual = 0, extra_residual = 1,
439 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
440 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
441 INTEGER CMP_ERR_I, PIV_GROWTH_I
442 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
444 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
445 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
447 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
449 parameter( la_linrx_itref_i = 1,
450 $ la_linrx_ithresh_i = 2 )
451 parameter( la_linrx_cwise_i = 3 )
452 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
454 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
455 parameter( la_linrx_rcond_i = 3 )
469 INTRINSIC abs,
REAL, AIMAG, MAX, MIN
475 cabs1( zdum ) = abs(
REAL( ZDUM ) ) + abs( AIMAG( zdum ) )
480 upper = lsame( uplo,
'U' )
481 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN 483 ELSE IF( n.LT.0 )
THEN 485 ELSE IF( nrhs.LT.0 )
THEN 487 ELSE IF( lda.LT.max( 1, n ) )
THEN 489 ELSE IF( ldaf.LT.max( 1, n ) )
THEN 491 ELSE IF( ldb.LT.max( 1, n ) )
THEN 493 ELSE IF( ldy.LT.max( 1, n ) )
THEN 497 CALL xerbla(
'CLA_HERFSX_EXTENDED', -info )
500 eps = slamch(
'Epsilon' )
501 hugeval = slamch(
'Overflow' )
503 hugeval = hugeval * hugeval
505 incr_thresh =
REAL( N ) * EPS
507 IF ( lsame( uplo,
'L' ) )
THEN 508 uplo2 = ilauplo(
'L' )
510 uplo2 = ilauplo(
'U' )
514 y_prec_state = extra_residual
515 IF ( y_prec_state .EQ. extra_y )
THEN 532 x_state = working_state
533 z_state = unstable_state
541 CALL ccopy( n, b( 1, j ), 1, res, 1 )
542 IF ( y_prec_state .EQ. base_residual )
THEN 543 CALL chemv( uplo, n, cmplx(-1.0), a, lda, y( 1, j ), 1,
544 $ cmplx(1.0), res, 1 )
545 ELSE IF ( y_prec_state .EQ. extra_residual )
THEN 546 CALL blas_chemv_x( uplo2, n, cmplx(-1.0), a, lda,
547 $ y( 1, j ), 1, cmplx(1.0), res, 1, prec_type)
549 CALL blas_chemv2_x(uplo2, n, cmplx(-1.0), a, lda,
550 $ y(1, j), y_tail, 1, cmplx(1.0), res, 1, prec_type)
554 CALL ccopy( n, res, 1, dy, 1 )
555 CALL chetrs( uplo, n, 1, af, ldaf, ipiv, dy, n, info )
566 yk = cabs1( y( i, j ) )
567 dyk = cabs1( dy( i ) )
569 IF (yk .NE. 0.0)
THEN 570 dz_z = max( dz_z, dyk / yk )
571 ELSE IF ( dyk .NE. 0.0 )
THEN 575 ymin = min( ymin, yk )
577 normy = max( normy, yk )
580 normx = max( normx, yk * c( i ) )
581 normdx = max( normdx, dyk * c( i ) )
584 normdx = max( normdx, dyk )
588 IF ( normx .NE. 0.0 )
THEN 589 dx_x = normdx / normx
590 ELSE IF ( normdx .EQ. 0.0 )
THEN 596 dxrat = normdx / prevnormdx
597 dzrat = dz_z / prev_dz_z
601 IF ( ymin*rcond .LT. incr_thresh*normy
602 $ .AND. y_prec_state .LT. extra_y )
605 IF ( x_state .EQ. noprog_state .AND. dxrat .LE. rthresh )
606 $ x_state = working_state
607 IF ( x_state .EQ. working_state )
THEN 608 IF ( dx_x .LE. eps )
THEN 610 ELSE IF ( dxrat .GT. rthresh )
THEN 611 IF ( y_prec_state .NE. extra_y )
THEN 614 x_state = noprog_state
617 IF (dxrat .GT. dxratmax) dxratmax = dxrat
619 IF ( x_state .GT. working_state ) final_dx_x = dx_x
622 IF ( z_state .EQ. unstable_state .AND. dz_z .LE. dz_ub )
623 $ z_state = working_state
624 IF ( z_state .EQ. noprog_state .AND. dzrat .LE. rthresh )
625 $ z_state = working_state
626 IF ( z_state .EQ. working_state )
THEN 627 IF ( dz_z .LE. eps )
THEN 629 ELSE IF ( dz_z .GT. dz_ub )
THEN 630 z_state = unstable_state
633 ELSE IF ( dzrat .GT. rthresh )
THEN 634 IF ( y_prec_state .NE. extra_y )
THEN 637 z_state = noprog_state
640 IF ( dzrat .GT. dzratmax ) dzratmax = dzrat
642 IF ( z_state .GT. working_state ) final_dz_z = dz_z
645 IF ( x_state.NE.working_state.AND.
646 $ ( ignore_cwise.OR.z_state.NE.working_state ) )
649 IF ( incr_prec )
THEN 651 y_prec_state = y_prec_state + 1
662 IF ( y_prec_state .LT. extra_y )
THEN 663 CALL caxpy( n, cmplx(1.0), dy, 1, y(1,j), 1 )
674 IF ( x_state .EQ. working_state ) final_dx_x = dx_x
675 IF ( z_state .EQ. working_state ) final_dz_z = dz_z
679 IF ( n_norms .GE. 1 )
THEN 680 err_bnds_norm( j, la_linrx_err_i ) =
681 $ final_dx_x / (1 - dxratmax)
683 IF (n_norms .GE. 2)
THEN 684 err_bnds_comp( j, la_linrx_err_i ) =
685 $ final_dz_z / (1 - dzratmax)
696 CALL ccopy( n, b( 1, j ), 1, res, 1 )
697 CALL chemv( uplo, n, cmplx(-1.0), a, lda, y(1,j), 1,
698 $ cmplx(1.0), res, 1 )
701 ayb( i ) = cabs1( b( i, j ) )
707 $ a, lda, y(1, j), 1, 1.0, ayb, 1 )
subroutine cla_heamv(UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CLA_HEAMV computes a matrix-vector product using a Hermitian indefinite matrix to calculate error bou...
subroutine cla_wwaddw(N, X, Y, W)
CLA_WWADDW adds a vector into a doubled-single vector.
subroutine cla_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)
CLA_HERFSX_EXTENDED improves the computed solution to a system of linear equations for Hermitian inde...
subroutine cla_lin_berr(N, NZ, NRHS, RES, AYB, BERR)
CLA_LIN_BERR computes a component-wise relative backward error.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine chemv(UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CHEMV
integer function ilauplo(UPLO)
ILAUPLO
subroutine chetrs(UPLO, N, NRHS, A, LDA, IPIV, B, LDB, INFO)
CHETRS
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine caxpy(N, CA, CX, INCX, CY, INCY)
CAXPY