393 $ LDA, AF, LDAF, IPIV, COLEQU, C, B,
394 $ LDB, Y, LDY, BERR_OUT, N_NORMS,
395 $ ERRS_N, ERRS_C, RES, AYB, DY,
396 $ Y_TAIL, RCOND, ITHRESH, RTHRESH,
397 $ DZ_UB, IGNORE_CWISE, INFO )
405 INTEGER INFO, LDA, LDAF, LDB, LDY, N, NRHS, PREC_TYPE,
406 $ trans_type, n_norms
407 LOGICAL COLEQU, IGNORE_CWISE
409 DOUBLE PRECISION RTHRESH, DZ_UB
413 COMPLEX*16 A( lda, * ), AF( ldaf, * ), B( ldb, * ),
414 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
415 DOUBLE PRECISION C( * ), AYB( * ), RCOND, BERR_OUT( * ),
416 $ errs_n( nrhs, * ), errs_c( nrhs, * )
423 INTEGER CNT, I, J, X_STATE, Z_STATE, Y_PREC_STATE
424 DOUBLE PRECISION 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
432 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
433 $ noprog_state, base_residual, extra_residual,
435 parameter( unstable_state = 0, working_state = 1,
438 parameter( base_residual = 0, extra_residual = 1,
440 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
441 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
442 INTEGER CMP_ERR_I, PIV_GROWTH_I
443 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
445 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
446 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
448 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
450 parameter( la_linrx_itref_i = 1,
451 $ la_linrx_ithresh_i = 2 )
452 parameter( la_linrx_cwise_i = 3 )
453 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
455 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
456 parameter( la_linrx_rcond_i = 3 )
462 DOUBLE PRECISION DLAMCH
463 CHARACTER CHLA_TRANSTYPE
466 INTRINSIC abs, max, min
469 DOUBLE PRECISION CABS1
472 cabs1( zdum ) = abs( dble( zdum ) ) + abs( dimag( zdum ) )
476 IF ( info.NE.0 )
RETURN 477 trans = chla_transtype(trans_type)
478 eps = dlamch(
'Epsilon' )
479 hugeval = dlamch(
'Overflow' )
481 hugeval = hugeval * hugeval
483 incr_thresh = dble( n ) * eps
486 y_prec_state = extra_residual
487 IF ( y_prec_state .EQ. extra_y )
THEN 504 x_state = working_state
505 z_state = unstable_state
513 CALL zcopy( n, b( 1, j ), 1, res, 1 )
514 IF ( y_prec_state .EQ. base_residual )
THEN 515 CALL zgemv( trans, n, n, (-1.0d+0,0.0d+0), a, lda,
516 $ y( 1, j ), 1, (1.0d+0,0.0d+0), res, 1)
517 ELSE IF (y_prec_state .EQ. extra_residual)
THEN 518 CALL blas_zgemv_x( trans_type, n, n, (-1.0d+0,0.0d+0), a,
519 $ lda, y( 1, j ), 1, (1.0d+0,0.0d+0),
520 $ res, 1, prec_type )
522 CALL blas_zgemv2_x( trans_type, n, n, (-1.0d+0,0.0d+0),
523 $ a, lda, y(1, j), y_tail, 1, (1.0d+0,0.0d+0), res, 1,
528 CALL zcopy( n, res, 1, dy, 1 )
529 CALL zgetrs( trans, n, 1, af, ldaf, ipiv, dy, n, info )
540 yk = cabs1( y( i, j ) )
541 dyk = cabs1( dy( i ) )
543 IF ( yk .NE. 0.0d+0 )
THEN 544 dz_z = max( dz_z, dyk / yk )
545 ELSE IF ( dyk .NE. 0.0d+0 )
THEN 549 ymin = min( ymin, yk )
551 normy = max( normy, yk )
554 normx = max( normx, yk * c( i ) )
555 normdx = max( normdx, dyk * c( i ) )
558 normdx = max(normdx, dyk)
562 IF ( normx .NE. 0.0d+0 )
THEN 563 dx_x = normdx / normx
564 ELSE IF ( normdx .EQ. 0.0d+0 )
THEN 570 dxrat = normdx / prevnormdx
571 dzrat = dz_z / prev_dz_z
575 IF (.NOT.ignore_cwise
576 $ .AND. ymin*rcond .LT. incr_thresh*normy
577 $ .AND. y_prec_state .LT. extra_y )
580 IF ( x_state .EQ. noprog_state .AND. dxrat .LE. rthresh )
581 $ x_state = working_state
582 IF ( x_state .EQ. working_state )
THEN 583 IF (dx_x .LE. eps)
THEN 585 ELSE IF ( dxrat .GT. rthresh )
THEN 586 IF ( y_prec_state .NE. extra_y )
THEN 589 x_state = noprog_state
592 IF ( dxrat .GT. dxratmax ) dxratmax = dxrat
594 IF ( x_state .GT. working_state ) final_dx_x = dx_x
597 IF ( z_state .EQ. unstable_state .AND. dz_z .LE. dz_ub )
598 $ z_state = working_state
599 IF ( z_state .EQ. noprog_state .AND. dzrat .LE. rthresh )
600 $ z_state = working_state
601 IF ( z_state .EQ. working_state )
THEN 602 IF ( dz_z .LE. eps )
THEN 604 ELSE IF ( dz_z .GT. dz_ub )
THEN 605 z_state = unstable_state
608 ELSE IF ( dzrat .GT. rthresh )
THEN 609 IF ( y_prec_state .NE. extra_y )
THEN 612 z_state = noprog_state
615 IF ( dzrat .GT. dzratmax ) dzratmax = dzrat
617 IF ( z_state .GT. working_state ) final_dz_z = dz_z
624 IF ( x_state.NE.working_state )
THEN 625 IF ( ignore_cwise )
GOTO 666
626 IF ( z_state.EQ.noprog_state .OR. z_state.EQ.conv_state )
628 IF ( z_state.EQ.unstable_state .AND. cnt.GT.1 )
GOTO 666
631 IF ( incr_prec )
THEN 633 y_prec_state = y_prec_state + 1
644 IF ( y_prec_state .LT. extra_y )
THEN 645 CALL zaxpy( n, (1.0d+0,0.0d+0), dy, 1, y(1,j), 1 )
656 IF ( x_state .EQ. working_state ) final_dx_x = dx_x
657 IF ( z_state .EQ. working_state ) final_dz_z = dz_z
661 IF (n_norms .GE. 1)
THEN 662 errs_n( j, la_linrx_err_i ) = final_dx_x / (1 - dxratmax)
665 IF ( n_norms .GE. 2 )
THEN 666 errs_c( j, la_linrx_err_i ) = final_dz_z / (1 - dzratmax)
677 CALL zcopy( n, b( 1, j ), 1, res, 1 )
678 CALL zgemv( trans, n, n, (-1.0d+0,0.0d+0), a, lda, y(1,j), 1,
679 $ (1.0d+0,0.0d+0), res, 1 )
682 ayb( i ) = cabs1( b( i, j ) )
687 CALL zla_geamv ( trans_type, n, n, 1.0d+0,
688 $ a, lda, y(1, j), 1, 1.0d+0, ayb, 1 )
subroutine zgetrs(TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO)
ZGETRS
double precision function dlamch(CMACH)
DLAMCH
subroutine zcopy(N, ZX, INCX, ZY, INCY)
ZCOPY
subroutine zgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZGEMV
subroutine zla_lin_berr(N, NZ, NRHS, RES, AYB, BERR)
ZLA_LIN_BERR computes a component-wise relative backward error.
subroutine zla_wwaddw(N, X, Y, W)
ZLA_WWADDW adds a vector into a doubled-single vector.
subroutine zla_gerfsx_extended(PREC_TYPE, TRANS_TYPE, N, NRHS, A, LDA, AF, LDAF, IPIV, COLEQU, C, B, LDB, Y, LDY, BERR_OUT, N_NORMS, ERRS_N, ERRS_C, RES, AYB, DY, Y_TAIL, RCOND, ITHRESH, RTHRESH, DZ_UB, IGNORE_CWISE, INFO)
ZLA_GERFSX_EXTENDED
character *1 function chla_transtype(TRANS)
CHLA_TRANSTYPE
subroutine zaxpy(N, ZA, ZX, INCX, ZY, INCY)
ZAXPY
subroutine zla_geamv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
ZLA_GEAMV computes a matrix-vector product using a general matrix to calculate error bounds...