dblat2.f
来自「famous linear algebra library (LAPACK) p」· F 代码 · 共 1,699 行 · 第 1/5 页
F
1,699 行
Z( I ) = XX( 1 + ( I - 1 )*
$ ABS( INCX ) )
XX( 1 + ( I - 1 )*ABS( INCX ) )
$ = X( I )
50 CONTINUE
CALL DMVCH( TRANS, N, N, ONE, A, NMAX, Z,
$ INCX, ZERO, X, INCX, XT, G,
$ XX, EPS, ERR, FATAL, NOUT,
$ .FALSE. )
END IF
ERRMAX = MAX( ERRMAX, ERR )
* If got really bad answer, report and return.
IF( FATAL )
$ GO TO 120
ELSE
* Avoid repeating tests with N.le.0.
GO TO 110
END IF
*
60 CONTINUE
*
70 CONTINUE
*
80 CONTINUE
*
90 CONTINUE
*
100 CONTINUE
*
110 CONTINUE
*
* Report result.
*
IF( ERRMAX.LT.THRESH )THEN
WRITE( NOUT, FMT = 9999 )SNAME, NC
ELSE
WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
END IF
GO TO 130
*
120 CONTINUE
WRITE( NOUT, FMT = 9996 )SNAME
IF( FULL )THEN
WRITE( NOUT, FMT = 9993 )NC, SNAME, UPLO, TRANS, DIAG, N, LDA,
$ INCX
ELSE IF( BANDED )THEN
WRITE( NOUT, FMT = 9994 )NC, SNAME, UPLO, TRANS, DIAG, N, K,
$ LDA, INCX
ELSE IF( PACKED )THEN
WRITE( NOUT, FMT = 9995 )NC, SNAME, UPLO, TRANS, DIAG, N, INCX
END IF
*
130 CONTINUE
RETURN
*
9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
$ 'S)' )
9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
$ 'ANGED INCORRECTLY *******' )
9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
$ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
$ ' - SUSPECT *******' )
9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
9995 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', AP, ',
$ 'X,', I2, ') .' )
9994 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), 2( I3, ',' ),
$ ' A,', I3, ', X,', I2, ') .' )
9993 FORMAT( 1X, I6, ': ', A6, '(', 3( '''', A1, ''',' ), I3, ', A,',
$ I3, ', X,', I2, ') .' )
9992 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
$ '******' )
*
* End of DCHK3.
*
END
SUBROUTINE DCHK4( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
$ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
$ INCMAX, A, AA, AS, X, XX, XS, Y, YY, YS, YT, G,
$ Z )
*
* Tests DGER.
*
* 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 ..
DOUBLE PRECISION ZERO, HALF, ONE
PARAMETER ( ZERO = 0.0D0, HALF = 0.5D0, ONE = 1.0D0 )
* .. Scalar Arguments ..
DOUBLE PRECISION EPS, THRESH
INTEGER INCMAX, NALF, NIDIM, NINC, NMAX, NOUT, NTRA
LOGICAL FATAL, REWI, TRACE
CHARACTER*6 SNAME
* .. Array Arguments ..
DOUBLE PRECISION A( NMAX, NMAX ), AA( NMAX*NMAX ), ALF( NALF ),
$ AS( NMAX*NMAX ), G( NMAX ), X( NMAX ),
$ XS( NMAX*INCMAX ), XX( NMAX*INCMAX ),
$ Y( NMAX ), YS( NMAX*INCMAX ), YT( NMAX ),
$ YY( NMAX*INCMAX ), Z( NMAX )
INTEGER IDIM( NIDIM ), INC( NINC )
* .. Local Scalars ..
DOUBLE PRECISION ALPHA, ALS, ERR, ERRMAX, TRANSL
INTEGER I, IA, IM, IN, INCX, INCXS, INCY, INCYS, IX,
$ IY, J, LAA, LDA, LDAS, LX, LY, M, MS, N, NARGS,
$ NC, ND, NS
LOGICAL NULL, RESET, SAME
* .. Local Arrays ..
DOUBLE PRECISION W( 1 )
LOGICAL ISAME( 13 )
* .. External Functions ..
LOGICAL LDE, LDERES
EXTERNAL LDE, LDERES
* .. External Subroutines ..
EXTERNAL DGER, DMAKE, DMVCH
* .. Intrinsic Functions ..
INTRINSIC ABS, MAX, MIN
* .. Scalars in Common ..
INTEGER INFOT, NOUTC
LOGICAL LERR, OK
* .. Common blocks ..
COMMON /INFOC/INFOT, NOUTC, OK, LERR
* .. Executable Statements ..
* Define the number of arguments.
NARGS = 9
*
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 )
*
* Set LDA to 1 more than minimum value if room.
LDA = M
IF( LDA.LT.NMAX )
$ LDA = LDA + 1
* Skip tests if not enough room.
IF( LDA.GT.NMAX )
$ GO TO 110
LAA = LDA*N
NULL = N.LE.0.OR.M.LE.0
*
DO 100 IX = 1, NINC
INCX = INC( IX )
LX = ABS( INCX )*M
*
* Generate the vector X.
*
TRANSL = HALF
CALL DMAKE( 'GE', ' ', ' ', 1, M, X, 1, XX, ABS( INCX ),
$ 0, M - 1, RESET, TRANSL )
IF( M.GT.1 )THEN
X( M/2 ) = ZERO
XX( 1 + ABS( INCX )*( M/2 - 1 ) ) = ZERO
END IF
*
DO 90 IY = 1, NINC
INCY = INC( IY )
LY = ABS( INCY )*N
*
* Generate the vector Y.
*
TRANSL = ZERO
CALL DMAKE( 'GE', ' ', ' ', 1, N, Y, 1, YY,
$ ABS( INCY ), 0, N - 1, RESET, TRANSL )
IF( N.GT.1 )THEN
Y( N/2 ) = ZERO
YY( 1 + ABS( INCY )*( N/2 - 1 ) ) = ZERO
END IF
*
DO 80 IA = 1, NALF
ALPHA = ALF( IA )
*
* Generate the matrix A.
*
TRANSL = ZERO
CALL DMAKE( SNAME( 2: 3 ), ' ', ' ', M, N, A, NMAX,
$ AA, LDA, M - 1, N - 1, RESET, TRANSL )
*
NC = NC + 1
*
* Save every datum before calling the subroutine.
*
MS = M
NS = N
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
DO 30 I = 1, LY
YS( I ) = YY( I )
30 CONTINUE
INCYS = INCY
*
* Call the subroutine.
*
IF( TRACE )
$ WRITE( NTRA, FMT = 9994 )NC, SNAME, M, N,
$ ALPHA, INCX, INCY, LDA
IF( REWI )
$ REWIND NTRA
CALL DGER( M, N, ALPHA, XX, INCX, YY, INCY, AA,
$ LDA )
*
* Check if error-exit was taken incorrectly.
*
IF( .NOT.OK )THEN
WRITE( NOUT, FMT = 9993 )
FATAL = .TRUE.
GO TO 140
END IF
*
* See what data changed inside subroutine.
*
ISAME( 1 ) = MS.EQ.M
ISAME( 2 ) = NS.EQ.N
ISAME( 3 ) = ALS.EQ.ALPHA
ISAME( 4 ) = LDE( XS, XX, LX )
ISAME( 5 ) = INCXS.EQ.INCX
ISAME( 6 ) = LDE( YS, YY, LY )
ISAME( 7 ) = INCYS.EQ.INCY
IF( NULL )THEN
ISAME( 8 ) = LDE( AS, AA, LAA )
ELSE
ISAME( 8 ) = LDERES( 'GE', ' ', M, N, AS, AA,
$ LDA )
END IF
ISAME( 9 ) = LDAS.EQ.LDA
*
* 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 140
END IF
*
IF( .NOT.NULL )THEN
*
* Check the result column by column.
*
IF( INCX.GT.0 )THEN
DO 50 I = 1, M
Z( I ) = X( I )
50 CONTINUE
ELSE
DO 60 I = 1, M
Z( I ) = X( M - I + 1 )
60 CONTINUE
END IF
DO 70 J = 1, N
IF( INCY.GT.0 )THEN
W( 1 ) = Y( J )
ELSE
W( 1 ) = Y( N - J + 1 )
END IF
CALL DMVCH( 'N', M, 1, ALPHA, Z, NMAX, W, 1,
$ ONE, A( 1, J ), 1, YT, G,
$ AA( 1 + ( J - 1 )*LDA ), EPS,
$ ERR, FATAL, NOUT, .TRUE. )
ERRMAX = MAX( ERRMAX, ERR )
* If got really bad answer, report and return.
IF( FATAL )
$ GO TO 130
70 CONTINUE
ELSE
* Avoid repeating tests with M.le.0 or N.le.0.
GO TO 110
END IF
*
80 CONTINUE
*
90 CONTINUE
*
100 CONTINUE
*
110 CONTINUE
*
120 CONTINUE
*
* Report result.
*
IF( ERRMAX.LT.THRESH )THEN
WRITE( NOUT, FMT = 9999 )SNAME, NC
ELSE
WRITE( NOUT, FMT = 9997 )SNAME, NC, ERRMAX
END IF
GO TO 150
*
130 CONTINUE
WRITE( NOUT, FMT = 9995 )J
*
140 CONTINUE
WRITE( NOUT, FMT = 9996 )SNAME
WRITE( NOUT, FMT = 9994 )NC, SNAME, M, N, ALPHA, INCX, INCY, LDA
*
150 CONTINUE
RETURN
*
9999 FORMAT( ' ', A6, ' PASSED THE COMPUTATIONAL TESTS (', I6, ' CALL',
$ 'S)' )
9998 FORMAT( ' ******* FATAL ERROR - PARAMETER NUMBER ', I2, ' WAS CH',
$ 'ANGED INCORRECTLY *******' )
9997 FORMAT( ' ', A6, ' COMPLETED THE COMPUTATIONAL TESTS (', I6, ' C',
$ 'ALLS)', /' ******* BUT WITH MAXIMUM TEST RATIO', F8.2,
$ ' - SUSPECT *******' )
9996 FORMAT( ' ******* ', A6, ' FAILED ON CALL NUMBER:' )
9995 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', I3 )
9994 FORMAT( 1X, I6, ': ', A6, '(', 2( I3, ',' ), F4.1, ', X,', I2,
$ ', Y,', I2, ', A,', I3, ') .' )
9993 FORMAT( ' ******* FATAL ERROR - ERROR-EXIT TAKEN ON VALID CALL *',
$ '******' )
*
* End of DCHK4.
*
END
SUBROUTINE DCHK5( SNAME, EPS, THRESH, NOUT, NTRA, TRACE, REWI,
$ FATAL, NIDIM, IDIM, NALF, ALF, NINC, INC, NMAX,
$
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?