sblat2.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 1,699 行 · 第 1/5 页
F
1,699 行
200 IF( FATAL.AND.SFATAL )
$ GO TO 220
END IF
210 CONTINUE
WRITE( NOUT, FMT = 9982 )
GO TO 240
*
220 CONTINUE
WRITE( NOUT, FMT = 9981 )
GO TO 240
*
230 CONTINUE
WRITE( NOUT, FMT = 9987 )
*
240 CONTINUE
IF( TRACE )
$ CLOSE ( NTRA )
CLOSE ( NOUT )
STOP
*
9999 FORMAT( ' ROUTINES PASS COMPUTATIONAL TESTS IF TEST RATIO IS LES',
$ 'S THAN', F8.2 )
9998 FORMAT( ' RELATIVE MACHINE PRECISION IS TAKEN TO BE', 1P, E9.1 )
9997 FORMAT( ' NUMBER OF VALUES OF ', A, ' IS LESS THAN 1 OR GREATER ',
$ 'THAN ', I2 )
9996 FORMAT( ' VALUE OF N IS LESS THAN 0 OR GREATER THAN ', I2 )
9995 FORMAT( ' VALUE OF K IS LESS THAN 0' )
9994 FORMAT( ' ABSOLUTE VALUE OF INCX OR INCY IS 0 OR GREATER THAN ',
$ I2 )
9993 FORMAT( ' TESTS OF THE REAL LEVEL 2 BLAS', //' THE F',
$ 'OLLOWING PARAMETER VALUES WILL BE USED:' )
9992 FORMAT( ' FOR N ', 9I6 )
9991 FORMAT( ' FOR K ', 7I6 )
9990 FORMAT( ' FOR INCX AND INCY ', 7I6 )
9989 FORMAT( ' FOR ALPHA ', 7F6.1 )
9988 FORMAT( ' FOR BETA ', 7F6.1 )
9987 FORMAT( ' AMEND DATA FILE OR INCREASE ARRAY SIZES IN PROGRAM',
$ /' ******* TESTS ABANDONED *******' )
9986 FORMAT( ' SUBPROGRAM NAME ', A6, ' NOT RECOGNIZED', /' ******* T',
$ 'ESTS ABANDONED *******' )
9985 FORMAT( ' ERROR IN SMVCH - IN-LINE DOT PRODUCTS ARE BEING EVALU',
$ 'ATED WRONGLY.', /' SMVCH WAS CALLED WITH TRANS = ', A1,
$ ' AND RETURNED SAME = ', L1, ' AND ERR = ', F12.3, '.', /
$ ' THIS MAY BE DUE TO FAULTS IN THE ARITHMETIC OR THE COMPILER.'
$ , /' ******* TESTS ABANDONED *******' )
9984 FORMAT( A6, L2 )
9983 FORMAT( 1X, A6, ' WAS NOT TESTED' )
9982 FORMAT( /' END OF TESTS' )
9981 FORMAT( /' ******* FATAL ERROR - TESTS ABANDONED *******' )
9980 FORMAT( ' ERROR-EXITS WILL NOT BE TESTED' )
*
* End of SBLAT2.
*
END
SUBROUTINE SCHK1( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
$ FATAL, NIDIM, IDIM, NKB, KB, NALF, ALF, NBET,
$ BET, NINC, INC, NMAX, INCMAX, A, AA, AS, X, XX,
$ XS, Y, YY, YS, YT, G )
*
* Tests SGEMV and SGBMV.
*
* Auxiliary routine for test program for Level 2 Blas.
*
* -- Written on 10-August-1987.
* Richard Hanson, Sandia National Labs.
* Jeremy Du Croz, NAG Central Office.
*
* .. Parameters ..
REAL ZERO, HALF
PARAMETER ( ZERO = 0.0, HALF = 0.5 )
* .. Scalar Arguments ..
REAL EPS, THRESH
INTEGER INCMAX, NALF, NBET, NIDIM, NINC, NKB, NMAX,
$ NOUT, NTRA
LOGICAL FATAL, REWI, TRACE
CHARACTER*6 SNAME
* .. Array Arguments ..
REAL A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
$ AS( NMAX*NMAX ), BET( NBET ), G( NMAX ),
$ X( NMAX ), XS( NMAX*INCMAX ),
$ XX( NMAX*INCMAX ), Y( NMAX ),
$ YS( NMAX*INCMAX ), YT( NMAX ),
$ YY( NMAX*INCMAX )
INTEGER IDIM( NIDIM ), INC( NINC ), KB( NKB )
* .. Local Scalars ..
REAL ALPHA, ALS, BETA, BLS, ERR, ERRMAX, TRANSL
INTEGER I, IA, IB, IC, IKU, IM, IN, INCX, INCXS, INCY,
$ INCYS, IX, IY, KL, KLS, KU, KUS, LAA, LDA,
$ LDAS, LX, LY, M, ML, MS, N, NARGS, NC, ND, NK,
$ NL, NS
LOGICAL BANDED, FULL, NULL, RESET, SAME, TRAN
CHARACTER*1 TRANS, TRANSS
CHARACTER*3 ICH
* .. Local Arrays ..
LOGICAL ISAME( 13 )
* .. External Functions ..
LOGICAL LSE, LSERES
EXTERNAL LSE, LSERES
* .. External Subroutines ..
EXTERNAL SGBMV, SGEMV, SMAKE, SMVCH
* .. Intrinsic Functions ..
INTRINSIC ABS, MAX, MIN
* .. Scalars in Common ..
INTEGER INFOT, NOUTC
LOGICAL LERR, OK
* .. Common blocks ..
COMMON /INFOC/INFOT, NOUTC, OK, LERR
* .. Data statements ..
DATA ICH/'NTC'/
* .. Executable Statements ..
FULL = SNAME( 3: 3 ).EQ.'E'
BANDED = SNAME( 3: 3 ).EQ.'B'
* Define the number of arguments.
IF( FULL )THEN
NARGS = 11
ELSE IF( BANDED )THEN
NARGS = 13
END IF
*
NC = 0
RESET = .TRUE.
ERRMAX = ZERO
*
DO 120 IN = 1, NIDIM
N = IDIM( IN )
ND = N/2 + 1
*
DO 110 IM = 1, 2
IF( IM.EQ.1 )
$ M = MAX( N - ND, 0 )
IF( IM.EQ.2 )
$ M = MIN( N + ND, NMAX )
*
IF( BANDED )THEN
NK = NKB
ELSE
NK = 1
END IF
DO 100 IKU = 1, NK
IF( BANDED )THEN
KU = KB( IKU )
KL = MAX( KU - 1, 0 )
ELSE
KU = N - 1
KL = M - 1
END IF
* Set LDA to 1 more than minimum value if room.
IF( BANDED )THEN
LDA = KL + KU + 1
ELSE
LDA = M
END IF
IF( LDA.LT.NMAX )
$ LDA = LDA + 1
* Skip tests if not enough room.
IF( LDA.GT.NMAX )
$ GO TO 100
LAA = LDA*N
NULL = N.LE.0.OR.M.LE.0
*
* Generate the matrix A.
*
TRANSL = ZERO
CALL SMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX, AA,
$ LDA, KL, KU, RESET, TRANSL )
*
DO 90 IC = 1, 3
TRANS = ICH( IC: IC )
TRAN = TRANS.EQ.'T'.OR.TRANS.EQ.'C'
*
IF( TRAN )THEN
ML = N
NL = M
ELSE
ML = M
NL = N
END IF
*
DO 80 IX = 1, NINC
INCX = INC( IX )
LX = ABS( INCX )*NL
*
* Generate the vector X.
*
TRANSL = HALF
CALL SMAKE( 'GE', ' ', ' ', 1, NL, X, 1, XX,
$ ABS( INCX ), 0, NL - 1, RESET, TRANSL )
IF( NL.GT.1 )THEN
X( NL/2 ) = ZERO
XX( 1 + ABS( INCX )*( NL/2 - 1 ) ) = ZERO
END IF
*
DO 70 IY = 1, NINC
INCY = INC( IY )
LY = ABS( INCY )*ML
*
DO 60 IA = 1, NALF
ALPHA = ALF( IA )
*
DO 50 IB = 1, NBET
BETA = BET( IB )
*
* Generate the vector Y.
*
TRANSL = ZERO
CALL SMAKE( 'GE', ' ', ' ', 1, ML, Y, 1,
$ YY, ABS( INCY ), 0, ML - 1,
$ RESET, TRANSL )
*
NC = NC + 1
*
* Save every datum before calling the
* subroutine.
*
TRANSS = TRANS
MS = M
NS = N
KLS = KL
KUS = KU
ALS = ALPHA
DO 10 I = 1, LAA
AS( I ) = AA( I )
10 CONTINUE
LDAS = LDA
DO 20 I = 1, LX
XS( I ) = XX( I )
20 CONTINUE
INCXS = INCX
BLS = BETA
DO 30 I = 1, LY
YS( I ) = YY( I )
30 CONTINUE
INCYS = INCY
*
* Call the subroutine.
*
IF( FULL )THEN
IF( TRACE )
$ WRITE( NTRA, FMT = 9994 )NC, SNAME,
$ TRANS, M, N, ALPHA, LDA, INCX, BETA,
$ INCY
IF( REWI )
$ REWIND NTRA
CALL SGEMV( TRANS, M, N, ALPHA, AA,
$ LDA, XX, INCX, BETA, YY,
$ INCY )
ELSE IF( BANDED )THEN
IF( TRACE )
$ WRITE( NTRA, FMT = 9995 )NC, SNAME,
$ TRANS, M, N, KL, KU, ALPHA, LDA,
$ INCX, BETA, INCY
IF( REWI )
$ REWIND NTRA
CALL SGBMV( TRANS, M, N, KL, KU, ALPHA,
$ AA, LDA, XX, INCX, BETA,
$ YY, INCY )
END IF
*
* Check if error-exit was taken incorrectly.
*
IF( .NOT.OK )THEN
WRITE( NOUT, FMT = 9993 )
FATAL = .TRUE.
GO TO 130
END IF
*
* See what data changed inside subroutines.
*
ISAME( 1 ) = TRANS.EQ.TRANSS
ISAME( 2 ) = MS.EQ.M
ISAME( 3 ) = NS.EQ.N
IF( FULL )THEN
ISAME( 4 ) = ALS.EQ.ALPHA
ISAME( 5 ) = LSE( AS, AA, LAA )
ISAME( 6 ) = LDAS.EQ.LDA
ISAME( 7 ) = LSE( XS, XX, LX )
ISAME( 8 ) = INCXS.EQ.INCX
ISAME( 9 ) = BLS.EQ.BETA
IF( NULL )THEN
ISAME( 10 ) = LSE( YS, YY, LY )
ELSE
ISAME( 10 ) = LSERES( 'GE', ' ', 1,
$ ML, YS, YY,
$ ABS( INCY ) )
END IF
ISAME( 11 ) = INCYS.EQ.INCY
ELSE IF( BANDED )THEN
ISAME( 4 ) = KLS.EQ.KL
ISAME( 5 ) = KUS.EQ.KU
ISAME( 6 ) = ALS.EQ.ALPHA
ISAME( 7 ) = LSE( AS, AA, LAA )
ISAME( 8 ) = LDAS.EQ.LDA
ISAME( 9 ) = LSE( XS, XX, LX )
ISAME( 10 ) = INCXS.EQ.INCX
ISAME( 11 ) = BLS.EQ.BETA
IF( NULL )THEN
ISAME( 12 ) = LSE( YS, YY, LY )
ELSE
ISAME( 12 ) = LSERES( 'GE', ' ', 1,
$ ML, YS, YY,
$ ABS( INCY ) )
END IF
ISAME( 13 ) = INCYS.EQ.INCY
END IF
*
* If data was incorrectly changed, report
* and return.
*
SAME = .TRUE.
DO 40 I = 1, NARGS
SAME = SAME.AND.ISAME( I )
IF( .NOT.ISAME( I ) )
$ WRITE( NOUT, FMT = 9998 )I
40 CONTINUE
IF( .NOT.SAME )THEN
FATAL = .TRUE.
GO TO 130
END IF
*
IF( .NOT.NULL )THEN
*
* Check the result.
*
CALL SMVCH( TRANS, M, N, ALPHA, A,
$ NMAX, X, INCX, BETA, Y,
$ INCY, YT, G, YY, EPS, ERR,
$ FATAL, NOUT, .TRUE. )
ERRMAX = MAX( ERRMAX, ERR )
* If got really bad answer, report and
* return.
IF( FATAL )
$ GO TO 130
ELSE
* Avoid repeating tests with M.le.0 or
* N.le.0.
GO TO 110
END IF
*
50 CONTINUE
*
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?