3246
3247
3248
3249
3250
3251
3252
3253
3254
3255 REAL ZERO, ONE
3256 parameter( zero = 0.0d0, one = 1.0d0 )
3257
3258 REAL ALPHA, BETA, EPS, ERR
3259 INTEGER KK, LDA, LDB, LDC, LDCC, N, NOUT
3260 LOGICAL FATAL, MV
3261 CHARACTER*1 UPLO, TRANSA, TRANSB
3262
3263 REAL A( LDA, * ), B( LDB, * ), C( LDC, * ),
3264 $ CC( LDCC, * ), CT( * ), G( * )
3265
3266 REAL ERRI
3267 INTEGER I, J, K, ISTART, ISTOP
3268 LOGICAL TRANA, TRANB, UPPER
3269
3270 INTRINSIC abs, max, sqrt
3271
3272 upper = uplo.EQ.'U'
3273 trana = transa.EQ.'T'.OR.transa.EQ.'C'
3274 tranb = transb.EQ.'T'.OR.transb.EQ.'C'
3275
3276
3277
3278
3279
3280 istart = 1
3281 istop = n
3282
3283 DO 120 j = 1, n
3284
3285 IF ( upper ) THEN
3286 istart = 1
3287 istop = j
3288 ELSE
3289 istart = j
3290 istop = n
3291 END IF
3292 DO 10 i = istart, istop
3293 ct( i ) = zero
3294 g( i ) = zero
3295 10 CONTINUE
3296 IF( .NOT.trana.AND..NOT.tranb )THEN
3297 DO 30 k = 1, kk
3298 DO 20 i = istart, istop
3299 ct( i ) = ct( i ) + a( i, k )*b( k, j )
3300 g( i ) = g( i ) + abs( a( i, k ) )*abs( b( k, j ) )
3301 20 CONTINUE
3302 30 CONTINUE
3303 ELSE IF( trana.AND..NOT.tranb )THEN
3304 DO 50 k = 1, kk
3305 DO 40 i = istart, istop
3306 ct( i ) = ct( i ) + a( k, i )*b( k, j )
3307 g( i ) = g( i ) + abs( a( k, i ) )*abs( b( k, j ) )
3308 40 CONTINUE
3309 50 CONTINUE
3310 ELSE IF( .NOT.trana.AND.tranb )THEN
3311 DO 70 k = 1, kk
3312 DO 60 i = istart, istop
3313 ct( i ) = ct( i ) + a( i, k )*b( j, k )
3314 g( i ) = g( i ) + abs( a( i, k ) )*abs( b( j, k ) )
3315 60 CONTINUE
3316 70 CONTINUE
3317 ELSE IF( trana.AND.tranb )THEN
3318 DO 90 k = 1, kk
3319 DO 80 i = istart, istop
3320 ct( i ) = ct( i ) + a( k, i )*b( j, k )
3321 g( i ) = g( i ) + abs( a( k, i ) )*abs( b( j, k ) )
3322 80 CONTINUE
3323 90 CONTINUE
3324 END IF
3325 DO 100 i = istart, istop
3326 ct( i ) = alpha*ct( i ) + beta*c( i, j )
3327 g( i ) = abs( alpha )*g( i ) + abs( beta )*abs( c( i, j ) )
3328 100 CONTINUE
3329
3330
3331
3332 err = zero
3333 DO 110 i = istart, istop
3334 erri = abs( ct( i ) - cc( i, j ) )/eps
3335 IF( g( i ).NE.zero )
3336 $ erri = erri/g( i )
3337 err = max( err, erri )
3338 IF( err*sqrt( eps ).GE.one )
3339 $ GO TO 130
3340 110 CONTINUE
3341
3342 120 CONTINUE
3343
3344
3345 GO TO 150
3346
3347
3348
3349 130 fatal = .true.
3350 WRITE( nout, fmt = 9999 )
3351 DO 140 i = istart, istop
3352 IF( mv )THEN
3353 WRITE( nout, fmt = 9998 )i, ct( i ), cc( i, j )
3354 ELSE
3355 WRITE( nout, fmt = 9998 )i, cc( i, j ), ct( i )
3356 END IF
3357 140 CONTINUE
3358 IF( n.GT.1 )
3359 $ WRITE( nout, fmt = 9997 )j
3360
3361 150 CONTINUE
3362 RETURN
3363
3364 9999 FORMAT( ' ******* FATAL ERROR - COMPUTED RESULT IS LESS THAN HAL',
3365 $ 'F ACCURATE *******', /' EXPECTED RESULT COMPU',
3366 $ 'TED RESULT' )
3367 9998 FORMAT( 1x, i7, 2g18.6 )
3368 9997 FORMAT( ' THESE ARE THE RESULTS FOR COLUMN ', i3 )
3369
3370
3371