389 $ AF, LDAF, IPIV, COLEQU, C, B, LDB,
390 $ Y, LDY, BERR_OUT, N_NORMS,
391 $ ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
392 $ AYB, DY, Y_TAIL, RCOND, ITHRESH,
393 $ RTHRESH, DZ_UB, IGNORE_CWISE,
401 INTEGER INFO, , LDAF, LDB, LDY, N, NRHS, ,
404 LOGICAL COLEQU, IGNORE_CWISE
409 COMPLEX A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
410 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
411 REAL C( * ), AYB( * ), RCOND, BERR_OUT( * ),
412 $ ERR_BNDS_NORM( NRHS, * ),
413 $ ERR_BNDS_COMP( NRHS, * )
419 INTEGER UPLO2, CNT, I, J, X_STATE, Z_STATE,
421 REAL YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
422 $ DZRAT, PREVNORMDX, PREV_DZ_Z, DXRATMAX,
423 $ DZRATMAX, DX_X, DZ_Z, FINAL_DX_X, FINAL_DZ_Z,
424 $ EPS, HUGEVAL, INCR_THRESH
425 LOGICAL INCR_PREC, UPPER
429 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
430 $ NOPROG_STATE, BASE_RESIDUAL, EXTRA_RESIDUAL,
432 parameter( unstable_state = 0, working_state = 1,
433 $ conv_state = 2, noprog_state = 3 )
434 parameter( base_residual = 0, extra_residual = 1,
436 INTEGER , FINAL_CMP_ERR_I, BERR_I
437 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
438 INTEGER CMP_ERR_I, PIV_GROWTH_I
439 PARAMETER ( FINAL_NRM_ERR_I = 1, final_cmp_err_i = 2,
441 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
442 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
444 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
446 parameter( la_linrx_itref_i = 1,
447 $ la_linrx_ithresh_i = 2 )
448 parameter( la_linrx_cwise_i = 3 )
449 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
451 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
452 parameter( la_linrx_rcond_i = 3 )
466 INTRINSIC abs, real, aimag,
max,
min
472 cabs1( zdum ) = abs( real( zdum ) ) + abs( aimag( zdum )
477 upper = lsame( uplo,
'U' )
478 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
480 ELSE IF( n.LT.0 )
THEN
482 ELSE IF( nrhs.LT.0 )
THEN
484 ELSE IF( lda.LT.
max( 1, n ) )
THEN
486 ELSE IF( ldaf.LT.
max( 1, n ) )
THEN
488 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
490 ELSE IF( ldy.LT.
max( 1, n ) )
THEN
494 CALL xerbla(
'CLA_SYRFSX_EXTENDED', -info )
497 eps = slamch(
'Epsilon' )
498 hugeval = slamch(
'Overflow' )
500 hugeval = hugeval * hugeval
502 incr_thresh = real( n ) * eps
504 IF ( lsame( uplo,
'L' ) )
THEN
505 uplo2 = ilauplo( 'l
' )
507 UPLO2 = ILAUPLO( 'u
' )
511 Y_PREC_STATE = EXTRA_RESIDUAL
512.EQ.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
529 X_STATE = WORKING_STATE
530 Z_STATE = UNSTABLE_STATE
538 CALL CCOPY( N, B( 1, J ), 1, RES, 1 )
539.EQ.
IF ( Y_PREC_STATE BASE_RESIDUAL ) THEN
540 CALL CSYMV( UPLO, N, CMPLX(-1.0), A, LDA, Y(1,J), 1,
541 $ CMPLX(1.0), RES, 1 )
542.EQ.
ELSE IF ( Y_PREC_STATE EXTRA_RESIDUAL ) THEN
543 CALL BLAS_CSYMV_X( UPLO2, N, CMPLX(-1.0), A, LDA,
544 $ Y( 1, J ), 1, CMPLX(1.0), RES, 1, PREC_TYPE )
546 CALL BLAS_CSYMV2_X(UPLO2, N, CMPLX(-1.0), A, LDA,
547 $ Y(1, J), Y_TAIL, 1, CMPLX(1.0), RES, 1, PREC_TYPE)
550! XXX: RES is no longer needed.
551 CALL CCOPY( N, RES, 1, DY, 1 )
552 CALL CSYTRS( UPLO, N, 1, AF, LDAF, IPIV, DY, N, INFO )
563 YK = CABS1( Y( I, J ) )
564 DYK = CABS1( DY( I ) )
566.NE.
IF ( YK 0.0 ) THEN
567 DZ_Z = MAX( DZ_Z, DYK / YK )
568.NE.
ELSE IF ( DYK 0.0 ) THEN
572 YMIN = MIN( YMIN, YK )
574 NORMY = MAX( NORMY, YK )
577 NORMX = MAX( NORMX, YK * C( I ) )
578 NORMDX = MAX( NORMDX, DYK * C( I ) )
581 NORMDX = MAX( NORMDX, DYK )
585.NE.
IF ( NORMX 0.0 ) THEN
586 DX_X = NORMDX / NORMX
587.EQ.
ELSE IF ( NORMDX 0.0 ) THEN
593 DXRAT = NORMDX / PREVNORMDX
594 DZRAT = DZ_Z / PREV_DZ_Z
598.LT.
IF ( YMIN*RCOND INCR_THRESH*NORMY
599.AND..LT.
$ Y_PREC_STATE EXTRA_Y )
602.EQ..AND..LE.
IF ( X_STATE NOPROG_STATE DXRAT RTHRESH )
603 $ X_STATE = WORKING_STATE
604.EQ.
IF ( X_STATE WORKING_STATE ) THEN
605.LE.
IF ( DX_X EPS ) THEN
607.GT.
ELSE IF ( DXRAT RTHRESH ) THEN
608.NE.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
611 X_STATE = NOPROG_STATE
614.GT.
IF (DXRAT DXRATMAX) DXRATMAX = DXRAT
616.GT.
IF ( X_STATE WORKING_STATE ) FINAL_DX_X = DX_X
619.EQ..AND..LE.
IF ( Z_STATE UNSTABLE_STATE DZ_Z DZ_UB )
620 $ Z_STATE = WORKING_STATE
621.EQ..AND..LE.
IF ( Z_STATE NOPROG_STATE DZRAT RTHRESH )
622 $ Z_STATE = WORKING_STATE
623.EQ.
IF ( Z_STATE WORKING_STATE ) THEN
624.LE.
IF ( DZ_Z EPS ) THEN
626.GT.
ELSE IF ( DZ_Z DZ_UB ) THEN
627 Z_STATE = UNSTABLE_STATE
630.GT.
ELSE IF ( DZRAT RTHRESH ) THEN
631.NE.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
634 Z_STATE = NOPROG_STATE
637.GT.
IF ( DZRAT DZRATMAX ) DZRATMAX = DZRAT
639.GT.
IF ( Z_STATE WORKING_STATE ) FINAL_DZ_Z = DZ_Z
642.NE..AND.
IF ( X_STATEWORKING_STATE
643.OR..NE.
$ ( IGNORE_CWISEZ_STATEWORKING_STATE ) )
646 IF ( INCR_PREC ) THEN
648 Y_PREC_STATE = Y_PREC_STATE + 1
659.LT.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
660 CALL CAXPY( N, CMPLX(1.0), DY, 1, Y(1,J), 1 )
662 CALL CLA_WWADDW( N, Y(1,J), Y_TAIL, DY )
671.EQ.
IF ( X_STATE WORKING_STATE ) FINAL_DX_X = DX_X
672.EQ.
IF ( Z_STATE WORKING_STATE ) FINAL_DZ_Z = DZ_Z
676.GE.
IF ( N_NORMS 1 ) THEN
677 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
678 $ FINAL_DX_X / (1 - DXRATMAX)
680.GE.
IF ( N_NORMS 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 CSYMV( UPLO, N, CMPLX(-1.0), A, LDA, Y(1,J), 1,
695 $ CMPLX(1.0), RES, 1 )
698 AYB( I ) = CABS1( B( I, J ) )
703 CALL CLA_SYAMV ( UPLO2, N, 1.0,
704 $ A, LDA, Y(1, J), 1, 1.0, AYB, 1 )
706 CALL CLA_LIN_BERR ( N, N, 1, RES, AYB, BERR_OUT( J ) )
subroutine cla_syrfsx_extended(prec_type, uplo, n, nrhs, a, lda, af, ldaf, 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_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric inde...