383 $ AF, LDAF, COLEQU, C, B, LDB, Y,
384 $ LDY, BERR_OUT, N_NORMS,
385 $ ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
386 $ AYB, DY, Y_TAIL, RCOND, ITHRESH,
387 $ RTHRESH, DZ_UB, IGNORE_CWISE,
396 INTEGER INFO, LDA, LDAF, LDB, LDY, N, NRHS, PREC_TYPE,
399 LOGICAL COLEQU, IGNORE_CWISE
403 COMPLEX A( lda, * ), AF( ldaf, * ), B( ldb, * ),
404 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
405 REAL C( * ), AYB( * ), RCOND, BERR_OUT( * ),
406 $ err_bnds_norm( nrhs, * ),
407 $ err_bnds_comp( nrhs, * )
413 INTEGER UPLO2, CNT, I, J, X_STATE, Z_STATE,
415 REAL YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
416 $ dzrat, prevnormdx, prev_dz_z, dxratmax,
417 $ dzratmax, dx_x, dz_z, final_dx_x, final_dz_z,
418 $ eps, hugeval, incr_thresh
423 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
424 $ noprog_state, base_residual, extra_residual,
426 parameter( unstable_state = 0, working_state = 1,
427 $ conv_state = 2, noprog_state = 3 )
428 parameter( base_residual = 0, extra_residual = 1,
430 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
431 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
432 INTEGER CMP_ERR_I, PIV_GROWTH_I
433 parameter( final_nrm_err_i = 1, final_cmp_err_i = 2,
435 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
436 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
438 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
440 parameter( la_linrx_itref_i = 1,
441 $ la_linrx_ithresh_i = 2 )
442 parameter( la_linrx_cwise_i = 3 )
443 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
445 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
446 parameter( la_linrx_rcond_i = 3 )
460 INTRINSIC abs,
REAL, AIMAG, MAX, MIN
466 cabs1( zdum ) = abs(
REAL( ZDUM ) ) + abs( AIMAG( zdum ) )
470 IF (info.NE.0)
RETURN 471 eps = slamch(
'Epsilon' )
472 hugeval = slamch(
'Overflow' )
474 hugeval = hugeval * hugeval
476 incr_thresh =
REAL(N) * EPS
478 IF (lsame(uplo,
'L'))
THEN 479 uplo2 = ilauplo(
'L' )
481 uplo2 = ilauplo(
'U' )
485 y_prec_state = extra_residual
486 IF (y_prec_state .EQ. extra_y)
THEN 503 x_state = working_state
504 z_state = unstable_state
512 CALL ccopy( n, b( 1, j ), 1, res, 1 )
513 IF (y_prec_state .EQ. base_residual)
THEN 514 CALL chemv(uplo, n, cmplx(-1.0), a, lda, y(1,j), 1,
515 $ cmplx(1.0), res, 1)
516 ELSE IF (y_prec_state .EQ. extra_residual)
THEN 517 CALL blas_chemv_x(uplo2, n, cmplx(-1.0), a, lda,
518 $ y( 1, j ), 1, cmplx(1.0), res, 1, prec_type)
520 CALL blas_chemv2_x(uplo2, n, cmplx(-1.0), a, lda,
521 $ y(1, j), y_tail, 1, cmplx(1.0), res, 1, prec_type)
525 CALL ccopy( n, res, 1, dy, 1 )
526 CALL cpotrs( uplo, n, 1, af, ldaf, dy, n, info)
540 IF (yk .NE. 0.0)
THEN 541 dz_z = max( dz_z, dyk / yk )
542 ELSE IF (dyk .NE. 0.0)
THEN 546 ymin = min( ymin, yk )
548 normy = max( normy, yk )
551 normx = max(normx, yk * c(i))
552 normdx = max(normdx, dyk * c(i))
555 normdx = max(normdx, dyk)
559 IF (normx .NE. 0.0)
THEN 560 dx_x = normdx / normx
561 ELSE IF (normdx .EQ. 0.0)
THEN 567 dxrat = normdx / prevnormdx
568 dzrat = dz_z / prev_dz_z
572 IF (ymin*rcond .LT. incr_thresh*normy
573 $ .AND. y_prec_state .LT. extra_y)
576 IF (x_state .EQ. noprog_state .AND. dxrat .LE. rthresh)
577 $ x_state = working_state
578 IF (x_state .EQ. working_state)
THEN 579 IF (dx_x .LE. eps)
THEN 581 ELSE IF (dxrat .GT. rthresh)
THEN 582 IF (y_prec_state .NE. extra_y)
THEN 585 x_state = noprog_state
588 IF (dxrat .GT. dxratmax) dxratmax = dxrat
590 IF (x_state .GT. working_state) final_dx_x = dx_x
593 IF (z_state .EQ. unstable_state .AND. dz_z .LE. dz_ub)
594 $ z_state = working_state
595 IF (z_state .EQ. noprog_state .AND. dzrat .LE. rthresh)
596 $ z_state = working_state
597 IF (z_state .EQ. working_state)
THEN 598 IF (dz_z .LE. eps)
THEN 600 ELSE IF (dz_z .GT. dz_ub)
THEN 601 z_state = unstable_state
604 ELSE IF (dzrat .GT. rthresh)
THEN 605 IF (y_prec_state .NE. extra_y)
THEN 608 z_state = noprog_state
611 IF (dzrat .GT. dzratmax) dzratmax = dzrat
613 IF (z_state .GT. working_state) final_dz_z = dz_z
616 IF ( x_state.NE.working_state.AND.
617 $ (ignore_cwise.OR.z_state.NE.working_state) )
622 y_prec_state = y_prec_state + 1
633 IF (y_prec_state .LT. extra_y)
THEN 634 CALL caxpy( n, cmplx(1.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 err_bnds_norm( j, la_linrx_err_i ) =
652 $ final_dx_x / (1 - dxratmax)
654 IF (n_norms .GE. 2)
THEN 655 err_bnds_comp( j, la_linrx_err_i ) =
656 $ final_dz_z / (1 - dzratmax)
667 CALL ccopy( n, b( 1, j ), 1, res, 1 )
668 CALL chemv(uplo, n, cmplx(-1.0), a, lda, y(1,j), 1, cmplx(1.0),
672 ayb( i ) = cabs1( b( i, j ) )
678 $ 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 cpotrs(UPLO, N, NRHS, A, LDA, B, LDB, INFO)
CPOTRS
subroutine cla_porfsx_extended(PREC_TYPE, UPLO, N, NRHS, A, LDA, AF, LDAF, 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_PORFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric or H...
subroutine cla_lin_berr(N, NZ, NRHS, RES, AYB, BERR)
CLA_LIN_BERR computes a component-wise relative backward error.
subroutine chemv(UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)
CHEMV
real function slamch(CMACH)
SLAMCH
integer function ilauplo(UPLO)
ILAUPLO
subroutine ccopy(N, CX, INCX, CY, INCY)
CCOPY
subroutine caxpy(N, CA, CX, INCX, CY, INCY)
CAXPY