406 $ NRHS, AB, LDAB, AFB, LDAFB, IPIV,
407 $ COLEQU, C, B, LDB, Y, LDY,
408 $ BERR_OUT, N_NORMS, ERR_BNDS_NORM,
409 $ ERR_BNDS_COMP, RES, AYB, DY,
410 $ Y_TAIL, RCOND, ITHRESH, RTHRESH,
411 $ DZ_UB, IGNORE_CWISE, INFO )
419 INTEGER INFO, LDAB, LDAFB, LDB, LDY, N, KL, KU, NRHS,
420 $ prec_type, trans_type, n_norms, ithresh
421 LOGICAL COLEQU, IGNORE_CWISE
422 DOUBLE PRECISION RTHRESH, DZ_UB
426 COMPLEX*16 AB( ldab, * ), AFB( ldafb, * ), B( ldb, * ),
427 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
428 DOUBLE PRECISION C( * ), AYB(*), RCOND, BERR_OUT( * ),
429 $ err_bnds_norm( nrhs, * ),
430 $ err_bnds_comp( nrhs, * )
437 INTEGER CNT, I, J, M, X_STATE, Z_STATE, Y_PREC_STATE
438 DOUBLE PRECISION YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
439 $ dzrat, prevnormdx, prev_dz_z, dxratmax,
440 $ dzratmax, dx_x, dz_z, final_dx_x, final_dz_z,
441 $ eps, hugeval, incr_thresh
446 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
447 $ noprog_state, base_residual, extra_residual,
449 parameter( unstable_state = 0, working_state = 1,
450 $ conv_state = 2, noprog_state = 3 )
451 parameter( base_residual = 0, extra_residual = 1,
453 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
454 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
455 INTEGER CMP_ERR_I, PIV_GROWTH_I
456 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
458 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
459 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
461 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
463 parameter( la_linrx_itref_i = 1,
464 $ la_linrx_ithresh_i = 2 )
465 parameter( la_linrx_cwise_i = 3 )
466 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
468 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
469 parameter( la_linrx_rcond_i = 3 )
475 DOUBLE PRECISION DLAMCH
476 CHARACTER CHLA_TRANSTYPE
479 INTRINSIC abs, max, min
482 DOUBLE PRECISION CABS1
485 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
489 IF (info.NE.0)
RETURN 490 trans = chla_transtype(trans_type)
491 eps = dlamch(
'Epsilon' )
492 hugeval = dlamch(
'Overflow' )
494 hugeval = hugeval * hugeval
496 incr_thresh = dble( n ) * eps
500 y_prec_state = extra_residual
501 IF ( y_prec_state .EQ. extra_y )
THEN 518 x_state = working_state
519 z_state = unstable_state
527 CALL zcopy( n, b( 1, j ), 1, res, 1 )
528 IF ( y_prec_state .EQ. base_residual )
THEN 529 CALL zgbmv( trans, m, n, kl, ku, (-1.0d+0,0.0d+0), ab,
530 $ ldab, y( 1, j ), 1, (1.0d+0,0.0d+0), res, 1 )
531 ELSE IF ( y_prec_state .EQ. extra_residual )
THEN 532 CALL blas_zgbmv_x( trans_type, n, n, kl, ku,
533 $ (-1.0d+0,0.0d+0), ab, ldab, y( 1, j ), 1,
534 $ (1.0d+0,0.0d+0), res, 1, prec_type )
536 CALL blas_zgbmv2_x( trans_type, n, n, kl, ku,
537 $ (-1.0d+0,0.0d+0), ab, ldab, y( 1, j ), y_tail, 1,
538 $ (1.0d+0,0.0d+0), res, 1, prec_type )
542 CALL zcopy( n, res, 1, dy, 1 )
543 CALL zgbtrs( trans, n, kl, ku, 1, afb, ldafb, ipiv, dy, n,
555 yk = cabs1( y( i, j ) )
556 dyk = cabs1( dy( i ) )
558 IF (yk .NE. 0.0d+0)
THEN 559 dz_z = max( dz_z, dyk / yk )
560 ELSE IF ( dyk .NE. 0.0d+0 )
THEN 564 ymin = min( ymin, yk )
566 normy = max( normy, yk )
569 normx = max( normx, yk * c( i ) )
570 normdx = max(normdx, dyk * c(i))
573 normdx = max( normdx, dyk )
577 IF ( normx .NE. 0.0d+0 )
THEN 578 dx_x = normdx / normx
579 ELSE IF ( normdx .EQ. 0.0d+0 )
THEN 585 dxrat = normdx / prevnormdx
586 dzrat = dz_z / prev_dz_z
590 IF (.NOT.ignore_cwise
591 $ .AND. ymin*rcond .LT. incr_thresh*normy
592 $ .AND. y_prec_state .LT. extra_y )
595 IF ( x_state .EQ. noprog_state .AND. dxrat .LE. rthresh )
596 $ x_state = working_state
597 IF ( x_state .EQ. working_state )
THEN 598 IF ( dx_x .LE. eps )
THEN 600 ELSE IF ( dxrat .GT. rthresh )
THEN 601 IF ( y_prec_state .NE. extra_y )
THEN 604 x_state = noprog_state
607 IF ( dxrat .GT. dxratmax ) dxratmax = dxrat
609 IF ( x_state .GT. working_state ) final_dx_x = dx_x
612 IF ( z_state .EQ. unstable_state .AND. dz_z .LE. dz_ub )
613 $ z_state = working_state
614 IF ( z_state .EQ. noprog_state .AND. dzrat .LE. rthresh )
615 $ z_state = working_state
616 IF ( z_state .EQ. working_state )
THEN 617 IF ( dz_z .LE. eps )
THEN 619 ELSE IF ( dz_z .GT. dz_ub )
THEN 620 z_state = unstable_state
623 ELSE IF ( dzrat .GT. rthresh )
THEN 624 IF ( y_prec_state .NE. extra_y )
THEN 627 z_state = noprog_state
630 IF ( dzrat .GT. dzratmax ) dzratmax = dzrat
632 IF ( z_state .GT. working_state ) final_dz_z = dz_z
639 IF ( x_state.NE.working_state )
THEN 640 IF ( ignore_cwise )
GOTO 666
641 IF ( z_state.EQ.noprog_state .OR. z_state.EQ.conv_state )
643 IF ( z_state.EQ.unstable_state .AND. cnt.GT.1 )
GOTO 666
646 IF ( incr_prec )
THEN 648 y_prec_state = y_prec_state + 1
659 IF ( y_prec_state .LT. extra_y )
THEN 660 CALL zaxpy( n, (1.0d+0,0.0d+0), dy, 1, y(1,j), 1 )
671 IF ( x_state .EQ. working_state ) final_dx_x = dx_x
672 IF ( z_state .EQ. working_state ) final_dz_z = dz_z
676 IF ( n_norms .GE. 1 )
THEN 677 err_bnds_norm( j, la_linrx_err_i ) =
678 $ final_dx_x / (1 - dxratmax)
680 IF ( n_norms .GE. 2 )
THEN 681 err_bnds_comp( j, la_linrx_err_i ) =
682 $ final_dz_z / (1 - dzratmax)
693 CALL zcopy( n, b( 1, j ), 1, res, 1 )
694 CALL zgbmv( trans, n, n, kl, ku, (-1.0d+0,0.0d+0), ab, ldab,
695 $ y(1,j), 1, (1.0d+0,0.0d+0), res, 1 )
698 ayb( i ) = cabs1( b( i, j ) )
703 CALL zla_gbamv( trans_type, n, n, kl, ku, 1.0d+0,
704 $ ab, ldab, y(1, j), 1, 1.0d+0, ayb, 1 )
double precision function dlamch(CMACH)
DLAMCH
subroutine zgbtrs(TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO)
ZGBTRS
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zgbmv(TRANS, M, N, KL, KU, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGBMV
subroutine zla_lin_berr(N, NZ, NRHS, RES, AYB, BERR)
ZLA_LIN_BERR computes a component-wise relative backward error.
subroutine zla_gbamv(TRANS, M, N, KL, KU, ALPHA, AB, LDAB, X, INCX, BETA, Y, INCY)
ZLA_GBAMV performs a matrix-vector operation to calculate error bounds.
subroutine zla_wwaddw(N, X, Y, W)
ZLA_WWADDW adds a vector into a doubled-single vector.
subroutine zla_gbrfsx_extended(PREC_TYPE, TRANS_TYPE, N, KL, KU, NRHS, AB, LDAB, AFB, LDAFB, 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_GBRFSX_EXTENDED improves the computed solution to a system of linear equations for general banded...
character *1 function chla_transtype(TRANS)
CHLA_TRANSTYPE
subroutine zaxpy(N, ZA, ZX, INCX, ZY, INCY)
ZAXPY