381 $ AF, LDAF, COLEQU, C, B, LDB, Y,
382 $ LDY, BERR_OUT, N_NORMS,
383 $ ERR_BNDS_NORM, ERR_BNDS_COMP, RES,
384 $ AYB, DY, Y_TAIL, RCOND, ITHRESH,
385 $ RTHRESH, DZ_UB, IGNORE_CWISE,
393 INTEGER INFO, LDA, LDAF, , LDY, N, NRHS, PREC_TYPE,
396 LOGICAL COLEQU, IGNORE_CWISE
397 DOUBLE PRECISION RTHRESH, DZ_UB
400 COMPLEX*16 A( LDA, * ), AF( LDAF, * ), B( LDB, * ),
401 $ y( ldy, * ), res( * ), dy( * ), y_tail( * )
402 DOUBLE PRECISION C( * ), AYB( * ), RCOND, ( * ),
403 $ err_bnds_norm( nrhs, * ),
404 $ err_bnds_comp( nrhs, * )
410 INTEGER , CNT, I, J, X_STATE, Z_STATE,
412 DOUBLE PRECISION YK, DYK, YMIN, NORMY, NORMX, NORMDX, DXRAT,
413 $ DZRAT, PREVNORMDX, PREV_DZ_Z, DXRATMAX,
414 $ DZRATMAX, DX_X, DZ_Z, FINAL_DX_X, FINAL_DZ_Z,
415 $ EPS, HUGEVAL, INCR_THRESH
420 INTEGER UNSTABLE_STATE, WORKING_STATE, CONV_STATE,
421 $ NOPROG_STATE, BASE_RESIDUAL, ,
423 parameter( unstable_state = 0, working_state = 1,
424 $ conv_state = 2, noprog_state = 3 )
425 parameter( base_residual = 0, extra_residual = 1,
427 INTEGER FINAL_NRM_ERR_I, FINAL_CMP_ERR_I, BERR_I
428 INTEGER RCOND_I, NRM_RCOND_I, NRM_ERR_I, CMP_RCOND_I
429 INTEGER CMP_ERR_I, PIV_GROWTH_I
430 PARAMETER ( FINAL_NRM_ERR_I = 1, final_cmp_err_i = 2,
433 parameter( cmp_rcond_i = 7, cmp_err_i = 8,
435 INTEGER LA_LINRX_ITREF_I, LA_LINRX_ITHRESH_I,
437 parameter( la_linrx_itref_i = 1,
439 parameter( la_linrx_cwise_i = 3 )
440 INTEGER , LA_LINRX_ERR_I,
442 parameter( la_linrx_trust_i = 1, la_linrx_err_i = 2 )
443 parameter( la_linrx_rcond_i = 3 )
454 DOUBLE PRECISION DLAMCH
457 INTRINSIC abs, dble, dimag
460 DOUBLE PRECISION CABS1
467 IF (info.NE.0)
RETURN
468 eps = dlamch( 'epsilon
' )
469 HUGEVAL = DLAMCH( 'overflow
' )
471 HUGEVAL = HUGEVAL * HUGEVAL
473 INCR_THRESH = DBLE(N) * EPS
475 IF (LSAME (UPLO, 'l
')) THEN
476 UPLO2 = ILAUPLO( 'l
' )
478 UPLO2 = ILAUPLO( 'u
' )
482 Y_PREC_STATE = EXTRA_RESIDUAL
483.EQ.
IF (Y_PREC_STATE EXTRA_Y) THEN
500 X_STATE = WORKING_STATE
501 Z_STATE = UNSTABLE_STATE
509 CALL ZCOPY( N, B( 1, J ), 1, RES, 1 )
510.EQ.
IF (Y_PREC_STATE BASE_RESIDUAL) THEN
511 CALL ZHEMV(UPLO, N, DCMPLX(-1.0D+0), A, LDA, Y(1,J), 1,
512 $ DCMPLX(1.0D+0), RES, 1)
513.EQ.
ELSE IF (Y_PREC_STATE EXTRA_RESIDUAL) THEN
514 CALL BLAS_ZHEMV_X(UPLO2, N, DCMPLX(-1.0D+0), A, LDA,
515 $ Y( 1, J ), 1, DCMPLX(1.0D+0), RES, 1, PREC_TYPE)
517 CALL BLAS_ZHEMV2_X(UPLO2, N, DCMPLX(-1.0D+0), A, LDA,
518 $ Y(1, J), Y_TAIL, 1, DCMPLX(1.0D+0), RES, 1,
522! XXX: RES is no longer needed.
523 CALL ZCOPY( N, RES, 1, DY, 1 )
524 CALL ZPOTRS( UPLO, N, 1, AF, LDAF, DY, N, INFO)
538.NE.
IF (YK 0.0D+0) THEN
539 DZ_Z = MAX( DZ_Z, DYK / YK )
540.NE.
ELSE IF (DYK 0.0D+0) THEN
544 YMIN = MIN( YMIN, YK )
546 NORMY = MAX( NORMY, YK )
549 NORMX = MAX(NORMX, YK * C(I))
550 NORMDX = MAX(NORMDX, DYK * C(I))
553 NORMDX = MAX(NORMDX, DYK)
557.NE.
IF (NORMX 0.0D+0) THEN
558 DX_X = NORMDX / NORMX
559.EQ.
ELSE IF (NORMDX 0.0D+0) THEN
565 DXRAT = NORMDX / PREVNORMDX
566 DZRAT = DZ_Z / PREV_DZ_Z
570.LT.
IF (YMIN*RCOND INCR_THRESH*NORMY
571.AND..LT.
$ Y_PREC_STATE EXTRA_Y)
574.EQ..AND..LE.
IF (X_STATE NOPROG_STATE DXRAT RTHRESH)
575 $ X_STATE = WORKING_STATE
576.EQ.
IF (X_STATE WORKING_STATE) THEN
577.LE.
IF (DX_X EPS) THEN
579.GT.
ELSE IF (DXRAT RTHRESH) THEN
580.NE.
IF (Y_PREC_STATE EXTRA_Y) THEN
583 X_STATE = NOPROG_STATE
586.GT.
IF (DXRAT DXRATMAX) DXRATMAX = DXRAT
588.GT.
IF (X_STATE WORKING_STATE) FINAL_DX_X = DX_X
591.EQ..AND..LE.
IF (Z_STATE UNSTABLE_STATE DZ_Z DZ_UB)
592 $ Z_STATE = WORKING_STATE
593.EQ..AND..LE.
IF (Z_STATE NOPROG_STATE DZRAT RTHRESH)
594 $ Z_STATE = WORKING_STATE
595.EQ.
IF (Z_STATE WORKING_STATE) THEN
596.LE.
IF (DZ_Z EPS) THEN
598.GT.
ELSE IF (DZ_Z DZ_UB) THEN
599 Z_STATE = UNSTABLE_STATE
602.GT.
ELSE IF (DZRAT RTHRESH) THEN
603.NE.
IF (Y_PREC_STATE EXTRA_Y) THEN
606 Z_STATE = NOPROG_STATE
609.GT.
IF (DZRAT DZRATMAX) DZRATMAX = DZRAT
611.GT.
IF (Z_STATE WORKING_STATE) FINAL_DZ_Z = DZ_Z
614.NE..AND.
IF ( X_STATEWORKING_STATE
615.OR..NE.
$ (IGNORE_CWISEZ_STATEWORKING_STATE) )
620 Y_PREC_STATE = Y_PREC_STATE + 1
631.LT.
IF (Y_PREC_STATE EXTRA_Y) THEN
632 CALL ZAXPY( N, DCMPLX(1.0D+0), DY, 1, Y(1,J), 1 )
634 CALL ZLA_WWADDW(N, Y(1,J), Y_TAIL, DY)
643.EQ.
IF (X_STATE WORKING_STATE) FINAL_DX_X = DX_X
644.EQ.
IF (Z_STATE WORKING_STATE) FINAL_DZ_Z = DZ_Z
648.GE.
IF (N_NORMS 1) THEN
649 ERR_BNDS_NORM( J, LA_LINRX_ERR_I ) =
650 $ FINAL_DX_X / (1 - DXRATMAX)
652.GE.
IF (N_NORMS 2) THEN
653 ERR_BNDS_COMP( J, LA_LINRX_ERR_I ) =
654 $ FINAL_DZ_Z / (1 - DZRATMAX)
665 CALL ZCOPY( N, B( 1, J ), 1, RES, 1 )
666 CALL ZHEMV(UPLO, N, DCMPLX(-1.0D+0), A, LDA, Y(1,J), 1,
667 $ DCMPLX(1.0D+0), RES, 1)
670 AYB( I ) = CABS1( B( I, J ) )
675 CALL ZLA_HEAMV (UPLO2, N, 1.0D+0,
676 $ A, LDA, Y(1, J), 1, 1.0D+0, AYB, 1)
678 CALL ZLA_LIN_BERR (N, N, 1, RES, AYB, BERR_OUT(J))
subroutine zla_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)
ZLA_PORFSX_EXTENDED improves the computed solution to a system of linear equations for symmetric or H...