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
426 COMPLEX AB( ldab, * ), AFB( ldafb, * ), B( ldb, * ),
427 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
428 REAL 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 REAL 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 )
476 CHARACTER CHLA_TRANSTYPE
479 INTRINSIC abs, max, min
485 cabs1( zdum ) = abs(
REAL( ZDUM ) ) + abs( AIMAG( zdum ) )
489 IF (info.NE.0)
RETURN 490 trans = chla_transtype(trans_type)
491 eps = slamch(
'Epsilon' )
492 hugeval = slamch(
'Overflow' )
494 hugeval = hugeval * hugeval
496 incr_thresh =
REAL( 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 ccopy( n, b( 1, j ), 1, res, 1 )
528 IF ( y_prec_state .EQ. base_residual )
THEN 529 CALL cgbmv( trans, m, n, kl, ku, (-1.0e+0,0.0e+0), ab,
530 $ ldab, y( 1, j ), 1, (1.0e+0,0.0e+0), res, 1 )
531 ELSE IF ( y_prec_state .EQ. extra_residual )
THEN 532 CALL blas_cgbmv_x( trans_type, n, n, kl, ku,
533 $ (-1.0e+0,0.0e+0), ab, ldab, y( 1, j ), 1,
534 $ (1.0e+0,0.0e+0), res, 1, prec_type )
536 CALL blas_cgbmv2_x( trans_type, n, n, kl, ku,
537 $ (-1.0e+0,0.0e+0), ab, ldab, y( 1, j ), y_tail, 1,
538 $ (1.0e+0,0.0e+0), res, 1, prec_type )
542 CALL ccopy( n, res, 1, dy, 1 )
543 CALL cgbtrs( 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.0)
THEN 559 dz_z = max( dz_z, dyk / yk )
560 ELSE IF ( dyk .NE. 0.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.0 )
THEN 578 dx_x = normdx / normx
579 ELSE IF ( normdx .EQ. 0.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 caxpy( n, (1.0e+0,0.0e+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 ccopy( n, b( 1, j ), 1, res, 1 )
694 CALL cgbmv( trans, n, n, kl, ku, (-1.0e+0,0.0e+0), ab, ldab,
695 $ y(1,j), 1, (1.0e+0,0.0e+0), res, 1 )
698 ayb( i ) = cabs1( b( i, j ) )
703 CALL cla_gbamv( trans_type, n, n, kl, ku, 1.0e+0,
704 $ ab, ldab, y(1, j), 1, 1.0e+0, ayb, 1 )
subroutine cla_wwaddw(N, X, Y, W)
CLA_WWADDW adds a vector into a doubled-single vector.
subroutine cla_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)
CLA_GBRFSX_EXTENDED improves the computed solution to a system of linear equations for general banded...
subroutine cgbtrs(TRANS, N, KL, KU, NRHS, AB, LDAB, IPIV, B, LDB, INFO)
CGBTRS
subroutine cgbmv(TRANS, M, N, KL, KU, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CGBMV
subroutine cla_lin_berr(N, NZ, NRHS, RES, AYB, BERR)
CLA_LIN_BERR computes a component-wise relative backward error.
subroutine cla_gbamv(TRANS, M, N, KL, KU, ALPHA, AB, LDAB, X, INCX, BETA, Y, INCY)
CLA_GBAMV performs a matrix-vector operation to calculate error bounds.
real function slamch(CMACH)
SLAMCH
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine caxpy(N, CA, CX, INCX, CY, INCY)
CAXPY
character *1 function chla_transtype(TRANS)
CHLA_TRANSTYPE