sdrvgb.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 737 行 · 第 1/3 页
F
737 行
* Print information about the tests that did
* not pass the threshold.
*
DO 50 K = 1, NT
IF( RESULT( K ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
WRITE( NOUT, FMT = 9997 )'SGBSV ',
$ N, KL, KU, IMAT, K, RESULT( K )
NFAIL = NFAIL + 1
END IF
50 CONTINUE
NRUN = NRUN + NT
END IF
*
* --- Test SGBSVX ---
*
IF( .NOT.PREFAC )
$ CALL SLASET( 'Full', 2*KL+KU+1, N, ZERO,
$ ZERO, AFB, LDAFB )
CALL SLASET( 'Full', N, NRHS, ZERO, ZERO, X,
$ LDB )
IF( IEQUED.GT.1 .AND. N.GT.0 ) THEN
*
* Equilibrate the matrix if FACT = 'F' and
* EQUED = 'R', 'C', or 'B'.
*
CALL SLAQGB( N, N, KL, KU, A, LDA, S,
$ S( N+1 ), ROWCND, COLCND,
$ AMAX, EQUED )
END IF
*
* Solve the system and compute the condition
* number and error bounds using SGBSVX.
*
SRNAMT = 'SGBSVX'
CALL SGBSVX( FACT, TRANS, N, KL, KU, NRHS, A,
$ LDA, AFB, LDAFB, IWORK, EQUED,
$ S, S( N+1 ), B, LDB, X, LDB,
$ RCOND, RWORK, RWORK( NRHS+1 ),
$ WORK, IWORK( N+1 ), INFO )
*
* Check the error code from SGBSVX.
*
IF( INFO.NE.IZERO )
$ CALL ALAERH( PATH, 'SGBSVX', INFO, IZERO,
$ FACT // TRANS, N, N, KL, KU,
$ NRHS, IMAT, NFAIL, NERRS,
$ NOUT )
*
* Compare WORK(1) from SGBSVX with the computed
* reciprocal pivot growth factor RPVGRW
*
IF( INFO.NE.0 ) THEN
ANRMPV = ZERO
DO 70 J = 1, INFO
DO 60 I = MAX( KU+2-J, 1 ),
$ MIN( N+KU+1-J, KL+KU+1 )
ANRMPV = MAX( ANRMPV,
$ ABS( A( I+( J-1 )*LDA ) ) )
60 CONTINUE
70 CONTINUE
RPVGRW = SLANTB( 'M', 'U', 'N', INFO,
$ MIN( INFO-1, KL+KU ),
$ AFB( MAX( 1, KL+KU+2-INFO ) ),
$ LDAFB, WORK )
IF( RPVGRW.EQ.ZERO ) THEN
RPVGRW = ONE
ELSE
RPVGRW = ANRMPV / RPVGRW
END IF
ELSE
RPVGRW = SLANTB( 'M', 'U', 'N', N, KL+KU,
$ AFB, LDAFB, WORK )
IF( RPVGRW.EQ.ZERO ) THEN
RPVGRW = ONE
ELSE
RPVGRW = SLANGB( 'M', N, KL, KU, A,
$ LDA, WORK ) / RPVGRW
END IF
END IF
RESULT( 7 ) = ABS( RPVGRW-WORK( 1 ) ) /
$ MAX( WORK( 1 ), RPVGRW ) /
$ SLAMCH( 'E' )
*
IF( .NOT.PREFAC ) THEN
*
* Reconstruct matrix from factors and
* compute residual.
*
CALL SGBT01( N, N, KL, KU, A, LDA, AFB,
$ LDAFB, IWORK, WORK,
$ RESULT( 1 ) )
K1 = 1
ELSE
K1 = 2
END IF
*
IF( INFO.EQ.0 ) THEN
TRFCON = .FALSE.
*
* Compute residual of the computed solution.
*
CALL SLACPY( 'Full', N, NRHS, BSAV, LDB,
$ WORK, LDB )
CALL SGBT02( TRANS, N, N, KL, KU, NRHS,
$ ASAV, LDA, X, LDB, WORK, LDB,
$ RESULT( 2 ) )
*
* Check solution from generated exact
* solution.
*
IF( NOFACT .OR. ( PREFAC .AND.
$ LSAME( EQUED, 'N' ) ) ) THEN
CALL SGET04( N, NRHS, X, LDB, XACT,
$ LDB, RCONDC, RESULT( 3 ) )
ELSE
IF( ITRAN.EQ.1 ) THEN
ROLDC = ROLDO
ELSE
ROLDC = ROLDI
END IF
CALL SGET04( N, NRHS, X, LDB, XACT,
$ LDB, ROLDC, RESULT( 3 ) )
END IF
*
* Check the error bounds from iterative
* refinement.
*
CALL SGBT05( TRANS, N, KL, KU, NRHS, ASAV,
$ LDA, B, LDB, X, LDB, XACT,
$ LDB, RWORK, RWORK( NRHS+1 ),
$ RESULT( 4 ) )
ELSE
TRFCON = .TRUE.
END IF
*
* Compare RCOND from SGBSVX with the computed
* value in RCONDC.
*
RESULT( 6 ) = SGET06( RCOND, RCONDC )
*
* Print information about the tests that did
* not pass the threshold.
*
IF( .NOT.TRFCON ) THEN
DO 80 K = K1, NTESTS
IF( RESULT( K ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
IF( PREFAC ) THEN
WRITE( NOUT, FMT = 9995 )
$ 'SGBSVX', FACT, TRANS, N, KL,
$ KU, EQUED, IMAT, K,
$ RESULT( K )
ELSE
WRITE( NOUT, FMT = 9996 )
$ 'SGBSVX', FACT, TRANS, N, KL,
$ KU, IMAT, K, RESULT( K )
END IF
NFAIL = NFAIL + 1
END IF
80 CONTINUE
NRUN = NRUN + 7 - K1
ELSE
IF( RESULT( 1 ).GE.THRESH .AND. .NOT.
$ PREFAC ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
IF( PREFAC ) THEN
WRITE( NOUT, FMT = 9995 )'SGBSVX',
$ FACT, TRANS, N, KL, KU, EQUED,
$ IMAT, 1, RESULT( 1 )
ELSE
WRITE( NOUT, FMT = 9996 )'SGBSVX',
$ FACT, TRANS, N, KL, KU, IMAT, 1,
$ RESULT( 1 )
END IF
NFAIL = NFAIL + 1
NRUN = NRUN + 1
END IF
IF( RESULT( 6 ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
IF( PREFAC ) THEN
WRITE( NOUT, FMT = 9995 )'SGBSVX',
$ FACT, TRANS, N, KL, KU, EQUED,
$ IMAT, 6, RESULT( 6 )
ELSE
WRITE( NOUT, FMT = 9996 )'SGBSVX',
$ FACT, TRANS, N, KL, KU, IMAT, 6,
$ RESULT( 6 )
END IF
NFAIL = NFAIL + 1
NRUN = NRUN + 1
END IF
IF( RESULT( 7 ).GE.THRESH ) THEN
IF( NFAIL.EQ.0 .AND. NERRS.EQ.0 )
$ CALL ALADHD( NOUT, PATH )
IF( PREFAC ) THEN
WRITE( NOUT, FMT = 9995 )'SGBSVX',
$ FACT, TRANS, N, KL, KU, EQUED,
$ IMAT, 7, RESULT( 7 )
ELSE
WRITE( NOUT, FMT = 9996 )'SGBSVX',
$ FACT, TRANS, N, KL, KU, IMAT, 7,
$ RESULT( 7 )
END IF
NFAIL = NFAIL + 1
NRUN = NRUN + 1
END IF
*
END IF
90 CONTINUE
100 CONTINUE
110 CONTINUE
120 CONTINUE
130 CONTINUE
140 CONTINUE
150 CONTINUE
*
* Print a summary of the results.
*
CALL ALASVM( PATH, NOUT, NFAIL, NRUN, NERRS )
*
9999 FORMAT( ' *** In SDRVGB, LA=', I5, ' is too small for N=', I5,
$ ', KU=', I5, ', KL=', I5, / ' ==> Increase LA to at least ',
$ I5 )
9998 FORMAT( ' *** In SDRVGB, LAFB=', I5, ' is too small for N=', I5,
$ ', KU=', I5, ', KL=', I5, /
$ ' ==> Increase LAFB to at least ', I5 )
9997 FORMAT( 1X, A6, ', N=', I5, ', KL=', I5, ', KU=', I5, ', type ',
$ I1, ', test(', I1, ')=', G12.5 )
9996 FORMAT( 1X, A6, '( ''', A1, ''',''', A1, ''',', I5, ',', I5, ',',
$ I5, ',...), type ', I1, ', test(', I1, ')=', G12.5 )
9995 FORMAT( 1X, A6, '( ''', A1, ''',''', A1, ''',', I5, ',', I5, ',',
$ I5, ',...), EQUED=''', A1, ''', type ', I1, ', test(', I1,
$ ')=', G12.5 )
*
RETURN
*
* End of SDRVGB
*
END
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?