390 $ AF, LDAF, IPIV, COLEQU, C, B, LDB,
391 $ Y, LDY, BERR_OUT, N_NORMS,
392 $ ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
393 $ AYB, DY, Y_TAIL, RCOND, ITHRESH,
394 $ RTHRESH, DZ_UB, IGNORE_CWISE,
402 INTEGER INFO, LDA, LDAF, LDB, LDY, N, NRHS, PREC_TYPE,
405 LOGICAL COLEQU, IGNORE_CWISE
406 DOUBLE PRECISION RTHRESH, DZ_UB
410 DOUBLE PRECISION A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
412 DOUBLE PRECISION C( * ), AYB( * ), RCOND, BERR_OUT( * ),
413 $ ERR_BNDS_NORM( NRHS, * ),
414 $ ERR_BNDS_COMP( NRHS, * )
420 INTEGER UPLO2, CNT, I, J, X_STATE, Z_STATE
421 DOUBLE PRECISION 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
428 INTEGER , WORKING_STATE, CONV_STATE,
429 $ NOPROG_STATE, Y_PREC_STATE, BASE_RESIDUAL,
430 $ EXTRA_RESIDUAL, EXTRA_Y
431 parameter( unstable_state = 0, working_state = 1,
432 $ conv_state = 2, noprog_state = 3 )
433 parameter( base_residual = 0, extra_residual = 1
435 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
436 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
437 INTEGER CMP_ERR_I, PIV_GROWTH_I
438 PARAMETER ( FINAL_NRM_ERR_I = 1, final_cmp_err_i = 2,
440 parameter( rcond_i = 4, nrm_rcond_i = 5, nrm_err_i = 6 )
441 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
443 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
445 parameter( la_linrx_itref_i = 1,
446 $ la_linrx_ithresh_i = 2 )
447 parameter( la_linrx_cwise_i = 3 )
448 INTEGER LA_LINRX_TRUST_I, LA_LINRX_ERR_I,
450 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
451 parameter( la_linrx_rcond_i = 3 )
462 DOUBLE PRECISION DLAMCH
470 upper = lsame( uplo,
'U' )
471 IF( .NOT.upper .AND. .NOT.lsame( uplo,
'L' ) )
THEN
473 ELSE IF( n.LT.0 )
THEN
475 ELSE IF( nrhs.LT.0 )
THEN
477 ELSE IF( lda.LT.
max( 1, n ) )
THEN
479 ELSE IF( ldaf.LT.
max( 1, n ) )
THEN
481 ELSE IF( ldb.LT.
max( 1, n ) )
THEN
483 ELSE IF( ldy.LT.
max( 1, n ) )
THEN
487 CALL xerbla(
'DLA_SYRFSX_EXTENDED', -info )
490 eps = dlamch(
'Epsilon' )
491 hugeval = dlamch(
'Overflow' )
493 hugeval = hugeval * hugeval
495 incr_thresh = dble( n )*eps
497 IF ( lsame( uplo, 'l
' ) ) THEN
498 UPLO2 = ILAUPLO( 'l
' )
500 UPLO2 = ILAUPLO( 'u
' )
504 Y_PREC_STATE = EXTRA_RESIDUAL
505.EQ.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
522 X_STATE = WORKING_STATE
523 Z_STATE = UNSTABLE_STATE
531 CALL DCOPY( N, B( 1, J ), 1, RES, 1 )
532.EQ.
IF (Y_PREC_STATE BASE_RESIDUAL) THEN
533 CALL DSYMV( UPLO, N, -1.0D+0, A, LDA, Y(1,J), 1,
535.EQ.
ELSE IF (Y_PREC_STATE EXTRA_RESIDUAL) THEN
536 CALL BLAS_DSYMV_X( UPLO2, N, -1.0D+0, A, LDA,
537 $ Y( 1, J ), 1, 1.0D+0, RES, 1, PREC_TYPE )
539 CALL BLAS_DSYMV2_X(UPLO2, N, -1.0D+0, A, LDA,
540 $ Y(1, J), Y_TAIL, 1, 1.0D+0, RES, 1, PREC_TYPE)
543! XXX: RES is no longer needed.
544 CALL DCOPY( N, RES, 1, DY, 1 )
545 CALL DSYTRS( UPLO, N, 1, AF, LDAF, IPIV, DY, N, INFO )
556 YK = ABS( Y( I, J ) )
559.NE.
IF ( YK 0.0D+0 ) THEN
560 DZ_Z = MAX( DZ_Z, DYK / YK )
561.NE.
ELSE IF ( DYK 0.0D+0 ) THEN
565 YMIN = MIN( YMIN, YK )
567 NORMY = MAX( NORMY, YK )
570 NORMX = MAX( NORMX, YK * C( I ) )
571 NORMDX = MAX( NORMDX, DYK * C( I ) )
574 NORMDX = MAX(NORMDX, DYK)
578.NE.
IF ( NORMX 0.0D+0 ) THEN
579 DX_X = NORMDX / NORMX
580.EQ.
ELSE IF ( NORMDX 0.0D+0 ) THEN
586 DXRAT = NORMDX / PREVNORMDX
587 DZRAT = DZ_Z / PREV_DZ_Z
591.LT.
IF ( YMIN*RCOND INCR_THRESH*NORMY
592.AND..LT.
$ Y_PREC_STATE EXTRA_Y )
595.EQ..AND..LE.
IF ( X_STATE NOPROG_STATE DXRAT RTHRESH )
596 $ X_STATE = WORKING_STATE
597.EQ.
IF ( X_STATE WORKING_STATE ) THEN
598.LE.
IF ( DX_X EPS ) THEN
600.GT.
ELSE IF ( DXRAT RTHRESH ) THEN
601.NE.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
604 X_STATE = NOPROG_STATE
607.GT.
IF ( DXRAT DXRATMAX ) DXRATMAX = DXRAT
609.GT.
IF ( X_STATE WORKING_STATE ) FINAL_DX_X = DX_X
612.EQ..AND..LE.
IF ( Z_STATE UNSTABLE_STATE DZ_Z DZ_UB )
613 $ Z_STATE = WORKING_STATE
614.EQ..AND..LE.
IF ( Z_STATE NOPROG_STATE DZRAT RTHRESH )
615 $ Z_STATE = WORKING_STATE
616.EQ.
IF ( Z_STATE WORKING_STATE ) THEN
617.LE.
IF ( DZ_Z EPS ) THEN
619.GT.
ELSE IF ( DZ_Z DZ_UB ) THEN
620 Z_STATE = UNSTABLE_STATE
623.GT.
ELSE IF ( DZRAT RTHRESH ) THEN
624.NE.
IF ( Y_PREC_STATE EXTRA_Y ) THEN
627 Z_STATE = NOPROG_STATE
630.GT.
IF ( DZRAT DZRATMAX ) DZRATMAX = DZRAT
632.GT.
IF ( Z_STATE WORKING_STATE ) FINAL_DZ_Z = DZ_Z
635.NE..AND.
IF ( X_STATEWORKING_STATE
636.OR..NE.
$ ( IGNORE_CWISEZ_STATEWORKING_STATE ) )
639 IF ( INCR_PREC ) THEN
641 Y_PREC_STATE = Y_PREC_STATE + 1
652.LT.
IF (Y_PREC_STATE EXTRA_Y) THEN
653 CALL DAXPY( N, 1.0D+0, DY, 1, Y(1,J), 1 )
655 CALL DLA_WWADDW( N, Y(1,J), Y_TAIL, DY )
664.EQ.
IF ( X_STATE WORKING_STATE ) FINAL_DX_X = DX_X
665.EQ.
IF ( Z_STATE WORKING_STATE ) FINAL_DZ_Z = DZ_Z
669.GE.
IF ( N_NORMS 1 ) THEN
670 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
671 $ FINAL_DX_X / (1 - DXRATMAX)
673.GE.
IF ( N_NORMS 2 ) THEN
674 ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
675 $ FINAL_DZ_Z / (1 - DZRATMAX)
685 CALL DCOPY( N, B( 1, J ), 1, RES, 1 )
686 CALL DSYMV( UPLO, N, -1.0D+0, A, LDA, Y(1,J), 1, 1.0D+0, RES,
690 AYB( I ) = ABS( B( I, J ) )
695 CALL DLA_SYAMV( UPLO2, N, 1.0D+0,
696 $ A, LDA, Y(1, J), 1, 1.0D+0, AYB, 1 )
698 CALL DLA_LIN_BERR( N, N, 1, RES, AYB, BERR_OUT( J ) )
subroutine dla_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)
DLA_SYRFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric inde...