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, ithresh
407 LOGICAL COLEQU, IGNORE_CWISE
408 DOUBLE PRECISION RTHRESH, DZ_UB
412 DOUBLE PRECISION A( lda, * ), AF( ldaf, * ), B( ldb, * ),
413 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
414 DOUBLE PRECISION C( * ), AYB( * ), RCOND, BERR_OUT( * ),
415 $ errs_n( nrhs, * ), errs_c( nrhs, * )
422 INTEGER CNT, I, J, X_STATE, Z_STATE, Y_PREC_STATE
423 DOUBLE PRECISION YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
424 $ dzrat, prevnormdx, prev_dz_z, dxratmax,
425 $ dzratmax, dx_x, dz_z, final_dx_x, final_dz_z,
426 $ eps, hugeval, incr_thresh
430 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
431 $ noprog_state, base_residual, extra_residual,
433 parameter( unstable_state = 0, working_state = 1,
434 $ conv_state = 2, noprog_state = 3 )
435 parameter( base_residual = 0, extra_residual = 1,
437 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
438 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
439 INTEGER CMP_ERR_I, PIV_GROWTH_I
440 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
442 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
443 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
445 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
447 parameter( la_linrx_itref_i = 1,
448 $ la_linrx_ithresh_i = 2 )
449 parameter( la_linrx_cwise_i = 3 )
450 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
452 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
453 parameter( la_linrx_rcond_i = 3 )
459 DOUBLE PRECISION DLAMCH
460 CHARACTER CHLA_TRANSTYPE
463 INTRINSIC abs, max, min
467 IF ( info.NE.0 )
RETURN 468 trans = chla_transtype(trans_type)
469 eps = dlamch(
'Epsilon' )
470 hugeval = dlamch(
'Overflow' )
472 hugeval = hugeval * hugeval
474 incr_thresh = dble( n ) * eps
477 y_prec_state = extra_residual
478 IF ( y_prec_state .EQ. extra_y )
THEN 495 x_state = working_state
496 z_state = unstable_state
504 CALL dcopy( n, b( 1, j ), 1, res, 1 )
505 IF ( y_prec_state .EQ. base_residual )
THEN 506 CALL dgemv( trans, n, n, -1.0d+0, a, lda, y( 1, j ), 1,
508 ELSE IF ( y_prec_state .EQ. extra_residual )
THEN 509 CALL blas_dgemv_x( trans_type, n, n, -1.0d+0, a, lda,
510 $ y( 1, j ), 1, 1.0d+0, res, 1, prec_type )
512 CALL blas_dgemv2_x( trans_type, n, n, -1.0d+0, a, lda,
513 $ y( 1, j ), y_tail, 1, 1.0d+0, res, 1, prec_type )
517 CALL dcopy( n, res, 1, dy, 1 )
518 CALL dgetrs( trans, n, 1, af, ldaf, ipiv, dy, n, info )
529 yk = abs( y( i, j ) )
532 IF ( yk .NE. 0.0d+0 )
THEN 533 dz_z = max( dz_z, dyk / yk )
534 ELSE IF ( dyk .NE. 0.0d+0 )
THEN 538 ymin = min( ymin, yk )
540 normy = max( normy, yk )
543 normx = max( normx, yk * c( i ) )
544 normdx = max( normdx, dyk * c( i ) )
547 normdx = max( normdx, dyk )
551 IF ( normx .NE. 0.0d+0 )
THEN 552 dx_x = normdx / normx
553 ELSE IF ( normdx .EQ. 0.0d+0 )
THEN 559 dxrat = normdx / prevnormdx
560 dzrat = dz_z / prev_dz_z
564 IF (.NOT.ignore_cwise
565 $ .AND. ymin*rcond .LT. incr_thresh*normy
566 $ .AND. y_prec_state .LT. extra_y)
569 IF ( x_state .EQ. noprog_state .AND. dxrat .LE. rthresh )
570 $ x_state = working_state
571 IF ( x_state .EQ. working_state )
THEN 572 IF ( dx_x .LE. eps )
THEN 574 ELSE IF ( dxrat .GT. rthresh )
THEN 575 IF ( y_prec_state .NE. extra_y )
THEN 578 x_state = noprog_state
581 IF ( dxrat .GT. dxratmax ) dxratmax = dxrat
583 IF ( x_state .GT. working_state ) final_dx_x = dx_x
586 IF ( z_state .EQ. unstable_state .AND. dz_z .LE. dz_ub )
587 $ z_state = working_state
588 IF ( z_state .EQ. noprog_state .AND. dzrat .LE. rthresh )
589 $ z_state = working_state
590 IF ( z_state .EQ. working_state )
THEN 591 IF ( dz_z .LE. eps )
THEN 593 ELSE IF ( dz_z .GT. dz_ub )
THEN 594 z_state = unstable_state
597 ELSE IF ( dzrat .GT. rthresh )
THEN 598 IF ( y_prec_state .NE. extra_y )
THEN 601 z_state = noprog_state
604 IF ( dzrat .GT. dzratmax ) dzratmax = dzrat
606 IF ( z_state .GT. working_state ) final_dz_z = dz_z
613 IF ( x_state.NE.working_state )
THEN 614 IF ( ignore_cwise)
GOTO 666
615 IF ( z_state.EQ.noprog_state .OR. z_state.EQ.conv_state )
617 IF ( z_state.EQ.unstable_state .AND. cnt.GT.1 )
GOTO 666
620 IF ( incr_prec )
THEN 622 y_prec_state = y_prec_state + 1
633 IF ( y_prec_state .LT. extra_y )
THEN 634 CALL daxpy( n, 1.0d+0, dy, 1, y( 1, j ), 1 )
645 IF ( x_state .EQ. working_state ) final_dx_x = dx_x
646 IF ( z_state .EQ. working_state ) final_dz_z = dz_z
650 IF (n_norms .GE. 1)
THEN 651 errs_n( j, la_linrx_err_i ) = final_dx_x / (1 - dxratmax)
653 IF ( n_norms .GE. 2 )
THEN 654 errs_c( j, la_linrx_err_i ) = final_dz_z / (1 - dzratmax)
665 CALL dcopy( n, b( 1, j ), 1, res, 1 )
666 CALL dgemv( trans, n, n, -1.0d+0, a, lda, y(1,j), 1, 1.0d+0,
670 ayb( i ) = abs( b( i, j ) )
675 CALL dla_geamv ( trans_type, n, n, 1.0d+0,
676 $ a, lda, y(1, j), 1, 1.0d+0, ayb, 1 )
double precision function dlamch(CMACH)
DLAMCH
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dgemv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DGEMV
subroutine daxpy(N, DA, DX, INCX, DY, INCY)
DAXPY
subroutine dgetrs(TRANS, N, NRHS, A, LDA, IPIV, B, LDB, INFO)
DGETRS
subroutine dla_wwaddw(N, X, Y, W)
DLA_WWADDW adds a vector into a doubled-single vector.
subroutine dla_geamv(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
DLA_GEAMV computes a matrix-vector product using a general matrix to calculate error bounds...
subroutine dla_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)
DLA_GERFSX_EXTENDED improves the computed solution to a system of linear equations for general matric...
subroutine dla_lin_berr(N, NZ, NRHS, RES, AYB, BERR)
DLA_LIN_BERR computes a component-wise relative backward error.
character *1 function chla_transtype(TRANS)
CHLA_TRANSTYPE