00001 SUBROUTINE ZDRVRF3( NOUT, NN, NVAL, THRESH, A, LDA, ARF, B1, B2,
00002 + D_WORK_ZLANGE, Z_WORK_ZGEQRF, TAU )
00003
00004
00005
00006
00007
00008
00009 INTEGER LDA, NN, NOUT
00010 DOUBLE PRECISION THRESH
00011
00012
00013 INTEGER NVAL( NN )
00014 DOUBLE PRECISION D_WORK_ZLANGE( * )
00015 COMPLEX*16 A( LDA, * ), ARF( * ), B1( LDA, * ),
00016 + B2( LDA, * )
00017 COMPLEX*16 Z_WORK_ZGEQRF( * ), TAU( * )
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 COMPLEX*16 ZERO, ONE
00064 PARAMETER ( ZERO = ( 0.0D+0, 0.0D+0 ) ,
00065 + ONE = ( 1.0D+0, 0.0D+0 ) )
00066 INTEGER NTESTS
00067 PARAMETER ( NTESTS = 1 )
00068
00069
00070 CHARACTER UPLO, CFORM, DIAG, TRANS, SIDE
00071 INTEGER I, IFORM, IIM, IIN, INFO, IUPLO, J, M, N, NA,
00072 + NFAIL, NRUN, ISIDE, IDIAG, IALPHA, ITRANS
00073 COMPLEX*16 ALPHA
00074 DOUBLE PRECISION EPS
00075
00076
00077 CHARACTER UPLOS( 2 ), FORMS( 2 ), TRANSS( 2 ),
00078 + DIAGS( 2 ), SIDES( 2 )
00079 INTEGER ISEED( 4 ), ISEEDY( 4 )
00080 DOUBLE PRECISION RESULT( NTESTS )
00081
00082
00083 DOUBLE PRECISION DLAMCH, ZLANGE
00084 COMPLEX*16 ZLARND
00085 EXTERNAL DLAMCH, ZLARND, ZLANGE
00086
00087
00088 EXTERNAL ZTRTTF, ZGEQRF, ZGEQLF, ZTFSM, ZTRSM
00089
00090
00091 INTRINSIC MAX, SQRT
00092
00093
00094 CHARACTER*32 SRNAMT
00095
00096
00097 COMMON / SRNAMC / SRNAMT
00098
00099
00100 DATA ISEEDY / 1988, 1989, 1990, 1991 /
00101 DATA UPLOS / 'U', 'L' /
00102 DATA FORMS / 'N', 'C' /
00103 DATA SIDES / 'L', 'R' /
00104 DATA TRANSS / 'N', 'C' /
00105 DATA DIAGS / 'N', 'U' /
00106
00107
00108
00109
00110
00111 NRUN = 0
00112 NFAIL = 0
00113 INFO = 0
00114 DO 10 I = 1, 4
00115 ISEED( I ) = ISEEDY( I )
00116 10 CONTINUE
00117 EPS = DLAMCH( 'Precision' )
00118
00119 DO 170 IIM = 1, NN
00120
00121 M = NVAL( IIM )
00122
00123 DO 160 IIN = 1, NN
00124
00125 N = NVAL( IIN )
00126
00127 DO 150 IFORM = 1, 2
00128
00129 CFORM = FORMS( IFORM )
00130
00131 DO 140 IUPLO = 1, 2
00132
00133 UPLO = UPLOS( IUPLO )
00134
00135 DO 130 ISIDE = 1, 2
00136
00137 SIDE = SIDES( ISIDE )
00138
00139 DO 120 ITRANS = 1, 2
00140
00141 TRANS = TRANSS( ITRANS )
00142
00143 DO 110 IDIAG = 1, 2
00144
00145 DIAG = DIAGS( IDIAG )
00146
00147 DO 100 IALPHA = 1, 3
00148
00149 IF ( IALPHA.EQ. 1) THEN
00150 ALPHA = ZERO
00151 ELSE IF ( IALPHA.EQ. 1) THEN
00152 ALPHA = ONE
00153 ELSE
00154 ALPHA = ZLARND( 4, ISEED )
00155 END IF
00156
00157
00158
00159
00160
00161
00162 NRUN = NRUN + 1
00163
00164 IF ( ISIDE.EQ.1 ) THEN
00165
00166
00167
00168
00169 NA = M
00170
00171 ELSE
00172
00173
00174
00175
00176 NA = N
00177
00178 END IF
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 DO J = 1, NA
00189 DO I = 1, NA
00190 A( I, J) = ZLARND( 4, ISEED )
00191 END DO
00192 END DO
00193
00194 IF ( IUPLO.EQ.1 ) THEN
00195
00196
00197
00198
00199 SRNAMT = 'ZGEQRF'
00200 CALL ZGEQRF( NA, NA, A, LDA, TAU,
00201 + Z_WORK_ZGEQRF, LDA,
00202 + INFO )
00203 ELSE
00204
00205
00206
00207
00208 SRNAMT = 'ZGELQF'
00209 CALL ZGELQF( NA, NA, A, LDA, TAU,
00210 + Z_WORK_ZGEQRF, LDA,
00211 + INFO )
00212 END IF
00213
00214
00215
00216
00217
00218
00219 DO J = 1, NA
00220 A( J, J) = A(J,J) * ZLARND( 5, ISEED )
00221 END DO
00222
00223
00224
00225 SRNAMT = 'ZTRTTF'
00226 CALL ZTRTTF( CFORM, UPLO, NA, A, LDA, ARF,
00227 + INFO )
00228
00229
00230
00231
00232 DO J = 1, N
00233 DO I = 1, M
00234 B1( I, J) = ZLARND( 4, ISEED )
00235 B2( I, J) = B1( I, J)
00236 END DO
00237 END DO
00238
00239
00240
00241
00242 SRNAMT = 'ZTRSM'
00243 CALL ZTRSM( SIDE, UPLO, TRANS, DIAG, M, N,
00244 + ALPHA, A, LDA, B1, LDA )
00245
00246
00247
00248
00249 SRNAMT = 'ZTFSM'
00250 CALL ZTFSM( CFORM, SIDE, UPLO, TRANS,
00251 + DIAG, M, N, ALPHA, ARF, B2,
00252 + LDA )
00253
00254
00255
00256 DO J = 1, N
00257 DO I = 1, M
00258 B1( I, J) = B2( I, J ) - B1( I, J )
00259 END DO
00260 END DO
00261
00262 RESULT(1) = ZLANGE( 'I', M, N, B1, LDA,
00263 + D_WORK_ZLANGE )
00264
00265 RESULT(1) = RESULT(1) / SQRT( EPS )
00266 + / MAX ( MAX( M, N), 1 )
00267
00268 IF( RESULT(1).GE.THRESH ) THEN
00269 IF( NFAIL.EQ.0 ) THEN
00270 WRITE( NOUT, * )
00271 WRITE( NOUT, FMT = 9999 )
00272 END IF
00273 WRITE( NOUT, FMT = 9997 ) 'ZTFSM',
00274 + CFORM, SIDE, UPLO, TRANS, DIAG, M,
00275 + N, RESULT(1)
00276 NFAIL = NFAIL + 1
00277 END IF
00278
00279 100 CONTINUE
00280 110 CONTINUE
00281 120 CONTINUE
00282 130 CONTINUE
00283 140 CONTINUE
00284 150 CONTINUE
00285 160 CONTINUE
00286 170 CONTINUE
00287
00288
00289
00290 IF ( NFAIL.EQ.0 ) THEN
00291 WRITE( NOUT, FMT = 9996 ) 'ZTFSM', NRUN
00292 ELSE
00293 WRITE( NOUT, FMT = 9995 ) 'ZTFSM', NFAIL, NRUN
00294 END IF
00295
00296 9999 FORMAT( 1X,
00297 ' *** Error(s) or Failure(s) while testing ZTFSM + ***')
00298 9997 FORMAT( 1X, ' Failure in ',A5,', CFORM=''',A1,''',',
00299 + ' SIDE=''',A1,''',',' UPLO=''',A1,''',',' TRANS=''',A1,''',',
00300 + ' DIAG=''',A1,''',',' M=',I3,', N =', I3,', test=',G12.5)
00301 9996 FORMAT( 1X, 'All tests for ',A5,' auxiliary routine passed the ',
00302 + 'threshold (',I5,' tests run)')
00303 9995 FORMAT( 1X, A6, ' auxiliary routine:',I5,' out of ',I5,
00304 + ' tests failed to pass the threshold')
00305
00306 RETURN
00307
00308
00309
00310 END